From 2dd5bc6a074165ddfbd57c4bd52c2d2dac8f47a1 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 27 Apr 2024 18:03:18 +0200 Subject: Adding upstream version 14.2. Signed-off-by: Daniel Baumann --- src/.gitignore | 89 + src/Makefile.am | 2314 ++++ src/Makefile.in | 13159 +++++++++++++++++++ src/daemon/.gitignore | 2 + src/daemon/caps.c | 99 + src/daemon/caps.h | 29 + src/daemon/cmdline.c | 420 + src/daemon/cmdline.h | 33 + src/daemon/cpulimit.c | 244 + src/daemon/cpulimit.h | 32 + src/daemon/daemon-conf.c | 872 ++ src/daemon/daemon-conf.h | 169 + src/daemon/daemon.conf.in | 97 + src/daemon/default.pa.in | 175 + src/daemon/dumpmodules.c | 154 + src/daemon/dumpmodules.h | 29 + src/daemon/esdcompat.in | 94 + src/daemon/ltdl-bind-now.c | 159 + src/daemon/ltdl-bind-now.h | 27 + src/daemon/main.c | 1247 ++ src/daemon/meson.build | 159 + src/daemon/pulseaudio-system.conf | 31 + src/daemon/pulseaudio.desktop.in | 9 + src/daemon/server-lookup.c | 492 + src/daemon/server-lookup.h | 38 + src/daemon/start-pulseaudio-x11.in | 37 + src/daemon/system.pa.in | 62 + src/daemon/systemd/user/pulseaudio.service.in | 34 + src/daemon/systemd/user/pulseaudio.socket | 11 + src/depmod.py | 70 + src/map-file | 392 + src/meson.build | 203 + src/modules/alsa/90-pulseaudio.rules | 170 + src/modules/alsa/alsa-mixer.c | 5386 ++++++++ src/modules/alsa/alsa-mixer.h | 411 + src/modules/alsa/alsa-sink.c | 2832 ++++ src/modules/alsa/alsa-sink.h | 34 + src/modules/alsa/alsa-source.c | 2473 ++++ src/modules/alsa/alsa-source.h | 34 + src/modules/alsa/alsa-ucm.c | 2396 ++++ src/modules/alsa/alsa-ucm.h | 294 + src/modules/alsa/alsa-util.c | 1891 +++ src/modules/alsa/alsa-util.h | 167 + src/modules/alsa/meson.build | 51 + src/modules/alsa/mixer/meson.build | 7 + src/modules/alsa/mixer/paths/analog-input-aux.conf | 65 + .../alsa/mixer/paths/analog-input-dock-mic.conf | 104 + src/modules/alsa/mixer/paths/analog-input-fm.conf | 65 + .../alsa/mixer/paths/analog-input-front-mic.conf | 104 + .../mixer/paths/analog-input-headphone-mic.conf | 102 + .../alsa/mixer/paths/analog-input-headset-mic.conf | 114 + .../paths/analog-input-internal-mic-always.conf | 133 + .../mixer/paths/analog-input-internal-mic.conf | 154 + .../alsa/mixer/paths/analog-input-linein.conf | 144 + .../alsa/mixer/paths/analog-input-mic-line.conf | 66 + src/modules/alsa/mixer/paths/analog-input-mic.conf | 141 + .../alsa/mixer/paths/analog-input-mic.conf.common | 60 + .../alsa/mixer/paths/analog-input-rear-mic.conf | 104 + .../alsa/mixer/paths/analog-input-tvtuner.conf | 65 + .../alsa/mixer/paths/analog-input-video.conf | 64 + src/modules/alsa/mixer/paths/analog-input.conf | 102 + .../alsa/mixer/paths/analog-input.conf.common | 289 + .../mixer/paths/analog-output-headphones-2.conf | 116 + .../alsa/mixer/paths/analog-output-headphones.conf | 174 + .../alsa/mixer/paths/analog-output-lineout.conf | 208 + .../alsa/mixer/paths/analog-output-mono.conf | 99 + .../mixer/paths/analog-output-speaker-always.conf | 181 + .../alsa/mixer/paths/analog-output-speaker.conf | 233 + src/modules/alsa/mixer/paths/analog-output.conf | 82 + .../alsa/mixer/paths/analog-output.conf.common | 186 + src/modules/alsa/mixer/paths/hdmi-output-0.conf | 12 + src/modules/alsa/mixer/paths/hdmi-output-1.conf | 12 + src/modules/alsa/mixer/paths/hdmi-output-2.conf | 12 + src/modules/alsa/mixer/paths/hdmi-output-3.conf | 12 + src/modules/alsa/mixer/paths/hdmi-output-4.conf | 12 + src/modules/alsa/mixer/paths/hdmi-output-5.conf | 12 + src/modules/alsa/mixer/paths/hdmi-output-6.conf | 12 + src/modules/alsa/mixer/paths/hdmi-output-7.conf | 12 + .../alsa/mixer/paths/iec958-stereo-input.conf | 20 + .../alsa/mixer/paths/iec958-stereo-output.conf | 18 + .../steelseries-arctis-output-chat-common.conf | 27 + .../steelseries-arctis-output-game-common.conf | 27 + .../alsa/mixer/paths/usb-gaming-headset-input.conf | 34 + .../paths/usb-gaming-headset-output-mono.conf | 34 + .../paths/usb-gaming-headset-output-stereo.conf | 32 + src/modules/alsa/mixer/profile-sets/audigy.conf | 94 + .../cmedia-high-speed-true-hdaudio.conf | 66 + src/modules/alsa/mixer/profile-sets/default.conf | 484 + .../profile-sets/dell-dock-tb16-usb-audio.conf | 55 + .../profile-sets/force-speaker-and-int-mic.conf | 153 + .../alsa/mixer/profile-sets/force-speaker.conf | 152 + .../alsa/mixer/profile-sets/kinect-audio.conf | 38 + .../mixer/profile-sets/maudio-fasttrack-pro.conf | 86 + .../profile-sets/native-instruments-audio4dj.conf | 90 + .../profile-sets/native-instruments-audio8dj.conf | 161 + .../native-instruments-korecontroller.conf | 84 + .../native-instruments-traktor-audio10.conf | 130 + .../native-instruments-traktor-audio2.conf | 53 + .../native-instruments-traktor-audio6.conf | 91 + .../native-instruments-traktorkontrol-s4.conf | 80 + .../mixer/profile-sets/sb-omni-surround-5.1.conf | 112 + .../steelseries-arctis-common-usb-audio.conf | 23 + .../mixer/profile-sets/usb-gaming-headset.conf | 64 + src/modules/alsa/module-alsa-card.c | 1115 ++ src/modules/alsa/module-alsa-sink.c | 137 + src/modules/alsa/module-alsa-source.c | 144 + src/modules/bluetooth/a2dp-codec-api.h | 98 + src/modules/bluetooth/a2dp-codec-sbc.c | 682 + src/modules/bluetooth/a2dp-codec-util.c | 56 + src/modules/bluetooth/a2dp-codec-util.h | 34 + src/modules/bluetooth/a2dp-codecs.h | 435 + src/modules/bluetooth/backend-native.c | 714 + src/modules/bluetooth/backend-ofono.c | 764 ++ src/modules/bluetooth/bluez5-util.c | 1744 +++ src/modules/bluetooth/bluez5-util.h | 185 + src/modules/bluetooth/meson.build | 33 + src/modules/bluetooth/module-bluetooth-discover.c | 76 + src/modules/bluetooth/module-bluetooth-policy.c | 517 + src/modules/bluetooth/module-bluez5-device.c | 2417 ++++ src/modules/bluetooth/module-bluez5-discover.c | 173 + src/modules/bluetooth/rtp.h | 80 + src/modules/dbus/iface-card-profile.c | 251 + src/modules/dbus/iface-card-profile.h | 48 + src/modules/dbus/iface-card.c | 612 + src/modules/dbus/iface-card.h | 43 + src/modules/dbus/iface-client.c | 459 + src/modules/dbus/iface-client.h | 43 + src/modules/dbus/iface-core.c | 2413 ++++ src/modules/dbus/iface-core.h | 50 + src/modules/dbus/iface-device-port.c | 249 + src/modules/dbus/iface-device-port.h | 48 + src/modules/dbus/iface-device.c | 1377 ++ src/modules/dbus/iface-device.h | 51 + src/modules/dbus/iface-memstats.c | 228 + src/modules/dbus/iface-memstats.h | 43 + src/modules/dbus/iface-module.c | 331 + src/modules/dbus/iface-module.h | 43 + src/modules/dbus/iface-sample.c | 520 + src/modules/dbus/iface-sample.h | 43 + src/modules/dbus/iface-stream.c | 1000 ++ src/modules/dbus/iface-stream.h | 45 + src/modules/dbus/module-dbus-protocol.c | 609 + src/modules/echo-cancel/adrian-aec.c | 287 + src/modules/echo-cancel/adrian-aec.h | 383 + src/modules/echo-cancel/adrian-aec.orc | 8 + src/modules/echo-cancel/adrian-license.txt | 17 + src/modules/echo-cancel/adrian.c | 118 + src/modules/echo-cancel/adrian.h | 30 + src/modules/echo-cancel/echo-cancel.h | 189 + src/modules/echo-cancel/meson.build | 22 + src/modules/echo-cancel/module-echo-cancel.c | 2393 ++++ src/modules/echo-cancel/null.c | 56 + src/modules/echo-cancel/speex.c | 237 + src/modules/echo-cancel/webrtc.cc | 594 + src/modules/gconf/gconf-helper.c | 133 + src/modules/gconf/module-gconf.c | 114 + src/modules/gsettings/gsettings-helper.c | 134 + src/modules/gsettings/meson.build | 38 + src/modules/gsettings/meson_post_install.py | 14 + src/modules/gsettings/module-gsettings.c | 118 + .../org.freedesktop.pulseaudio.gschema.xml | 115 + src/modules/gsettings/pulseaudio.convert | 160 + src/modules/jack/module-jack-sink.c | 525 + src/modules/jack/module-jack-source.c | 465 + src/modules/jack/module-jackdbus-detect.c | 324 + src/modules/ladspa.h | 602 + src/modules/macosx/module-bonjour-publish.c | 509 + src/modules/macosx/module-coreaudio-detect.c | 304 + src/modules/macosx/module-coreaudio-device.c | 985 ++ src/modules/meson.build | 292 + src/modules/module-allow-passthrough.c | 316 + src/modules/module-always-sink.c | 187 + src/modules/module-always-source.c | 187 + src/modules/module-augment-properties.c | 383 + src/modules/module-card-restore.c | 690 + src/modules/module-cli.c | 140 + src/modules/module-combine-sink.c | 1581 +++ src/modules/module-combine.c | 67 + src/modules/module-console-kit.c | 366 + src/modules/module-default-device-restore.c | 193 + src/modules/module-detect.c | 272 + src/modules/module-device-manager.c | 1741 +++ src/modules/module-device-restore.c | 1311 ++ src/modules/module-equalizer-sink.c | 2277 ++++ src/modules/module-esound-compat-spawnfd.c | 74 + src/modules/module-esound-compat-spawnpid.c | 71 + src/modules/module-esound-sink.c | 734 ++ src/modules/module-filter-apply.c | 879 ++ src/modules/module-filter-heuristics.c | 172 + src/modules/module-hal-detect-compat.c | 80 + src/modules/module-intended-roles.c | 442 + src/modules/module-ladspa-sink.c | 1470 +++ src/modules/module-lirc.c | 244 + src/modules/module-loopback.c | 1652 +++ src/modules/module-match.c | 301 + src/modules/module-mmkbd-evdev.c | 263 + src/modules/module-native-protocol-fd.c | 92 + src/modules/module-null-sink.c | 462 + src/modules/module-null-source.c | 301 + src/modules/module-pipe-sink.c | 617 + src/modules/module-pipe-source.c | 373 + src/modules/module-position-event-sounds.c | 179 + src/modules/module-protocol-stub.c | 489 + src/modules/module-remap-sink.c | 514 + src/modules/module-remap-source.c | 472 + src/modules/module-rescue-streams.c | 46 + src/modules/module-role-cork.c | 59 + src/modules/module-role-ducking.c | 61 + src/modules/module-rygel-media-server.c | 1134 ++ src/modules/module-sine-source.c | 333 + src/modules/module-sine.c | 209 + src/modules/module-solaris.c | 1152 ++ src/modules/module-stream-restore.c | 2417 ++++ src/modules/module-suspend-on-idle.c | 496 + src/modules/module-switch-on-connect.c | 249 + src/modules/module-switch-on-port-available.c | 630 + src/modules/module-systemd-login.c | 243 + src/modules/module-tunnel-sink-new.c | 633 + src/modules/module-tunnel-source-new.c | 627 + src/modules/module-tunnel.c | 2351 ++++ src/modules/module-udev-detect.c | 862 ++ src/modules/module-virtual-sink.c | 677 + src/modules/module-virtual-source.c | 755 ++ src/modules/module-virtual-surround-sink.c | 952 ++ src/modules/module-volume-restore.c | 81 + src/modules/module-waveout.c | 815 ++ src/modules/module-zeroconf-discover.c | 446 + src/modules/module-zeroconf-publish.c | 935 ++ src/modules/oss/meson.build | 18 + src/modules/oss/module-oss.c | 1592 +++ src/modules/oss/oss-util.c | 418 + src/modules/oss/oss-util.h | 39 + src/modules/raop/meson.build | 30 + src/modules/raop/module-raop-discover.c | 537 + src/modules/raop/module-raop-sink.c | 112 + src/modules/raop/raop-client.c | 1854 +++ src/modules/raop/raop-client.h | 86 + src/modules/raop/raop-crypto.c | 214 + src/modules/raop/raop-crypto.h | 35 + src/modules/raop/raop-packet-buffer.c | 161 + src/modules/raop/raop-packet-buffer.h | 40 + src/modules/raop/raop-sink.c | 968 ++ src/modules/raop/raop-sink.h | 33 + src/modules/raop/raop-util.c | 211 + src/modules/raop/raop-util.h | 41 + src/modules/reserve-monitor.c | 267 + src/modules/reserve-monitor.h | 71 + src/modules/reserve-wrap.c | 342 + src/modules/reserve-wrap.h | 43 + src/modules/reserve.c | 687 + src/modules/reserve.h | 88 + src/modules/rtp/headerlist.c | 173 + src/modules/rtp/headerlist.h | 44 + src/modules/rtp/meson.build | 35 + src/modules/rtp/module-rtp-recv.c | 774 ++ src/modules/rtp/module-rtp-send.c | 547 + src/modules/rtp/rtp-common.c | 97 + src/modules/rtp/rtp-gstreamer.c | 665 + src/modules/rtp/rtp-native.c | 404 + src/modules/rtp/rtp.h | 56 + src/modules/rtp/rtsp_client.c | 643 + src/modules/rtp/rtsp_client.h | 83 + src/modules/rtp/sap.c | 235 + src/modules/rtp/sap.h | 44 + src/modules/rtp/sdp.c | 256 + src/modules/rtp/sdp.h | 48 + src/modules/stdin-util.c | 279 + src/modules/stdin-util.h | 85 + src/modules/stream-interaction.c | 683 + src/modules/stream-interaction.h | 21 + src/modules/udev-util.c | 302 + src/modules/udev-util.h | 28 + src/modules/x11/module-x11-bell.c | 193 + src/modules/x11/module-x11-cork-request.c | 191 + src/modules/x11/module-x11-publish.c | 250 + src/modules/x11/module-x11-xsmp.c | 266 + src/pulse/.gitignore | 1 + src/pulse/cdecl.h | 40 + src/pulse/channelmap.c | 833 ++ src/pulse/channelmap.h | 368 + src/pulse/client-conf-x11.c | 117 + src/pulse/client-conf-x11.h | 29 + src/pulse/client-conf.c | 240 + src/pulse/client-conf.h | 61 + src/pulse/client.conf.in | 35 + src/pulse/context.c | 1650 +++ src/pulse/context.h | 295 + src/pulse/def.h | 1104 ++ src/pulse/direction.c | 44 + src/pulse/direction.h | 35 + src/pulse/error.c | 76 + src/pulse/error.h | 37 + src/pulse/ext-device-manager.c | 434 + src/pulse/ext-device-manager.h | 130 + src/pulse/ext-device-restore.c | 373 + src/pulse/ext-device-restore.h | 110 + src/pulse/ext-stream-restore.c | 361 + src/pulse/ext-stream-restore.h | 109 + src/pulse/fork-detect.c | 57 + src/pulse/fork-detect.h | 25 + src/pulse/format.c | 774 ++ src/pulse/format.h | 297 + src/pulse/gccmacro.h | 170 + src/pulse/glib-mainloop.c | 662 + src/pulse/glib-mainloop.h | 67 + src/pulse/internal.h | 323 + src/pulse/introspect.c | 2207 ++++ src/pulse/introspect.h | 829 ++ src/pulse/json.c | 614 + src/pulse/json.h | 53 + src/pulse/mainloop-api.c | 75 + src/pulse/mainloop-api.h | 131 + src/pulse/mainloop-signal.c | 224 + src/pulse/mainloop-signal.h | 64 + src/pulse/mainloop.c | 976 ++ src/pulse/mainloop.h | 134 + src/pulse/meson.build | 134 + src/pulse/operation.c | 154 + src/pulse/operation.h | 64 + src/pulse/proplist.c | 704 + src/pulse/proplist.h | 411 + src/pulse/pulseaudio.h | 180 + src/pulse/rtclock.c | 36 + src/pulse/rtclock.h | 38 + src/pulse/sample.c | 285 + src/pulse/sample.h | 364 + src/pulse/scache.c | 272 + src/pulse/scache.h | 125 + src/pulse/simple.c | 512 + src/pulse/simple.h | 161 + src/pulse/stream.c | 2927 +++++ src/pulse/stream.h | 808 ++ src/pulse/subscribe.c | 88 + src/pulse/subscribe.h | 83 + src/pulse/thread-mainloop.c | 301 + src/pulse/thread-mainloop.h | 329 + src/pulse/timeval.c | 211 + src/pulse/timeval.h | 87 + src/pulse/utf8.c | 287 + src/pulse/utf8.h | 54 + src/pulse/util.c | 520 + src/pulse/util.h | 65 + src/pulse/version.h | 70 + src/pulse/version.h.in | 70 + src/pulse/volume.c | 991 ++ src/pulse/volume.h | 442 + src/pulse/xmalloc.c | 131 + src/pulse/xmalloc.h | 105 + src/pulsecore/arpa-inet.c | 106 + src/pulsecore/arpa-inet.h | 21 + src/pulsecore/asyncmsgq.c | 358 + src/pulsecore/asyncmsgq.h | 81 + src/pulsecore/asyncq.c | 320 + src/pulsecore/asyncq.h | 64 + src/pulsecore/atomic.h | 683 + src/pulsecore/aupdate.c | 135 + src/pulsecore/aupdate.h | 100 + src/pulsecore/auth-cookie.c | 139 + src/pulsecore/auth-cookie.h | 34 + src/pulsecore/authkey.c | 208 + src/pulsecore/authkey.h | 29 + src/pulsecore/avahi-wrap.c | 193 + src/pulsecore/avahi-wrap.h | 30 + src/pulsecore/bitset.c | 65 + src/pulsecore/bitset.h | 35 + src/pulsecore/card.c | 425 + src/pulsecore/card.h | 147 + src/pulsecore/cli-command.c | 2249 ++++ src/pulsecore/cli-command.h | 44 + src/pulsecore/cli-text.c | 704 + src/pulsecore/cli-text.h | 39 + src/pulsecore/cli.c | 176 + src/pulsecore/cli.h | 40 + src/pulsecore/client.c | 168 + src/pulsecore/client.h | 83 + src/pulsecore/conf-parser.c | 394 + src/pulsecore/conf-parser.h | 87 + src/pulsecore/core-error.c | 78 + src/pulsecore/core-error.h | 39 + src/pulsecore/core-format.c | 164 + src/pulsecore/core-format.h | 59 + src/pulsecore/core-rtclock.c | 267 + src/pulsecore/core-rtclock.h | 53 + src/pulsecore/core-scache.c | 521 + src/pulsecore/core-scache.h | 68 + src/pulsecore/core-subscribe.c | 262 + src/pulsecore/core-subscribe.h | 37 + src/pulsecore/core-util.c | 3637 +++++ src/pulsecore/core-util.h | 323 + src/pulsecore/core.c | 632 + src/pulsecore/core.h | 287 + src/pulsecore/cpu-arm.c | 170 + src/pulsecore/cpu-arm.h | 53 + src/pulsecore/cpu-orc.c | 39 + src/pulsecore/cpu-orc.h | 31 + src/pulsecore/cpu-x86.c | 132 + src/pulsecore/cpu-x86.h | 59 + src/pulsecore/cpu.c | 38 + src/pulsecore/cpu.h | 49 + src/pulsecore/creds.h | 64 + src/pulsecore/database-gdbm.c | 244 + src/pulsecore/database-simple.c | 495 + src/pulsecore/database-tdb.c | 250 + src/pulsecore/database.c | 107 + src/pulsecore/database.h | 80 + src/pulsecore/dbus-shared.c | 102 + src/pulsecore/dbus-shared.h | 40 + src/pulsecore/dbus-util.c | 778 ++ src/pulsecore/dbus-util.h | 114 + src/pulsecore/device-port.c | 303 + src/pulsecore/device-port.h | 100 + src/pulsecore/dllmain.c | 53 + src/pulsecore/dynarray.c | 165 + src/pulsecore/dynarray.h | 73 + src/pulsecore/endianmacros.h | 160 + src/pulsecore/esound.h | 204 + src/pulsecore/fdsem.c | 320 + src/pulsecore/fdsem.h | 53 + src/pulsecore/ffmpeg/avcodec.h | 81 + src/pulsecore/ffmpeg/dsputil.h | 1 + src/pulsecore/ffmpeg/resample2.c | 298 + src/pulsecore/filter/LICENSE.WEBKIT | 27 + src/pulsecore/filter/biquad.c | 117 + src/pulsecore/filter/biquad.h | 45 + src/pulsecore/filter/crossover.c | 97 + src/pulsecore/filter/crossover.h | 29 + src/pulsecore/filter/lfe-filter.c | 201 + src/pulsecore/filter/lfe-filter.h | 39 + src/pulsecore/flist.c | 177 + src/pulsecore/flist.h | 70 + src/pulsecore/g711.c | 2531 ++++ src/pulsecore/g711.h | 40 + src/pulsecore/hashmap.c | 342 + src/pulsecore/hashmap.h | 101 + src/pulsecore/hook-list.c | 129 + src/pulsecore/hook-list.h | 71 + src/pulsecore/i18n.c | 37 + src/pulsecore/i18n.h | 62 + src/pulsecore/idxset.c | 471 + src/pulsecore/idxset.h | 116 + src/pulsecore/iochannel.c | 541 + src/pulsecore/iochannel.h | 89 + src/pulsecore/ioline.c | 463 + src/pulsecore/ioline.h | 63 + src/pulsecore/ipacl.c | 238 + src/pulsecore/ipacl.h | 30 + src/pulsecore/llist.h | 111 + src/pulsecore/lock-autospawn.c | 362 + src/pulsecore/lock-autospawn.h | 30 + src/pulsecore/log.c | 685 + src/pulsecore/log.h | 155 + src/pulsecore/ltdl-helper.c | 63 + src/pulsecore/ltdl-helper.h | 29 + src/pulsecore/macro.h | 272 + src/pulsecore/mcalign.c | 216 + src/pulsecore/mcalign.h | 81 + src/pulsecore/mem.h | 60 + src/pulsecore/memblock.c | 1518 +++ src/pulsecore/memblock.h | 159 + src/pulsecore/memblockq.c | 1019 ++ src/pulsecore/memblockq.h | 187 + src/pulsecore/memchunk.c | 121 + src/pulsecore/memchunk.h | 56 + src/pulsecore/memfd-wrappers.h | 69 + src/pulsecore/memtrap.c | 242 + src/pulsecore/memtrap.h | 49 + src/pulsecore/meson.build | 286 + src/pulsecore/message-handler.c | 104 + src/pulsecore/message-handler.h | 50 + src/pulsecore/mime-type.c | 179 + src/pulsecore/mime-type.h | 31 + src/pulsecore/mix.c | 726 + src/pulsecore/mix.h | 62 + src/pulsecore/mix_neon.c | 223 + src/pulsecore/modargs.c | 546 + src/pulsecore/modargs.h | 98 + src/pulsecore/modinfo.c | 97 + src/pulsecore/modinfo.h | 44 + src/pulsecore/module.c | 415 + src/pulsecore/module.h | 129 + src/pulsecore/msgobject.c | 45 + src/pulsecore/msgobject.h | 46 + src/pulsecore/mutex-posix.c | 162 + src/pulsecore/mutex-win32.c | 154 + src/pulsecore/mutex.h | 57 + src/pulsecore/namereg.c | 227 + src/pulsecore/namereg.h | 43 + src/pulsecore/native-common.c | 78 + src/pulsecore/native-common.h | 209 + src/pulsecore/object.c | 70 + src/pulsecore/object.h | 117 + src/pulsecore/once.c | 75 + src/pulsecore/once.h | 71 + src/pulsecore/packet.c | 122 + src/pulsecore/packet.h | 45 + src/pulsecore/parseaddr.c | 156 + src/pulsecore/parseaddr.h | 46 + src/pulsecore/pdispatch.c | 475 + src/pulsecore/pdispatch.h | 56 + src/pulsecore/pid.c | 398 + src/pulsecore/pid.h | 28 + src/pulsecore/pipe.c | 155 + src/pulsecore/pipe.h | 29 + src/pulsecore/play-memblockq.c | 283 + src/pulsecore/play-memblockq.h | 47 + src/pulsecore/play-memchunk.c | 62 + src/pulsecore/play-memchunk.h | 36 + src/pulsecore/poll-posix.c | 235 + src/pulsecore/poll-win32.c | 646 + src/pulsecore/poll.h | 62 + src/pulsecore/proplist-util.c | 276 + src/pulsecore/proplist-util.h | 28 + src/pulsecore/protocol-cli.c | 140 + src/pulsecore/protocol-cli.h | 36 + src/pulsecore/protocol-dbus.c | 1140 ++ src/pulsecore/protocol-dbus.h | 215 + src/pulsecore/protocol-esound.c | 1734 +++ src/pulsecore/protocol-esound.h | 56 + src/pulsecore/protocol-http.c | 817 ++ src/pulsecore/protocol-http.h | 41 + src/pulsecore/protocol-native.c | 5514 ++++++++ src/pulsecore/protocol-native.h | 88 + src/pulsecore/protocol-simple.c | 770 ++ src/pulsecore/protocol-simple.h | 55 + src/pulsecore/pstream-util.c | 198 + src/pulsecore/pstream-util.h | 39 + src/pulsecore/pstream.c | 1290 ++ src/pulsecore/pstream.h | 76 + src/pulsecore/queue.c | 122 + src/pulsecore/queue.h | 41 + src/pulsecore/random.c | 129 + src/pulsecore/random.h | 29 + src/pulsecore/ratelimit.c | 74 + src/pulsecore/ratelimit.h | 55 + src/pulsecore/refcnt.h | 79 + src/pulsecore/remap.c | 626 + src/pulsecore/remap.h | 60 + src/pulsecore/remap_mmx.c | 155 + src/pulsecore/remap_neon.c | 545 + src/pulsecore/remap_sse.c | 153 + src/pulsecore/resampler.c | 1507 +++ src/pulsecore/resampler.h | 181 + src/pulsecore/resampler/ffmpeg.c | 132 + src/pulsecore/resampler/libsamplerate.c | 100 + src/pulsecore/resampler/peaks.c | 161 + src/pulsecore/resampler/soxr.c | 168 + src/pulsecore/resampler/speex.c | 178 + src/pulsecore/resampler/trivial.c | 100 + src/pulsecore/rtkit.c | 313 + src/pulsecore/rtkit.h | 79 + src/pulsecore/rtpoll.c | 631 + src/pulsecore/rtpoll.h | 100 + src/pulsecore/sample-util.c | 405 + src/pulsecore/sample-util.h | 154 + src/pulsecore/sconv-s16be.c | 81 + src/pulsecore/sconv-s16be.h | 67 + src/pulsecore/sconv-s16le.c | 439 + src/pulsecore/sconv-s16le.h | 67 + src/pulsecore/sconv.c | 296 + src/pulsecore/sconv.h | 41 + src/pulsecore/sconv_neon.c | 96 + src/pulsecore/sconv_sse.c | 177 + src/pulsecore/semaphore-osx.c | 92 + src/pulsecore/semaphore-posix.c | 87 + src/pulsecore/semaphore-win32.c | 60 + src/pulsecore/semaphore.h | 46 + src/pulsecore/shared.c | 116 + src/pulsecore/shared.h | 55 + src/pulsecore/shm.c | 495 + src/pulsecore/shm.h | 61 + src/pulsecore/sink-input.c | 2449 ++++ src/pulsecore/sink-input.h | 469 + src/pulsecore/sink.c | 3996 ++++++ src/pulsecore/sink.h | 575 + src/pulsecore/sioman.c | 37 + src/pulsecore/sioman.h | 26 + src/pulsecore/sndfile-util.c | 461 + src/pulsecore/sndfile-util.h | 50 + src/pulsecore/socket-client.c | 563 + src/pulsecore/socket-client.h | 48 + src/pulsecore/socket-server.c | 613 + src/pulsecore/socket-server.h | 53 + src/pulsecore/socket-util.c | 338 + src/pulsecore/socket-util.h | 44 + src/pulsecore/socket.h | 20 + src/pulsecore/sound-file-stream.c | 339 + src/pulsecore/sound-file-stream.h | 27 + src/pulsecore/sound-file.c | 163 + src/pulsecore/sound-file.h | 31 + src/pulsecore/source-output.c | 1912 +++ src/pulsecore/source-output.h | 410 + src/pulsecore/source.c | 3052 +++++ src/pulsecore/source.h | 493 + src/pulsecore/srbchannel.c | 379 + src/pulsecore/srbchannel.h | 57 + src/pulsecore/start-child.c | 113 + src/pulsecore/start-child.h | 28 + src/pulsecore/strbuf.c | 193 + src/pulsecore/strbuf.h | 40 + src/pulsecore/stream-util.c | 84 + src/pulsecore/stream-util.h | 48 + src/pulsecore/strlist.c | 171 + src/pulsecore/strlist.h | 54 + src/pulsecore/svolume.orc | 84 + src/pulsecore/svolume_arm.c | 167 + src/pulsecore/svolume_c.c | 271 + src/pulsecore/svolume_mmx.c | 252 + src/pulsecore/svolume_orc.c | 50 + src/pulsecore/svolume_sse.c | 263 + src/pulsecore/tagstruct.c | 800 ++ src/pulsecore/tagstruct.h | 106 + src/pulsecore/thread-mq.c | 223 + src/pulsecore/thread-mq.h | 57 + src/pulsecore/thread-posix.c | 254 + src/pulsecore/thread-win32.c | 240 + src/pulsecore/thread.h | 117 + src/pulsecore/time-smoother.c | 524 + src/pulsecore/time-smoother.h | 57 + src/pulsecore/tokenizer.c | 82 + src/pulsecore/tokenizer.h | 30 + src/pulsecore/typedefs.h | 37 + src/pulsecore/usergroup.c | 362 + src/pulsecore/usergroup.h | 49 + src/pulsecore/winerrno.h | 89 + src/pulsecore/x11prop.c | 145 + src/pulsecore/x11prop.h | 32 + src/pulsecore/x11wrap.c | 305 + src/pulsecore/x11wrap.h | 60 + src/tests/alsa-mixer-path-test.c | 120 + src/tests/alsa-time-test.c | 251 + src/tests/asyncmsgq-test.c | 125 + src/tests/asyncq-test.c | 107 + src/tests/atomic-test.c | 135 + src/tests/channelmap-test.c | 58 + src/tests/close-test.c | 20 + src/tests/connect-stress.c | 235 + src/tests/core-util-test.c | 284 + src/tests/cpu-mix-test.c | 224 + src/tests/cpu-remap-test.c | 540 + src/tests/cpu-sconv-test.c | 263 + src/tests/cpu-volume-test.c | 247 + src/tests/cpulimit-test.c | 110 + src/tests/extended-test.c | 222 + src/tests/flist-test.c | 101 + src/tests/format-test.c | 169 + src/tests/get-binary-name-test.c | 74 + src/tests/gtk-test.c | 83 + src/tests/hashmap-test.c | 260 + src/tests/hook-list-test.c | 61 + src/tests/interpol-test.c | 294 + src/tests/ipacl-test.c | 116 + src/tests/json-test.c | 284 + src/tests/lfe-filter-test.c | 196 + src/tests/lo-latency-test.c | 188 + src/tests/lo-test-util.c | 324 + src/tests/lo-test-util.h | 55 + src/tests/lock-autospawn-test.c | 129 + src/tests/mainloop-test.c | 140 + src/tests/mcalign-test.c | 106 + src/tests/memblock-test.c | 199 + src/tests/memblockq-test.c | 661 + src/tests/meson.build | 253 + src/tests/mix-test.c | 362 + src/tests/mult-s16-test.c | 114 + src/tests/once-test.c | 149 + src/tests/pacat-simple.c | 114 + src/tests/parec-simple.c | 94 + src/tests/passthrough-test.c | 347 + src/tests/proplist-test.c | 119 + src/tests/queue-test.c | 83 + src/tests/remix-test.c | 110 + src/tests/resampler-test.c | 479 + src/tests/rtpoll-test.c | 106 + src/tests/rtstutter.c | 128 + src/tests/runtime-test-util.h | 56 + src/tests/sig2str-test.c | 127 + src/tests/sigbus-test.c | 92 + src/tests/smoother-test.c | 104 + src/tests/srbchannel-test.c | 145 + src/tests/stripnul.c | 71 + src/tests/strlist-test.c | 70 + src/tests/sync-playback.c | 219 + src/tests/test-daemon.meson.sh | 9 + src/tests/thread-mainloop-test.c | 117 + src/tests/thread-test.c | 164 + src/tests/usergroup-test.c | 167 + src/tests/utf8-test.c | 72 + src/tests/volume-test.c | 173 + src/utils/meson.build | 117 + src/utils/pa-info | 78 + src/utils/pacat.c | 1251 ++ src/utils/pacmd.c | 359 + src/utils/pactl.c | 2165 +++ src/utils/padsp.c | 2747 ++++ src/utils/padsp.in | 84 + src/utils/pasuspender.c | 343 + src/utils/pax11publish.c | 220 + src/utils/qpaeq | 574 + 698 files changed, 243376 insertions(+) create mode 100644 src/.gitignore create mode 100644 src/Makefile.am create mode 100644 src/Makefile.in create mode 100644 src/daemon/.gitignore create mode 100644 src/daemon/caps.c create mode 100644 src/daemon/caps.h create mode 100644 src/daemon/cmdline.c create mode 100644 src/daemon/cmdline.h create mode 100644 src/daemon/cpulimit.c create mode 100644 src/daemon/cpulimit.h create mode 100644 src/daemon/daemon-conf.c create mode 100644 src/daemon/daemon-conf.h create mode 100644 src/daemon/daemon.conf.in create mode 100755 src/daemon/default.pa.in create mode 100644 src/daemon/dumpmodules.c create mode 100644 src/daemon/dumpmodules.h create mode 100755 src/daemon/esdcompat.in create mode 100644 src/daemon/ltdl-bind-now.c create mode 100644 src/daemon/ltdl-bind-now.h create mode 100644 src/daemon/main.c create mode 100644 src/daemon/meson.build create mode 100644 src/daemon/pulseaudio-system.conf create mode 100644 src/daemon/pulseaudio.desktop.in create mode 100644 src/daemon/server-lookup.c create mode 100644 src/daemon/server-lookup.h create mode 100755 src/daemon/start-pulseaudio-x11.in create mode 100755 src/daemon/system.pa.in create mode 100644 src/daemon/systemd/user/pulseaudio.service.in create mode 100644 src/daemon/systemd/user/pulseaudio.socket create mode 100755 src/depmod.py create mode 100644 src/map-file create mode 100644 src/meson.build create mode 100644 src/modules/alsa/90-pulseaudio.rules create mode 100644 src/modules/alsa/alsa-mixer.c create mode 100644 src/modules/alsa/alsa-mixer.h create mode 100644 src/modules/alsa/alsa-sink.c create mode 100644 src/modules/alsa/alsa-sink.h create mode 100644 src/modules/alsa/alsa-source.c create mode 100644 src/modules/alsa/alsa-source.h create mode 100644 src/modules/alsa/alsa-ucm.c create mode 100644 src/modules/alsa/alsa-ucm.h create mode 100644 src/modules/alsa/alsa-util.c create mode 100644 src/modules/alsa/alsa-util.h create mode 100644 src/modules/alsa/meson.build create mode 100644 src/modules/alsa/mixer/meson.build create mode 100644 src/modules/alsa/mixer/paths/analog-input-aux.conf create mode 100644 src/modules/alsa/mixer/paths/analog-input-dock-mic.conf create mode 100644 src/modules/alsa/mixer/paths/analog-input-fm.conf create mode 100644 src/modules/alsa/mixer/paths/analog-input-front-mic.conf create mode 100644 src/modules/alsa/mixer/paths/analog-input-headphone-mic.conf create mode 100644 src/modules/alsa/mixer/paths/analog-input-headset-mic.conf create mode 100644 src/modules/alsa/mixer/paths/analog-input-internal-mic-always.conf create mode 100644 src/modules/alsa/mixer/paths/analog-input-internal-mic.conf create mode 100644 src/modules/alsa/mixer/paths/analog-input-linein.conf create mode 100644 src/modules/alsa/mixer/paths/analog-input-mic-line.conf create mode 100644 src/modules/alsa/mixer/paths/analog-input-mic.conf create mode 100644 src/modules/alsa/mixer/paths/analog-input-mic.conf.common create mode 100644 src/modules/alsa/mixer/paths/analog-input-rear-mic.conf create mode 100644 src/modules/alsa/mixer/paths/analog-input-tvtuner.conf create mode 100644 src/modules/alsa/mixer/paths/analog-input-video.conf create mode 100644 src/modules/alsa/mixer/paths/analog-input.conf create mode 100644 src/modules/alsa/mixer/paths/analog-input.conf.common create mode 100644 src/modules/alsa/mixer/paths/analog-output-headphones-2.conf create mode 100644 src/modules/alsa/mixer/paths/analog-output-headphones.conf create mode 100644 src/modules/alsa/mixer/paths/analog-output-lineout.conf create mode 100644 src/modules/alsa/mixer/paths/analog-output-mono.conf create mode 100644 src/modules/alsa/mixer/paths/analog-output-speaker-always.conf create mode 100644 src/modules/alsa/mixer/paths/analog-output-speaker.conf create mode 100644 src/modules/alsa/mixer/paths/analog-output.conf create mode 100644 src/modules/alsa/mixer/paths/analog-output.conf.common create mode 100644 src/modules/alsa/mixer/paths/hdmi-output-0.conf create mode 100644 src/modules/alsa/mixer/paths/hdmi-output-1.conf create mode 100644 src/modules/alsa/mixer/paths/hdmi-output-2.conf create mode 100644 src/modules/alsa/mixer/paths/hdmi-output-3.conf create mode 100644 src/modules/alsa/mixer/paths/hdmi-output-4.conf create mode 100644 src/modules/alsa/mixer/paths/hdmi-output-5.conf create mode 100644 src/modules/alsa/mixer/paths/hdmi-output-6.conf create mode 100644 src/modules/alsa/mixer/paths/hdmi-output-7.conf create mode 100644 src/modules/alsa/mixer/paths/iec958-stereo-input.conf create mode 100644 src/modules/alsa/mixer/paths/iec958-stereo-output.conf create mode 100644 src/modules/alsa/mixer/paths/steelseries-arctis-output-chat-common.conf create mode 100644 src/modules/alsa/mixer/paths/steelseries-arctis-output-game-common.conf create mode 100644 src/modules/alsa/mixer/paths/usb-gaming-headset-input.conf create mode 100644 src/modules/alsa/mixer/paths/usb-gaming-headset-output-mono.conf create mode 100644 src/modules/alsa/mixer/paths/usb-gaming-headset-output-stereo.conf create mode 100644 src/modules/alsa/mixer/profile-sets/audigy.conf create mode 100644 src/modules/alsa/mixer/profile-sets/cmedia-high-speed-true-hdaudio.conf create mode 100644 src/modules/alsa/mixer/profile-sets/default.conf create mode 100644 src/modules/alsa/mixer/profile-sets/dell-dock-tb16-usb-audio.conf create mode 100644 src/modules/alsa/mixer/profile-sets/force-speaker-and-int-mic.conf create mode 100644 src/modules/alsa/mixer/profile-sets/force-speaker.conf create mode 100644 src/modules/alsa/mixer/profile-sets/kinect-audio.conf create mode 100644 src/modules/alsa/mixer/profile-sets/maudio-fasttrack-pro.conf create mode 100644 src/modules/alsa/mixer/profile-sets/native-instruments-audio4dj.conf create mode 100644 src/modules/alsa/mixer/profile-sets/native-instruments-audio8dj.conf create mode 100644 src/modules/alsa/mixer/profile-sets/native-instruments-korecontroller.conf create mode 100644 src/modules/alsa/mixer/profile-sets/native-instruments-traktor-audio10.conf create mode 100644 src/modules/alsa/mixer/profile-sets/native-instruments-traktor-audio2.conf create mode 100644 src/modules/alsa/mixer/profile-sets/native-instruments-traktor-audio6.conf create mode 100644 src/modules/alsa/mixer/profile-sets/native-instruments-traktorkontrol-s4.conf create mode 100644 src/modules/alsa/mixer/profile-sets/sb-omni-surround-5.1.conf create mode 100644 src/modules/alsa/mixer/profile-sets/steelseries-arctis-common-usb-audio.conf create mode 100644 src/modules/alsa/mixer/profile-sets/usb-gaming-headset.conf create mode 100644 src/modules/alsa/module-alsa-card.c create mode 100644 src/modules/alsa/module-alsa-sink.c create mode 100644 src/modules/alsa/module-alsa-source.c create mode 100644 src/modules/bluetooth/a2dp-codec-api.h create mode 100644 src/modules/bluetooth/a2dp-codec-sbc.c create mode 100644 src/modules/bluetooth/a2dp-codec-util.c create mode 100644 src/modules/bluetooth/a2dp-codec-util.h create mode 100644 src/modules/bluetooth/a2dp-codecs.h create mode 100644 src/modules/bluetooth/backend-native.c create mode 100644 src/modules/bluetooth/backend-ofono.c create mode 100644 src/modules/bluetooth/bluez5-util.c create mode 100644 src/modules/bluetooth/bluez5-util.h create mode 100644 src/modules/bluetooth/meson.build create mode 100644 src/modules/bluetooth/module-bluetooth-discover.c create mode 100644 src/modules/bluetooth/module-bluetooth-policy.c create mode 100644 src/modules/bluetooth/module-bluez5-device.c create mode 100644 src/modules/bluetooth/module-bluez5-discover.c create mode 100644 src/modules/bluetooth/rtp.h create mode 100644 src/modules/dbus/iface-card-profile.c create mode 100644 src/modules/dbus/iface-card-profile.h create mode 100644 src/modules/dbus/iface-card.c create mode 100644 src/modules/dbus/iface-card.h create mode 100644 src/modules/dbus/iface-client.c create mode 100644 src/modules/dbus/iface-client.h create mode 100644 src/modules/dbus/iface-core.c create mode 100644 src/modules/dbus/iface-core.h create mode 100644 src/modules/dbus/iface-device-port.c create mode 100644 src/modules/dbus/iface-device-port.h create mode 100644 src/modules/dbus/iface-device.c create mode 100644 src/modules/dbus/iface-device.h create mode 100644 src/modules/dbus/iface-memstats.c create mode 100644 src/modules/dbus/iface-memstats.h create mode 100644 src/modules/dbus/iface-module.c create mode 100644 src/modules/dbus/iface-module.h create mode 100644 src/modules/dbus/iface-sample.c create mode 100644 src/modules/dbus/iface-sample.h create mode 100644 src/modules/dbus/iface-stream.c create mode 100644 src/modules/dbus/iface-stream.h create mode 100644 src/modules/dbus/module-dbus-protocol.c create mode 100644 src/modules/echo-cancel/adrian-aec.c create mode 100644 src/modules/echo-cancel/adrian-aec.h create mode 100644 src/modules/echo-cancel/adrian-aec.orc create mode 100644 src/modules/echo-cancel/adrian-license.txt create mode 100644 src/modules/echo-cancel/adrian.c create mode 100644 src/modules/echo-cancel/adrian.h create mode 100644 src/modules/echo-cancel/echo-cancel.h create mode 100644 src/modules/echo-cancel/meson.build create mode 100644 src/modules/echo-cancel/module-echo-cancel.c create mode 100644 src/modules/echo-cancel/null.c create mode 100644 src/modules/echo-cancel/speex.c create mode 100644 src/modules/echo-cancel/webrtc.cc create mode 100644 src/modules/gconf/gconf-helper.c create mode 100644 src/modules/gconf/module-gconf.c create mode 100644 src/modules/gsettings/gsettings-helper.c create mode 100644 src/modules/gsettings/meson.build create mode 100644 src/modules/gsettings/meson_post_install.py create mode 100644 src/modules/gsettings/module-gsettings.c create mode 100644 src/modules/gsettings/org.freedesktop.pulseaudio.gschema.xml create mode 100644 src/modules/gsettings/pulseaudio.convert create mode 100644 src/modules/jack/module-jack-sink.c create mode 100644 src/modules/jack/module-jack-source.c create mode 100644 src/modules/jack/module-jackdbus-detect.c create mode 100644 src/modules/ladspa.h create mode 100644 src/modules/macosx/module-bonjour-publish.c create mode 100644 src/modules/macosx/module-coreaudio-detect.c create mode 100644 src/modules/macosx/module-coreaudio-device.c create mode 100644 src/modules/meson.build create mode 100644 src/modules/module-allow-passthrough.c create mode 100644 src/modules/module-always-sink.c create mode 100644 src/modules/module-always-source.c create mode 100644 src/modules/module-augment-properties.c create mode 100644 src/modules/module-card-restore.c create mode 100644 src/modules/module-cli.c create mode 100644 src/modules/module-combine-sink.c create mode 100644 src/modules/module-combine.c create mode 100644 src/modules/module-console-kit.c create mode 100644 src/modules/module-default-device-restore.c create mode 100644 src/modules/module-detect.c create mode 100644 src/modules/module-device-manager.c create mode 100644 src/modules/module-device-restore.c create mode 100644 src/modules/module-equalizer-sink.c create mode 100644 src/modules/module-esound-compat-spawnfd.c create mode 100644 src/modules/module-esound-compat-spawnpid.c create mode 100644 src/modules/module-esound-sink.c create mode 100644 src/modules/module-filter-apply.c create mode 100644 src/modules/module-filter-heuristics.c create mode 100644 src/modules/module-hal-detect-compat.c create mode 100644 src/modules/module-intended-roles.c create mode 100644 src/modules/module-ladspa-sink.c create mode 100644 src/modules/module-lirc.c create mode 100644 src/modules/module-loopback.c create mode 100644 src/modules/module-match.c create mode 100644 src/modules/module-mmkbd-evdev.c create mode 100644 src/modules/module-native-protocol-fd.c create mode 100644 src/modules/module-null-sink.c create mode 100644 src/modules/module-null-source.c create mode 100644 src/modules/module-pipe-sink.c create mode 100644 src/modules/module-pipe-source.c create mode 100644 src/modules/module-position-event-sounds.c create mode 100644 src/modules/module-protocol-stub.c create mode 100644 src/modules/module-remap-sink.c create mode 100644 src/modules/module-remap-source.c create mode 100644 src/modules/module-rescue-streams.c create mode 100644 src/modules/module-role-cork.c create mode 100644 src/modules/module-role-ducking.c create mode 100644 src/modules/module-rygel-media-server.c create mode 100644 src/modules/module-sine-source.c create mode 100644 src/modules/module-sine.c create mode 100644 src/modules/module-solaris.c create mode 100644 src/modules/module-stream-restore.c create mode 100644 src/modules/module-suspend-on-idle.c create mode 100644 src/modules/module-switch-on-connect.c create mode 100644 src/modules/module-switch-on-port-available.c create mode 100644 src/modules/module-systemd-login.c create mode 100644 src/modules/module-tunnel-sink-new.c create mode 100644 src/modules/module-tunnel-source-new.c create mode 100644 src/modules/module-tunnel.c create mode 100644 src/modules/module-udev-detect.c create mode 100644 src/modules/module-virtual-sink.c create mode 100644 src/modules/module-virtual-source.c create mode 100644 src/modules/module-virtual-surround-sink.c create mode 100644 src/modules/module-volume-restore.c create mode 100644 src/modules/module-waveout.c create mode 100644 src/modules/module-zeroconf-discover.c create mode 100644 src/modules/module-zeroconf-publish.c create mode 100644 src/modules/oss/meson.build create mode 100644 src/modules/oss/module-oss.c create mode 100644 src/modules/oss/oss-util.c create mode 100644 src/modules/oss/oss-util.h create mode 100644 src/modules/raop/meson.build create mode 100644 src/modules/raop/module-raop-discover.c create mode 100644 src/modules/raop/module-raop-sink.c create mode 100644 src/modules/raop/raop-client.c create mode 100644 src/modules/raop/raop-client.h create mode 100644 src/modules/raop/raop-crypto.c create mode 100644 src/modules/raop/raop-crypto.h create mode 100644 src/modules/raop/raop-packet-buffer.c create mode 100644 src/modules/raop/raop-packet-buffer.h create mode 100644 src/modules/raop/raop-sink.c create mode 100644 src/modules/raop/raop-sink.h create mode 100644 src/modules/raop/raop-util.c create mode 100644 src/modules/raop/raop-util.h create mode 100644 src/modules/reserve-monitor.c create mode 100644 src/modules/reserve-monitor.h create mode 100644 src/modules/reserve-wrap.c create mode 100644 src/modules/reserve-wrap.h create mode 100644 src/modules/reserve.c create mode 100644 src/modules/reserve.h create mode 100644 src/modules/rtp/headerlist.c create mode 100644 src/modules/rtp/headerlist.h create mode 100644 src/modules/rtp/meson.build create mode 100644 src/modules/rtp/module-rtp-recv.c create mode 100644 src/modules/rtp/module-rtp-send.c create mode 100644 src/modules/rtp/rtp-common.c create mode 100644 src/modules/rtp/rtp-gstreamer.c create mode 100644 src/modules/rtp/rtp-native.c create mode 100644 src/modules/rtp/rtp.h create mode 100644 src/modules/rtp/rtsp_client.c create mode 100644 src/modules/rtp/rtsp_client.h create mode 100644 src/modules/rtp/sap.c create mode 100644 src/modules/rtp/sap.h create mode 100644 src/modules/rtp/sdp.c create mode 100644 src/modules/rtp/sdp.h create mode 100644 src/modules/stdin-util.c create mode 100644 src/modules/stdin-util.h create mode 100644 src/modules/stream-interaction.c create mode 100644 src/modules/stream-interaction.h create mode 100644 src/modules/udev-util.c create mode 100644 src/modules/udev-util.h create mode 100644 src/modules/x11/module-x11-bell.c create mode 100644 src/modules/x11/module-x11-cork-request.c create mode 100644 src/modules/x11/module-x11-publish.c create mode 100644 src/modules/x11/module-x11-xsmp.c create mode 100644 src/pulse/.gitignore create mode 100644 src/pulse/cdecl.h create mode 100644 src/pulse/channelmap.c create mode 100644 src/pulse/channelmap.h create mode 100644 src/pulse/client-conf-x11.c create mode 100644 src/pulse/client-conf-x11.h create mode 100644 src/pulse/client-conf.c create mode 100644 src/pulse/client-conf.h create mode 100644 src/pulse/client.conf.in create mode 100644 src/pulse/context.c create mode 100644 src/pulse/context.h create mode 100644 src/pulse/def.h create mode 100644 src/pulse/direction.c create mode 100644 src/pulse/direction.h create mode 100644 src/pulse/error.c create mode 100644 src/pulse/error.h create mode 100644 src/pulse/ext-device-manager.c create mode 100644 src/pulse/ext-device-manager.h create mode 100644 src/pulse/ext-device-restore.c create mode 100644 src/pulse/ext-device-restore.h create mode 100644 src/pulse/ext-stream-restore.c create mode 100644 src/pulse/ext-stream-restore.h create mode 100644 src/pulse/fork-detect.c create mode 100644 src/pulse/fork-detect.h create mode 100644 src/pulse/format.c create mode 100644 src/pulse/format.h create mode 100644 src/pulse/gccmacro.h create mode 100644 src/pulse/glib-mainloop.c create mode 100644 src/pulse/glib-mainloop.h create mode 100644 src/pulse/internal.h create mode 100644 src/pulse/introspect.c create mode 100644 src/pulse/introspect.h create mode 100644 src/pulse/json.c create mode 100644 src/pulse/json.h create mode 100644 src/pulse/mainloop-api.c create mode 100644 src/pulse/mainloop-api.h create mode 100644 src/pulse/mainloop-signal.c create mode 100644 src/pulse/mainloop-signal.h create mode 100644 src/pulse/mainloop.c create mode 100644 src/pulse/mainloop.h create mode 100644 src/pulse/meson.build create mode 100644 src/pulse/operation.c create mode 100644 src/pulse/operation.h create mode 100644 src/pulse/proplist.c create mode 100644 src/pulse/proplist.h create mode 100644 src/pulse/pulseaudio.h create mode 100644 src/pulse/rtclock.c create mode 100644 src/pulse/rtclock.h create mode 100644 src/pulse/sample.c create mode 100644 src/pulse/sample.h create mode 100644 src/pulse/scache.c create mode 100644 src/pulse/scache.h create mode 100644 src/pulse/simple.c create mode 100644 src/pulse/simple.h create mode 100644 src/pulse/stream.c create mode 100644 src/pulse/stream.h create mode 100644 src/pulse/subscribe.c create mode 100644 src/pulse/subscribe.h create mode 100644 src/pulse/thread-mainloop.c create mode 100644 src/pulse/thread-mainloop.h create mode 100644 src/pulse/timeval.c create mode 100644 src/pulse/timeval.h create mode 100644 src/pulse/utf8.c create mode 100644 src/pulse/utf8.h create mode 100644 src/pulse/util.c create mode 100644 src/pulse/util.h create mode 100644 src/pulse/version.h create mode 100644 src/pulse/version.h.in create mode 100644 src/pulse/volume.c create mode 100644 src/pulse/volume.h create mode 100644 src/pulse/xmalloc.c create mode 100644 src/pulse/xmalloc.h create mode 100644 src/pulsecore/arpa-inet.c create mode 100644 src/pulsecore/arpa-inet.h create mode 100644 src/pulsecore/asyncmsgq.c create mode 100644 src/pulsecore/asyncmsgq.h create mode 100644 src/pulsecore/asyncq.c create mode 100644 src/pulsecore/asyncq.h create mode 100644 src/pulsecore/atomic.h create mode 100644 src/pulsecore/aupdate.c create mode 100644 src/pulsecore/aupdate.h create mode 100644 src/pulsecore/auth-cookie.c create mode 100644 src/pulsecore/auth-cookie.h create mode 100644 src/pulsecore/authkey.c create mode 100644 src/pulsecore/authkey.h create mode 100644 src/pulsecore/avahi-wrap.c create mode 100644 src/pulsecore/avahi-wrap.h create mode 100644 src/pulsecore/bitset.c create mode 100644 src/pulsecore/bitset.h create mode 100644 src/pulsecore/card.c create mode 100644 src/pulsecore/card.h create mode 100644 src/pulsecore/cli-command.c create mode 100644 src/pulsecore/cli-command.h create mode 100644 src/pulsecore/cli-text.c create mode 100644 src/pulsecore/cli-text.h create mode 100644 src/pulsecore/cli.c create mode 100644 src/pulsecore/cli.h create mode 100644 src/pulsecore/client.c create mode 100644 src/pulsecore/client.h create mode 100644 src/pulsecore/conf-parser.c create mode 100644 src/pulsecore/conf-parser.h create mode 100644 src/pulsecore/core-error.c create mode 100644 src/pulsecore/core-error.h create mode 100644 src/pulsecore/core-format.c create mode 100644 src/pulsecore/core-format.h create mode 100644 src/pulsecore/core-rtclock.c create mode 100644 src/pulsecore/core-rtclock.h create mode 100644 src/pulsecore/core-scache.c create mode 100644 src/pulsecore/core-scache.h create mode 100644 src/pulsecore/core-subscribe.c create mode 100644 src/pulsecore/core-subscribe.h create mode 100644 src/pulsecore/core-util.c create mode 100644 src/pulsecore/core-util.h create mode 100644 src/pulsecore/core.c create mode 100644 src/pulsecore/core.h create mode 100644 src/pulsecore/cpu-arm.c create mode 100644 src/pulsecore/cpu-arm.h create mode 100644 src/pulsecore/cpu-orc.c create mode 100644 src/pulsecore/cpu-orc.h create mode 100644 src/pulsecore/cpu-x86.c create mode 100644 src/pulsecore/cpu-x86.h create mode 100644 src/pulsecore/cpu.c create mode 100644 src/pulsecore/cpu.h create mode 100644 src/pulsecore/creds.h create mode 100644 src/pulsecore/database-gdbm.c create mode 100644 src/pulsecore/database-simple.c create mode 100644 src/pulsecore/database-tdb.c create mode 100644 src/pulsecore/database.c create mode 100644 src/pulsecore/database.h create mode 100644 src/pulsecore/dbus-shared.c create mode 100644 src/pulsecore/dbus-shared.h create mode 100644 src/pulsecore/dbus-util.c create mode 100644 src/pulsecore/dbus-util.h create mode 100644 src/pulsecore/device-port.c create mode 100644 src/pulsecore/device-port.h create mode 100644 src/pulsecore/dllmain.c create mode 100644 src/pulsecore/dynarray.c create mode 100644 src/pulsecore/dynarray.h create mode 100644 src/pulsecore/endianmacros.h create mode 100644 src/pulsecore/esound.h create mode 100644 src/pulsecore/fdsem.c create mode 100644 src/pulsecore/fdsem.h create mode 100644 src/pulsecore/ffmpeg/avcodec.h create mode 100644 src/pulsecore/ffmpeg/dsputil.h create mode 100644 src/pulsecore/ffmpeg/resample2.c create mode 100644 src/pulsecore/filter/LICENSE.WEBKIT create mode 100644 src/pulsecore/filter/biquad.c create mode 100644 src/pulsecore/filter/biquad.h create mode 100644 src/pulsecore/filter/crossover.c create mode 100644 src/pulsecore/filter/crossover.h create mode 100644 src/pulsecore/filter/lfe-filter.c create mode 100644 src/pulsecore/filter/lfe-filter.h create mode 100644 src/pulsecore/flist.c create mode 100644 src/pulsecore/flist.h create mode 100644 src/pulsecore/g711.c create mode 100644 src/pulsecore/g711.h create mode 100644 src/pulsecore/hashmap.c create mode 100644 src/pulsecore/hashmap.h create mode 100644 src/pulsecore/hook-list.c create mode 100644 src/pulsecore/hook-list.h create mode 100644 src/pulsecore/i18n.c create mode 100644 src/pulsecore/i18n.h create mode 100644 src/pulsecore/idxset.c create mode 100644 src/pulsecore/idxset.h create mode 100644 src/pulsecore/iochannel.c create mode 100644 src/pulsecore/iochannel.h create mode 100644 src/pulsecore/ioline.c create mode 100644 src/pulsecore/ioline.h create mode 100644 src/pulsecore/ipacl.c create mode 100644 src/pulsecore/ipacl.h create mode 100644 src/pulsecore/llist.h create mode 100644 src/pulsecore/lock-autospawn.c create mode 100644 src/pulsecore/lock-autospawn.h create mode 100644 src/pulsecore/log.c create mode 100644 src/pulsecore/log.h create mode 100644 src/pulsecore/ltdl-helper.c create mode 100644 src/pulsecore/ltdl-helper.h create mode 100644 src/pulsecore/macro.h create mode 100644 src/pulsecore/mcalign.c create mode 100644 src/pulsecore/mcalign.h create mode 100644 src/pulsecore/mem.h create mode 100644 src/pulsecore/memblock.c create mode 100644 src/pulsecore/memblock.h create mode 100644 src/pulsecore/memblockq.c create mode 100644 src/pulsecore/memblockq.h create mode 100644 src/pulsecore/memchunk.c create mode 100644 src/pulsecore/memchunk.h create mode 100644 src/pulsecore/memfd-wrappers.h create mode 100644 src/pulsecore/memtrap.c create mode 100644 src/pulsecore/memtrap.h create mode 100644 src/pulsecore/meson.build create mode 100644 src/pulsecore/message-handler.c create mode 100644 src/pulsecore/message-handler.h create mode 100644 src/pulsecore/mime-type.c create mode 100644 src/pulsecore/mime-type.h create mode 100644 src/pulsecore/mix.c create mode 100644 src/pulsecore/mix.h create mode 100644 src/pulsecore/mix_neon.c create mode 100644 src/pulsecore/modargs.c create mode 100644 src/pulsecore/modargs.h create mode 100644 src/pulsecore/modinfo.c create mode 100644 src/pulsecore/modinfo.h create mode 100644 src/pulsecore/module.c create mode 100644 src/pulsecore/module.h create mode 100644 src/pulsecore/msgobject.c create mode 100644 src/pulsecore/msgobject.h create mode 100644 src/pulsecore/mutex-posix.c create mode 100644 src/pulsecore/mutex-win32.c create mode 100644 src/pulsecore/mutex.h create mode 100644 src/pulsecore/namereg.c create mode 100644 src/pulsecore/namereg.h create mode 100644 src/pulsecore/native-common.c create mode 100644 src/pulsecore/native-common.h create mode 100644 src/pulsecore/object.c create mode 100644 src/pulsecore/object.h create mode 100644 src/pulsecore/once.c create mode 100644 src/pulsecore/once.h create mode 100644 src/pulsecore/packet.c create mode 100644 src/pulsecore/packet.h create mode 100644 src/pulsecore/parseaddr.c create mode 100644 src/pulsecore/parseaddr.h create mode 100644 src/pulsecore/pdispatch.c create mode 100644 src/pulsecore/pdispatch.h create mode 100644 src/pulsecore/pid.c create mode 100644 src/pulsecore/pid.h create mode 100644 src/pulsecore/pipe.c create mode 100644 src/pulsecore/pipe.h create mode 100644 src/pulsecore/play-memblockq.c create mode 100644 src/pulsecore/play-memblockq.h create mode 100644 src/pulsecore/play-memchunk.c create mode 100644 src/pulsecore/play-memchunk.h create mode 100644 src/pulsecore/poll-posix.c create mode 100644 src/pulsecore/poll-win32.c create mode 100644 src/pulsecore/poll.h create mode 100644 src/pulsecore/proplist-util.c create mode 100644 src/pulsecore/proplist-util.h create mode 100644 src/pulsecore/protocol-cli.c create mode 100644 src/pulsecore/protocol-cli.h create mode 100644 src/pulsecore/protocol-dbus.c create mode 100644 src/pulsecore/protocol-dbus.h create mode 100644 src/pulsecore/protocol-esound.c create mode 100644 src/pulsecore/protocol-esound.h create mode 100644 src/pulsecore/protocol-http.c create mode 100644 src/pulsecore/protocol-http.h create mode 100644 src/pulsecore/protocol-native.c create mode 100644 src/pulsecore/protocol-native.h create mode 100644 src/pulsecore/protocol-simple.c create mode 100644 src/pulsecore/protocol-simple.h create mode 100644 src/pulsecore/pstream-util.c create mode 100644 src/pulsecore/pstream-util.h create mode 100644 src/pulsecore/pstream.c create mode 100644 src/pulsecore/pstream.h create mode 100644 src/pulsecore/queue.c create mode 100644 src/pulsecore/queue.h create mode 100644 src/pulsecore/random.c create mode 100644 src/pulsecore/random.h create mode 100644 src/pulsecore/ratelimit.c create mode 100644 src/pulsecore/ratelimit.h create mode 100644 src/pulsecore/refcnt.h create mode 100644 src/pulsecore/remap.c create mode 100644 src/pulsecore/remap.h create mode 100644 src/pulsecore/remap_mmx.c create mode 100644 src/pulsecore/remap_neon.c create mode 100644 src/pulsecore/remap_sse.c create mode 100644 src/pulsecore/resampler.c create mode 100644 src/pulsecore/resampler.h create mode 100644 src/pulsecore/resampler/ffmpeg.c create mode 100644 src/pulsecore/resampler/libsamplerate.c create mode 100644 src/pulsecore/resampler/peaks.c create mode 100644 src/pulsecore/resampler/soxr.c create mode 100644 src/pulsecore/resampler/speex.c create mode 100644 src/pulsecore/resampler/trivial.c create mode 100644 src/pulsecore/rtkit.c create mode 100644 src/pulsecore/rtkit.h create mode 100644 src/pulsecore/rtpoll.c create mode 100644 src/pulsecore/rtpoll.h create mode 100644 src/pulsecore/sample-util.c create mode 100644 src/pulsecore/sample-util.h create mode 100644 src/pulsecore/sconv-s16be.c create mode 100644 src/pulsecore/sconv-s16be.h create mode 100644 src/pulsecore/sconv-s16le.c create mode 100644 src/pulsecore/sconv-s16le.h create mode 100644 src/pulsecore/sconv.c create mode 100644 src/pulsecore/sconv.h create mode 100644 src/pulsecore/sconv_neon.c create mode 100644 src/pulsecore/sconv_sse.c create mode 100644 src/pulsecore/semaphore-osx.c create mode 100644 src/pulsecore/semaphore-posix.c create mode 100644 src/pulsecore/semaphore-win32.c create mode 100644 src/pulsecore/semaphore.h create mode 100644 src/pulsecore/shared.c create mode 100644 src/pulsecore/shared.h create mode 100644 src/pulsecore/shm.c create mode 100644 src/pulsecore/shm.h create mode 100644 src/pulsecore/sink-input.c create mode 100644 src/pulsecore/sink-input.h create mode 100644 src/pulsecore/sink.c create mode 100644 src/pulsecore/sink.h create mode 100644 src/pulsecore/sioman.c create mode 100644 src/pulsecore/sioman.h create mode 100644 src/pulsecore/sndfile-util.c create mode 100644 src/pulsecore/sndfile-util.h create mode 100644 src/pulsecore/socket-client.c create mode 100644 src/pulsecore/socket-client.h create mode 100644 src/pulsecore/socket-server.c create mode 100644 src/pulsecore/socket-server.h create mode 100644 src/pulsecore/socket-util.c create mode 100644 src/pulsecore/socket-util.h create mode 100644 src/pulsecore/socket.h create mode 100644 src/pulsecore/sound-file-stream.c create mode 100644 src/pulsecore/sound-file-stream.h create mode 100644 src/pulsecore/sound-file.c create mode 100644 src/pulsecore/sound-file.h create mode 100644 src/pulsecore/source-output.c create mode 100644 src/pulsecore/source-output.h create mode 100644 src/pulsecore/source.c create mode 100644 src/pulsecore/source.h create mode 100644 src/pulsecore/srbchannel.c create mode 100644 src/pulsecore/srbchannel.h create mode 100644 src/pulsecore/start-child.c create mode 100644 src/pulsecore/start-child.h create mode 100644 src/pulsecore/strbuf.c create mode 100644 src/pulsecore/strbuf.h create mode 100644 src/pulsecore/stream-util.c create mode 100644 src/pulsecore/stream-util.h create mode 100644 src/pulsecore/strlist.c create mode 100644 src/pulsecore/strlist.h create mode 100644 src/pulsecore/svolume.orc create mode 100644 src/pulsecore/svolume_arm.c create mode 100644 src/pulsecore/svolume_c.c create mode 100644 src/pulsecore/svolume_mmx.c create mode 100644 src/pulsecore/svolume_orc.c create mode 100644 src/pulsecore/svolume_sse.c create mode 100644 src/pulsecore/tagstruct.c create mode 100644 src/pulsecore/tagstruct.h create mode 100644 src/pulsecore/thread-mq.c create mode 100644 src/pulsecore/thread-mq.h create mode 100644 src/pulsecore/thread-posix.c create mode 100644 src/pulsecore/thread-win32.c create mode 100644 src/pulsecore/thread.h create mode 100644 src/pulsecore/time-smoother.c create mode 100644 src/pulsecore/time-smoother.h create mode 100644 src/pulsecore/tokenizer.c create mode 100644 src/pulsecore/tokenizer.h create mode 100644 src/pulsecore/typedefs.h create mode 100644 src/pulsecore/usergroup.c create mode 100644 src/pulsecore/usergroup.h create mode 100644 src/pulsecore/winerrno.h create mode 100644 src/pulsecore/x11prop.c create mode 100644 src/pulsecore/x11prop.h create mode 100644 src/pulsecore/x11wrap.c create mode 100644 src/pulsecore/x11wrap.h create mode 100644 src/tests/alsa-mixer-path-test.c create mode 100644 src/tests/alsa-time-test.c create mode 100644 src/tests/asyncmsgq-test.c create mode 100644 src/tests/asyncq-test.c create mode 100644 src/tests/atomic-test.c create mode 100644 src/tests/channelmap-test.c create mode 100644 src/tests/close-test.c create mode 100644 src/tests/connect-stress.c create mode 100644 src/tests/core-util-test.c create mode 100644 src/tests/cpu-mix-test.c create mode 100644 src/tests/cpu-remap-test.c create mode 100644 src/tests/cpu-sconv-test.c create mode 100644 src/tests/cpu-volume-test.c create mode 100644 src/tests/cpulimit-test.c create mode 100644 src/tests/extended-test.c create mode 100644 src/tests/flist-test.c create mode 100644 src/tests/format-test.c create mode 100644 src/tests/get-binary-name-test.c create mode 100644 src/tests/gtk-test.c create mode 100644 src/tests/hashmap-test.c create mode 100644 src/tests/hook-list-test.c create mode 100644 src/tests/interpol-test.c create mode 100644 src/tests/ipacl-test.c create mode 100644 src/tests/json-test.c create mode 100644 src/tests/lfe-filter-test.c create mode 100644 src/tests/lo-latency-test.c create mode 100644 src/tests/lo-test-util.c create mode 100644 src/tests/lo-test-util.h create mode 100644 src/tests/lock-autospawn-test.c create mode 100644 src/tests/mainloop-test.c create mode 100644 src/tests/mcalign-test.c create mode 100644 src/tests/memblock-test.c create mode 100644 src/tests/memblockq-test.c create mode 100644 src/tests/meson.build create mode 100644 src/tests/mix-test.c create mode 100644 src/tests/mult-s16-test.c create mode 100644 src/tests/once-test.c create mode 100644 src/tests/pacat-simple.c create mode 100644 src/tests/parec-simple.c create mode 100644 src/tests/passthrough-test.c create mode 100644 src/tests/proplist-test.c create mode 100644 src/tests/queue-test.c create mode 100644 src/tests/remix-test.c create mode 100644 src/tests/resampler-test.c create mode 100644 src/tests/rtpoll-test.c create mode 100644 src/tests/rtstutter.c create mode 100644 src/tests/runtime-test-util.h create mode 100644 src/tests/sig2str-test.c create mode 100644 src/tests/sigbus-test.c create mode 100644 src/tests/smoother-test.c create mode 100644 src/tests/srbchannel-test.c create mode 100644 src/tests/stripnul.c create mode 100644 src/tests/strlist-test.c create mode 100644 src/tests/sync-playback.c create mode 100644 src/tests/test-daemon.meson.sh create mode 100644 src/tests/thread-mainloop-test.c create mode 100644 src/tests/thread-test.c create mode 100644 src/tests/usergroup-test.c create mode 100644 src/tests/utf8-test.c create mode 100644 src/tests/volume-test.c create mode 100644 src/utils/meson.build create mode 100755 src/utils/pa-info create mode 100644 src/utils/pacat.c create mode 100644 src/utils/pacmd.c create mode 100644 src/utils/pactl.c create mode 100644 src/utils/padsp.c create mode 100755 src/utils/padsp.in create mode 100644 src/utils/pasuspender.c create mode 100644 src/utils/pax11publish.c create mode 100755 src/utils/qpaeq (limited to 'src') diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 0000000..3197482 --- /dev/null +++ b/src/.gitignore @@ -0,0 +1,89 @@ +TAGS +*.lo +*.o +*.la +*.gcno +*.trs +*.log +.deps +.libs +/Makefile +/Makefile.in +client.conf +daemon.conf +default.pa +echo-cancel-test +esdcompat +gconf-helper +gsettings-helper +org.freedesktop.pulseaudio.gschema.valid +pacat +pacmd +pactl +padsp +paplay +pasuspender +pax11publish +pulseaudio +pulseaudio.service +start-pulseaudio-x11 +*-orc-gen.[ch] +# tests +alsa-mixer-path-test +alsa-time-test +asyncmsgq-test +asyncq-test +atomic-test +channelmap-test +close-test +connect-stress +core-util-test +cpulimit-test +cpulimit-test2 +cpu-sconv-test +cpu-remap-test +cpu-mix-test +cpu-volume-test +extended-test +flist-test +format-test +get-binary-name-test +gtk-test +hashmap-test +hook-list-test +interpol-test +ipacl-test +json-test +lfe-filter-test +lock-autospawn-test +lo-latency-test +mainloop-test +mainloop-test-glib +mcalign-test +memblockq-test +memblock-test +mix-test +once-test +pacat-simple +parec-simple +passthrough-test +proplist-test +queue-test +remix-test +resampler-test +rtpoll-test +rtstutter +sig2str-test +sigbus-test +smoother-test +srbchannel-test +stripnul +strlist-test +sync-playback +system.pa +thread-mainloop-test +thread-test +usergroup-test +utf8-test +volume-test +mult-s16-test diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..454b644 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,2314 @@ +# This file is part of PulseAudio. +# +# Copyright 2004-2006 Lennart Poettering +# Copyright 2006 Pierre Ossman for Cendio AB +# Copyright 2006 Diego Pettenò +# +# PulseAudio 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 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +################################### +# Extra directories # +################################### + +pulseincludedir=$(includedir)/pulse +pulsecoreincludedir=$(includedir)/pulsecore +pulselibexecdir=$(libexecdir)/pulse +if HAVE_X11 +xdgautostartdir=$(sysconfdir)/xdg/autostart +endif +if HAVE_ALSA +alsaprofilesetsdir=$(alsadatadir)/profile-sets +alsapathsdir=$(alsadatadir)/paths +endif +if HAVE_DBUS +dbuspolicydir=$(sysconfdir)/dbus-1/system.d +endif +if HAVE_GSETTINGS +gsettingsdataconvertdir=$(datadir)/GConf/gsettings +endif + +################################### +# Compiler/linker flags # +################################### + +AM_CPPFLAGS = \ + -I$(top_srcdir)/src \ + -I$(top_srcdir)/src/modules \ + -I$(top_builddir)/src/modules \ + -DPA_ALSA_PATHS_DIR=\"$(alsapathsdir)\" \ + -DPA_ALSA_PROFILE_SETS_DIR=\"$(alsaprofilesetsdir)\" \ + -DPA_SRCDIR=\"$(abs_srcdir)\" \ + -DPA_BUILDDIR=\"$(abs_builddir)\" \ + -DPULSE_LOCALEDIR=\"$(localedir)\" +AM_CFLAGS = -std=gnu11 \ + $(PTHREAD_CFLAGS) +AM_CXXFLAGS = -std=c++11 \ + $(PTHREAD_CFLAGS) +SERVER_CFLAGS = -D__INCLUDED_FROM_PULSE_AUDIO + +AM_LIBADD = $(PTHREAD_LIBS) $(INTLLIBS) +AM_LDADD = $(PTHREAD_LIBS) $(INTLLIBS) +AM_LDFLAGS = +# Should only be applied to libraries. +AM_LIBLDFLAGS = $(NODELETE_LDFLAGS) + +if HAVE_GCOV +AM_CFLAGS+=$(GCOV_CFLAGS) +AM_CXXFLAGS+=$(GCOV_CFLAGS) +AM_LDFLAGS+=$(GCOV_LIBS) +endif + +if STATIC_BINS +BINLDFLAGS = -static +endif + +if OS_IS_WIN32 +AM_LDFLAGS+=-Wl,--export-all-symbols,--enable-auto-import -no-undefined +WINSOCK_LIBS=-lwsock32 -lws2_32 -lwininet +endif + +if OS_IS_DARWIN +AM_LDFLAGS+=-Wl,-headerpad_max_install_names -headerpad_max_install_names +endif + +FOREIGN_CFLAGS = -w + +MODULE_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -module -disable-static -avoid-version $(NOUNDEFINED_LDFLAGS) +MODULE_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINOR@.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la + +################################### +# Extra files # +################################### + +EXTRA_DIST = \ + pulse/client.conf.in \ + pulse/version.h.in \ + pulsecore/filter/LICENSE.WEBKIT \ + daemon/daemon.conf.in \ + daemon/default.pa.in \ + daemon/system.pa.in \ + depmod.py \ + daemon/esdcompat.in \ + daemon/start-pulseaudio-x11.in \ + daemon/systemd/user/pulseaudio.service.in \ + daemon/systemd/user/pulseaudio.socket \ + utils/padsp.in \ + utils/qpaeq \ + utils/pa-info \ + daemon/pulseaudio.desktop.in \ + map-file \ + daemon/pulseaudio-system.conf \ + modules/echo-cancel/adrian-license.txt \ + modules/gsettings/org.freedesktop.pulseaudio.gschema.xml \ + modules/gsettings/pulseaudio.convert + +pulseconf_DATA = \ + default.pa \ + system.pa \ + daemon.conf \ + client.conf + +if HAVE_DBUS +dbuspolicy_DATA = \ + daemon/pulseaudio-system.conf +endif + +if HAVE_X11 +xdgautostart_in_files = \ + daemon/pulseaudio.desktop.in +xdgautostart_DATA = $(xdgautostart_in_files:.desktop.in=.desktop) +$(xdgautostart_DATA): $(xdgautostart_in_files) + $(AM_V_GEN) $(MSGFMT) --desktop --template $< -d $(top_srcdir)/po -o $@ + +endif + + +################################### +# Includes # +################################### + +BUILT_SOURCES = +CLEANFILES = +include $(top_srcdir)/orc.mak +ORC_SOURCE = + +################################### +# Main daemon # +################################### + +bin_PROGRAMS = pulseaudio + +pulseaudio_SOURCES = \ + daemon/caps.c daemon/caps.h \ + daemon/cmdline.c daemon/cmdline.h \ + daemon/cpulimit.c daemon/cpulimit.h \ + daemon/daemon-conf.c daemon/daemon-conf.h \ + daemon/dumpmodules.c daemon/dumpmodules.h \ + daemon/ltdl-bind-now.c daemon/ltdl-bind-now.h \ + daemon/main.c + +pulseaudio_CFLAGS = $(AM_CFLAGS) $(CAP_CFLAGS) +pulseaudio_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la $(LIBLTDL) $(CAP_LIBS) +# This is needed because automake doesn't properly expand the foreach below +pulseaudio_DEPENDENCIES = libpulsecore-@PA_MAJORMINOR@.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la $(PREOPEN_LIBS) + +if HAVE_DBUS +pulseaudio_CFLAGS += $(DBUS_CFLAGS) +pulseaudio_SOURCES += daemon/server-lookup.c daemon/server-lookup.h +pulseaudio_LDADD += $(DBUS_LIBS) +endif + +if PREOPEN_MODS +PREOPEN_LIBS = $(PREOPEN_MODS) +else +PREOPEN_LIBS = $(modlibexec_LTLIBRARIES) +endif + +if FORCE_PREOPEN +pulseaudio_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(IMMEDIATE_LDFLAGS) -ffast-math -dlpreopen force $(foreach f,$(PREOPEN_LIBS),-dlpreopen $(f)) +else +pulseaudio_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(IMMEDIATE_LDFLAGS) -ffast-math -dlopen force $(foreach f,$(PREOPEN_LIBS),-dlopen $(f)) +endif + +if HAVE_SYSTEMD_DAEMON +pulseaudio_CFLAGS += $(SYSTEMD_FLAGS) $(SYSTEMDDAEMON_FLAGS) +pulseaudio_LDFLAGS += $(SYSTEMD_LIBS) $(SYSTEMDDAEMON_LIBS) +endif + +################################### +# Utility programs # +################################### + +bin_SCRIPTS = \ + utils/pa-info + +if HAVE_ESOUND +bin_SCRIPTS += esdcompat +endif + +bin_PROGRAMS += \ + pacat \ + pactl + +if !OS_IS_WIN32 +bin_PROGRAMS += pasuspender +endif + +if HAVE_AF_UNIX +bin_PROGRAMS += pacmd +endif + +if HAVE_X11 +bin_PROGRAMS += pax11publish +bin_SCRIPTS += start-pulseaudio-x11 +endif + +pacat_SOURCES = utils/pacat.c +pacat_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la $(LIBSNDFILE_LIBS) +pacat_CFLAGS = $(AM_CFLAGS) $(LIBSNDFILE_CFLAGS) +pacat_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +pactl_SOURCES = utils/pactl.c +pactl_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la $(LIBSNDFILE_LIBS) +pactl_CFLAGS = $(AM_CFLAGS) $(LIBSNDFILE_CFLAGS) +pactl_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +pasuspender_SOURCES = utils/pasuspender.c +pasuspender_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +pasuspender_CFLAGS = $(AM_CFLAGS) +pasuspender_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +pacmd_SOURCES = utils/pacmd.c +pacmd_CFLAGS = $(AM_CFLAGS) +pacmd_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +pacmd_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +pax11publish_SOURCES = utils/pax11publish.c +pax11publish_CFLAGS = $(AM_CFLAGS) $(X11_CFLAGS) +pax11publish_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la $(X11_LIBS) +pax11publish_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +if HAVE_SYSTEMD_DAEMON + +systemduserunit_DATA = \ + pulseaudio.service \ + daemon/systemd/user/pulseaudio.socket + +endif + +################################### +# Test programs # +################################### +noinst_LTLIBRARIES = + +TESTS_default = \ + asyncmsgq-test \ + asyncq-test \ + channelmap-test \ + close-test \ + core-util-test \ + cpu-mix-test \ + cpu-remap-test \ + cpu-sconv-test \ + cpu-volume-test \ + format-test \ + get-binary-name-test \ + hashmap-test \ + hook-list-test \ + json-test \ + lfe-filter-test \ + lock-autospawn-test \ + mainloop-test \ + memblock-test \ + memblockq-test \ + mix-test \ + mult-s16-test \ + proplist-test \ + queue-test \ + resampler-test \ + rtpoll-test \ + smoother-test \ + strlist-test \ + thread-mainloop-test \ + thread-test \ + utf8-test \ + volume-test + +TESTS_norun = \ + ipacl-test \ + mcalign-test \ + pacat-simple \ + parec-simple \ + flist-test \ + remix-test \ + rtstutter \ + sig2str-test \ + stripnul \ + echo-cancel-test \ + lo-latency-test + +# These tests need a running pulseaudio daemon +TESTS_daemon = \ + extended-test \ + passthrough-test \ + sync-playback + +# These tests need a running daemon and take a while to complete +TESTS_daemon_long = \ + connect-stress \ + interpol-test + +if !OS_IS_WIN32 +TESTS_default += \ + sigbus-test \ + usergroup-test +endif + +if HAVE_PTHREAD_SETAFFINITY_NP +TESTS_norun += \ + atomic-test +endif + +if HAVE_SYS_EVENTFD_H +TESTS_default += \ + srbchannel-test +endif + +if !OS_IS_DARWIN +TESTS_default += \ + once-test +endif + +if HAVE_SIGXCPU +TESTS_norun += \ + cpulimit-test \ + cpulimit-test2 +endif + +if HAVE_GLIB20 +TESTS_default += \ + mainloop-test-glib + +if HAVE_GTK30 +# gtk-test depends on both glib and gtk +TESTS_norun += \ + gtk-test +endif +endif + +if HAVE_ALSA +TESTS_norun += \ + alsa-time-test +TESTS_default += \ + alsa-mixer-path-test +endif + +if HAVE_TESTS +TESTS_ENVIRONMENT=MAKE_CHECK=1 +TESTS = $(TESTS_default) + +if BUILD_TESTS_DEFAULT +noinst_PROGRAMS = $(TESTS_default) $(TESTS_norun) $(TESTS_daemon) $(TESTS_daemon_long) +else +check_PROGRAMS = $(TESTS_default) $(TESTS_norun) +endif + +check-daemon: $(TESTS_daemon) + PATH=$(builddir):${PATH} $(top_srcdir)/src/tests/test-daemon.sh $(TESTS_daemon) + +check-daemon-long: $(TESTS_daemon_long) + PATH=$(builddir):${PATH} $(top_srcdir)/src/tests/test-daemon.sh $(TESTS_daemon_long) + +else +TESTS_ENVIRONMENT= +TESTS = +noinst_PROGRAMS = +check_PROGRAMS = + +check-daemon: + @echo "Tests are disabled!" + @echo "Pass option \"--enable-tests\" to configure and install \"check\" library properly!" + false + +check-daemon-long: check-daemon + +endif + +core_util_test_SOURCES = tests/core-util-test.c +core_util_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +core_util_test_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +core_util_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +hashmap_test_SOURCES = tests/hashmap-test.c +hashmap_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +hashmap_test_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +hashmap_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +mainloop_test_SOURCES = tests/mainloop-test.c +mainloop_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +mainloop_test_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +mainloop_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +thread_mainloop_test_SOURCES = tests/thread-mainloop-test.c +thread_mainloop_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +thread_mainloop_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +thread_mainloop_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +utf8_test_SOURCES = tests/utf8-test.c +utf8_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +utf8_test_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +utf8_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +format_test_SOURCES = tests/format-test.c +format_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +format_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +format_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +json_test_SOURCES = tests/json-test.c +json_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +json_test_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +json_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +srbchannel_test_SOURCES = tests/srbchannel-test.c +srbchannel_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +srbchannel_test_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +srbchannel_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +atomic_test_SOURCES = tests/atomic-test.c +atomic_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +atomic_test_LDADD = $(AM_LDADD) libpulsecommon-@PA_MAJORMINOR@.la libpulse.la +atomic_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +get_binary_name_test_SOURCES = tests/get-binary-name-test.c +get_binary_name_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +get_binary_name_test_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +get_binary_name_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +ipacl_test_SOURCES = tests/ipacl-test.c +ipacl_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +ipacl_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +ipacl_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +hook_list_test_SOURCES = tests/hook-list-test.c +hook_list_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +hook_list_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +hook_list_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +memblock_test_SOURCES = tests/memblock-test.c +memblock_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +memblock_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +memblock_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +thread_test_SOURCES = tests/thread-test.c +thread_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +thread_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +thread_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +once_test_SOURCES = tests/once-test.c +once_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +once_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +once_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +flist_test_SOURCES = tests/flist-test.c +flist_test_CFLAGS = $(AM_CFLAGS) +flist_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +flist_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +asyncq_test_SOURCES = tests/asyncq-test.c +asyncq_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +asyncq_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +asyncq_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +asyncmsgq_test_SOURCES = tests/asyncmsgq-test.c +asyncmsgq_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +asyncmsgq_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +asyncmsgq_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +queue_test_SOURCES = tests/queue-test.c +queue_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +queue_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +queue_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +rtpoll_test_SOURCES = tests/rtpoll-test.c +rtpoll_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +rtpoll_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +rtpoll_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +mcalign_test_SOURCES = tests/mcalign-test.c +mcalign_test_CFLAGS = $(AM_CFLAGS) +mcalign_test_LDADD = $(AM_LDADD) $(WINSOCK_LIBS) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +mcalign_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +pacat_simple_SOURCES = tests/pacat-simple.c +pacat_simple_LDADD = $(AM_LDADD) libpulse.la libpulse-simple.la +pacat_simple_CFLAGS = $(AM_CFLAGS) +pacat_simple_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +parec_simple_SOURCES = tests/parec-simple.c +parec_simple_LDADD = $(AM_LDADD) libpulse.la libpulse-simple.la +parec_simple_CFLAGS = $(AM_CFLAGS) +parec_simple_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +extended_test_SOURCES = tests/extended-test.c +extended_test_LDADD = $(AM_LDADD) libpulse.la +extended_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +extended_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +passthrough_test_SOURCES = tests/passthrough-test.c +passthrough_test_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +passthrough_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +passthrough_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +strlist_test_SOURCES = tests/strlist-test.c +strlist_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +strlist_test_LDADD = $(AM_LDADD) $(WINSOCK_LIBS) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +strlist_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +close_test_SOURCES = tests/close-test.c +close_test_CFLAGS = $(AM_CFLAGS) +close_test_LDADD = $(AM_LDADD) $(WINSOCK_LIBS) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +close_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +volume_test_SOURCES = tests/volume-test.c +volume_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +volume_test_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +volume_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +channelmap_test_SOURCES = tests/channelmap-test.c +channelmap_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +channelmap_test_LDADD = $(AM_LDADD) libpulse.la +channelmap_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +cpulimit_test_SOURCES = tests/cpulimit-test.c daemon/cpulimit.c daemon/cpulimit.h +cpulimit_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +cpulimit_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +cpulimit_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +cpulimit_test2_SOURCES = tests/cpulimit-test.c daemon/cpulimit.c daemon/cpulimit.h +cpulimit_test2_CFLAGS = $(AM_CFLAGS) -DTEST2 $(LIBCHECK_CFLAGS) +cpulimit_test2_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +cpulimit_test2_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +mainloop_test_glib_SOURCES = $(mainloop_test_SOURCES) +mainloop_test_glib_CFLAGS = $(mainloop_test_CFLAGS) $(LIBCHECK_CFLAGS) $(GLIB20_CFLAGS) -DGLIB_MAIN_LOOP +mainloop_test_glib_LDADD = $(mainloop_test_LDADD) $(GLIB20_LIBS) libpulse-mainloop-glib.la +mainloop_test_glib_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +memblockq_test_SOURCES = tests/memblockq-test.c +memblockq_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +memblockq_test_LDADD = $(AM_LDADD) $(WINSOCK_LIBS) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +memblockq_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +sync_playback_SOURCES = tests/sync-playback.c +sync_playback_LDADD = $(AM_LDADD) libpulse.la +sync_playback_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +sync_playback_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +interpol_test_SOURCES = tests/interpol-test.c +interpol_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +interpol_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +interpol_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +sig2str_test_SOURCES = tests/sig2str-test.c +sig2str_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +sig2str_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +sig2str_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +resampler_test_SOURCES = tests/resampler-test.c +resampler_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +resampler_test_CFLAGS = $(AM_CFLAGS) +resampler_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +mix_test_SOURCES = tests/mix-test.c +mix_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +mix_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +mix_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +remix_test_SOURCES = tests/remix-test.c +remix_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +remix_test_CFLAGS = $(AM_CFLAGS) +remix_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +smoother_test_SOURCES = tests/smoother-test.c +smoother_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +smoother_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +smoother_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +proplist_test_SOURCES = tests/proplist-test.c +proplist_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +proplist_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +proplist_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +cpu_mix_test_SOURCES = tests/cpu-mix-test.c tests/runtime-test-util.h +cpu_mix_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +cpu_mix_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +cpu_mix_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +cpu_remap_test_SOURCES = tests/cpu-remap-test.c tests/runtime-test-util.h +cpu_remap_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +cpu_remap_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +cpu_remap_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +cpu_sconv_test_SOURCES = tests/cpu-sconv-test.c tests/runtime-test-util.h +cpu_sconv_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +cpu_sconv_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +cpu_sconv_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +cpu_volume_test_SOURCES = tests/cpu-volume-test.c tests/runtime-test-util.h +cpu_volume_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +cpu_volume_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +cpu_volume_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +mult_s16_test_SOURCES = tests/mult-s16-test.c tests/runtime-test-util.h +mult_s16_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +mult_s16_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +mult_s16_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +lfe_filter_test_SOURCES = tests/lfe-filter-test.c +lfe_filter_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +lfe_filter_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +lfe_filter_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +rtstutter_SOURCES = tests/rtstutter.c +rtstutter_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +rtstutter_CFLAGS = $(AM_CFLAGS) +rtstutter_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +stripnul_SOURCES = tests/stripnul.c +stripnul_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +stripnul_CFLAGS = $(AM_CFLAGS) +stripnul_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +lock_autospawn_test_SOURCES = tests/lock-autospawn-test.c +lock_autospawn_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +lock_autospawn_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +lock_autospawn_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +sigbus_test_SOURCES = tests/sigbus-test.c +sigbus_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +sigbus_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +sigbus_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +gtk_test_SOURCES = tests/gtk-test.c +gtk_test_LDADD = $(AM_LDADD) $(GTK30_LIBS) libpulse-mainloop-glib.la libpulse.la +gtk_test_CFLAGS = $(AM_CFLAGS) $(GTK30_CFLAGS) +gtk_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +alsa_time_test_SOURCES = tests/alsa-time-test.c +alsa_time_test_LDADD = $(AM_LDADD) $(ASOUNDLIB_LIBS) +alsa_time_test_CFLAGS = $(AM_CFLAGS) $(ASOUNDLIB_CFLAGS) +alsa_time_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +alsa_mixer_path_test_SOURCES = tests/alsa-mixer-path-test.c +alsa_mixer_path_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) $(ASOUNDLIB_CFLAGS) +alsa_mixer_path_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la libalsa-util.la +alsa_mixer_path_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +usergroup_test_SOURCES = tests/usergroup-test.c +usergroup_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +usergroup_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +usergroup_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +connect_stress_SOURCES = tests/connect-stress.c +connect_stress_LDADD = $(AM_LDADD) libpulse.la +connect_stress_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +connect_stress_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +echo_cancel_test_SOURCES = $(module_echo_cancel_la_SOURCES) +nodist_echo_cancel_test_SOURCES = $(nodist_module_echo_cancel_la_SOURCES) +echo_cancel_test_LDADD = $(module_echo_cancel_la_LIBADD) +echo_cancel_test_CFLAGS = $(module_echo_cancel_la_CFLAGS) -DECHO_CANCEL_TEST=1 +if HAVE_WEBRTC +echo_cancel_test_CXXFLAGS = $(module_echo_cancel_la_CXXFLAGS) -DECHO_CANCEL_TEST=1 +endif +echo_cancel_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +liblo_test_util_la_SOURCES = tests/lo-test-util.h tests/lo-test-util.c +liblo_test_util_la_LIBADD = libpulsecore-@PA_MAJORMINOR@.la +liblo_test_util_la_LDFLAGS = -avoid-version +noinst_LTLIBRARIES += liblo-test-util.la + +lo_latency_test_SOURCES = tests/lo-latency-test.c +lo_latency_test_LDADD = $(AM_LDADD) libpulse.la liblo-test-util.la +lo_latency_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +lo_latency_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +################################### +# Common library # +################################### + +commonlibdir = $(pkglibdir) +commonlib_LTLIBRARIES = \ + libpulsecommon-@PA_MAJORMINOR@.la + +# We duplicate files from pulse/ in this to allow as-needed linking. If we did +# not do this, in situations where code in libpulsecommon uses code in +# libpulse, we would then need to link libpulsecommon to libpulse (in addition +# to the existing libpulse being linked to libpulsecommon). Duplicating the +# code allows us to prevent this circular linking. +libpulsecommon_@PA_MAJORMINOR@_la_SOURCES = \ + pulse/client-conf.c pulse/client-conf.h \ + pulse/fork-detect.c pulse/fork-detect.h \ + pulse/format.c pulse/format.h \ + pulse/json.c pulse/json.h \ + pulse/xmalloc.c pulse/xmalloc.h \ + pulse/proplist.c pulse/proplist.h \ + pulse/utf8.c pulse/utf8.h \ + pulse/channelmap.c pulse/channelmap.h \ + pulse/sample.c pulse/sample.h \ + pulse/util.c pulse/util.h \ + pulse/timeval.c pulse/timeval.h \ + pulse/rtclock.c pulse/rtclock.h \ + pulse/volume.c pulse/volume.h \ + pulsecore/atomic.h \ + pulsecore/authkey.c pulsecore/authkey.h \ + pulsecore/conf-parser.c pulsecore/conf-parser.h \ + pulsecore/core-error.c pulsecore/core-error.h \ + pulsecore/core-format.c pulsecore/core-format.h \ + pulsecore/core-rtclock.c pulsecore/core-rtclock.h \ + pulsecore/core-util.c pulsecore/core-util.h \ + pulsecore/creds.h \ + pulsecore/dynarray.c pulsecore/dynarray.h \ + pulsecore/endianmacros.h \ + pulsecore/fdsem.c pulsecore/fdsem.h \ + pulsecore/flist.c pulsecore/flist.h \ + pulsecore/g711.c pulsecore/g711.h \ + pulsecore/hashmap.c pulsecore/hashmap.h \ + pulsecore/i18n.c pulsecore/i18n.h \ + pulsecore/idxset.c pulsecore/idxset.h \ + pulsecore/arpa-inet.c pulsecore/arpa-inet.h \ + pulsecore/iochannel.c pulsecore/iochannel.h \ + pulsecore/ioline.c pulsecore/ioline.h \ + pulsecore/ipacl.c pulsecore/ipacl.h \ + pulsecore/llist.h \ + pulsecore/lock-autospawn.c pulsecore/lock-autospawn.h \ + pulsecore/log.c pulsecore/log.h \ + pulsecore/ratelimit.c pulsecore/ratelimit.h \ + pulsecore/macro.h \ + pulsecore/mcalign.c pulsecore/mcalign.h \ + pulsecore/memblock.c pulsecore/memblock.h \ + pulsecore/memblockq.c pulsecore/memblockq.h \ + pulsecore/memchunk.c pulsecore/memchunk.h \ + pulsecore/native-common.c pulsecore/native-common.h \ + pulsecore/once.c pulsecore/once.h \ + pulsecore/packet.c pulsecore/packet.h \ + pulsecore/parseaddr.c pulsecore/parseaddr.h \ + pulsecore/pdispatch.c pulsecore/pdispatch.h \ + pulsecore/pid.c pulsecore/pid.h \ + pulsecore/pipe.c pulsecore/pipe.h \ + pulsecore/memtrap.c pulsecore/memtrap.h \ + pulsecore/aupdate.c pulsecore/aupdate.h \ + pulsecore/proplist-util.c pulsecore/proplist-util.h \ + pulsecore/pstream-util.c pulsecore/pstream-util.h \ + pulsecore/pstream.c pulsecore/pstream.h \ + pulsecore/queue.c pulsecore/queue.h \ + pulsecore/random.c pulsecore/random.h \ + pulsecore/refcnt.h \ + pulsecore/srbchannel.c pulsecore/srbchannel.h \ + pulsecore/sample-util.c pulsecore/sample-util.h \ + pulsecore/mem.h \ + pulsecore/shm.c pulsecore/shm.h \ + pulsecore/bitset.c pulsecore/bitset.h \ + pulsecore/socket-client.c pulsecore/socket-client.h \ + pulsecore/socket-server.c pulsecore/socket-server.h \ + pulsecore/socket-util.c pulsecore/socket-util.h \ + pulsecore/strbuf.c pulsecore/strbuf.h \ + pulsecore/strlist.c pulsecore/strlist.h \ + pulsecore/tagstruct.c pulsecore/tagstruct.h \ + pulsecore/time-smoother.c pulsecore/time-smoother.h \ + pulsecore/tokenizer.c pulsecore/tokenizer.h \ + pulsecore/usergroup.c pulsecore/usergroup.h \ + pulsecore/sndfile-util.c pulsecore/sndfile-util.h \ + pulsecore/socket.h + +if OS_IS_WIN32 +libpulsecommon_@PA_MAJORMINOR@_la_SOURCES += \ + pulsecore/poll-win32.c pulsecore/poll.h \ + pulsecore/winerrno.h +else +libpulsecommon_@PA_MAJORMINOR@_la_SOURCES += pulsecore/poll-posix.c pulsecore/poll.h +endif + +libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS = $(AM_CFLAGS) $(LIBSNDFILE_CFLAGS) +libpulsecommon_@PA_MAJORMINOR@_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version +libpulsecommon_@PA_MAJORMINOR@_la_LIBADD = $(AM_LIBADD) $(LIBWRAP_LIBS) $(WINSOCK_LIBS) $(LTLIBICONV) $(LIBSNDFILE_LIBS) + +if HAVE_MEMFD +libpulsecommon_@PA_MAJORMINOR@_la_SOURCES += \ + pulsecore/memfd-wrappers.h +endif + +if HAVE_X11 +libpulsecommon_@PA_MAJORMINOR@_la_SOURCES += \ + pulse/client-conf-x11.c pulse/client-conf-x11.h \ + pulsecore/x11prop.c pulsecore/x11prop.h +libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS += $(X11_CFLAGS) +libpulsecommon_@PA_MAJORMINOR@_la_LDFLAGS += $(X11_LIBS) +endif + +if HAVE_SYSTEMD_DAEMON +libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS += $(SYSTEMD_FLAGS) $(SYSTEMDDAEMON_FLAGS) +libpulsecommon_@PA_MAJORMINOR@_la_LDFLAGS += $(SYSTEMD_LIBS) $(SYSTEMDDAEMON_LIBS) +endif +if HAVE_SYSTEMD_JOURNAL +libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS += $(SYSTEMD_FLAGS) $(SYSTEMDJOURNAL_FLAGS) +libpulsecommon_@PA_MAJORMINOR@_la_LDFLAGS += $(SYSTEMD_LIBS) $(SYSTEMDJOURNAL_LIBS) +endif + +# proplist-util.h uses these header files, but not the library itself! +libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS += $(GLIB20_CFLAGS) $(GTK30_CFLAGS) + +## Please note that libpulsecommon implicitly also depends on< +## libpulse! i.e. we have a cyclic dependency here. Which is intended +## since libpulse only includes stable, official APIs, while +## libpulsecommon only includes unofficial APIs. + +if OS_IS_WIN32 +libpulsecommon_@PA_MAJORMINOR@_la_SOURCES += \ + pulsecore/mutex-win32.c pulsecore/mutex.h \ + pulsecore/thread-win32.c pulsecore/thread.h \ + pulsecore/semaphore-win32.c pulsecore/semaphore.h +else !OS_IS_WIN32 +if OS_IS_DARWIN +libpulsecommon_@PA_MAJORMINOR@_la_SOURCES += \ + pulsecore/mutex-posix.c pulsecore/mutex.h \ + pulsecore/thread-posix.c pulsecore/thread.h \ + pulsecore/semaphore-osx.c pulsecore/semaphore.h +else !OS_IS_DARWIN +libpulsecommon_@PA_MAJORMINOR@_la_SOURCES += \ + pulsecore/mutex-posix.c pulsecore/mutex.h \ + pulsecore/thread-posix.c pulsecore/thread.h \ + pulsecore/semaphore-posix.c pulsecore/semaphore.h +endif !OS_IS_DARWIN +endif !OS_IS_WIN32 + +if HAVE_LIBASYNCNS +libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS += $(LIBASYNCNS_CFLAGS) +libpulsecommon_@PA_MAJORMINOR@_la_LIBADD += $(LIBASYNCNS_LIBS) +endif + +if OS_IS_WIN32 +libpulsecommon_@PA_MAJORMINOR@_la_SOURCES += pulsecore/dllmain.c +endif + +if HAVE_DBUS +libpulsecommon_@PA_MAJORMINOR@_la_SOURCES += \ + pulsecore/dbus-util.c pulsecore/dbus-util.h \ + pulsecore/rtkit.c pulsecore/rtkit.h +libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS += $(DBUS_CFLAGS) +libpulsecommon_@PA_MAJORMINOR@_la_LIBADD += $(DBUS_LIBS) +endif + +################################### +# Client library # +################################### + +pulseinclude_HEADERS = \ + pulse/cdecl.h \ + pulse/channelmap.h \ + pulse/context.h \ + pulse/def.h \ + pulse/direction.h \ + pulse/error.h \ + pulse/ext-device-manager.h \ + pulse/ext-device-restore.h \ + pulse/ext-stream-restore.h \ + pulse/format.h \ + pulse/gccmacro.h \ + pulse/introspect.h \ + pulse/mainloop-api.h \ + pulse/mainloop-signal.h \ + pulse/mainloop.h \ + pulse/operation.h \ + pulse/proplist.h \ + pulse/pulseaudio.h \ + pulse/rtclock.h \ + pulse/sample.h \ + pulse/scache.h \ + pulse/simple.h \ + pulse/stream.h \ + pulse/subscribe.h \ + pulse/thread-mainloop.h \ + pulse/timeval.h \ + pulse/utf8.h \ + pulse/util.h \ + pulse/version.h \ + pulse/volume.h \ + pulse/xmalloc.h + +lib_LTLIBRARIES = \ + libpulse.la \ + libpulse-simple.la + +if HAVE_GLIB20 +pulseinclude_HEADERS += \ + pulse/glib-mainloop.h + +lib_LTLIBRARIES += \ + libpulse-mainloop-glib.la +endif + +# Public interface +libpulse_la_SOURCES = \ + pulse/cdecl.h \ + pulse/channelmap.c pulse/channelmap.h \ + pulse/context.c pulse/context.h \ + pulse/def.h \ + pulse/direction.c pulse/direction.h \ + pulse/error.c pulse/error.h \ + pulse/ext-device-manager.c pulse/ext-device-manager.h \ + pulse/ext-device-restore.c pulse/ext-device-restore.h \ + pulse/ext-stream-restore.c pulse/ext-stream-restore.h \ + pulse/format.c pulse/format.h \ + pulse/gccmacro.h \ + pulse/internal.h \ + pulse/introspect.c pulse/introspect.h \ + pulse/mainloop-api.c pulse/mainloop-api.h \ + pulse/mainloop-signal.c pulse/mainloop-signal.h \ + pulse/mainloop.c pulse/mainloop.h \ + pulse/operation.c pulse/operation.h \ + pulse/proplist.c pulse/proplist.h \ + pulse/pulseaudio.h \ + pulse/rtclock.c pulse/rtclock.h \ + pulse/sample.c pulse/sample.h \ + pulse/scache.c pulse/scache.h \ + pulse/stream.c pulse/stream.h \ + pulse/subscribe.c pulse/subscribe.h \ + pulse/thread-mainloop.c pulse/thread-mainloop.h \ + pulse/timeval.c pulse/timeval.h \ + pulse/utf8.c pulse/utf8.h \ + pulse/util.c pulse/util.h \ + pulse/volume.c pulse/volume.h \ + pulse/xmalloc.c pulse/xmalloc.h + +libpulse_la_CFLAGS = $(AM_CFLAGS) +libpulse_la_LIBADD = $(AM_LIBADD) $(WINSOCK_LIBS) $(LTLIBICONV) libpulsecommon-@PA_MAJORMINOR@.la +libpulse_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_VERSION_INFO) + +if HAVE_DBUS +libpulse_la_CFLAGS += $(DBUS_CFLAGS) +libpulse_la_LIBADD += $(DBUS_LIBS) +endif + +libpulse_simple_la_SOURCES = pulse/simple.c pulse/simple.h +libpulse_simple_la_CFLAGS = $(AM_CFLAGS) +libpulse_simple_la_LIBADD = $(AM_LIBADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +libpulse_simple_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_SIMPLE_VERSION_INFO) + +libpulse_mainloop_glib_la_SOURCES = pulse/glib-mainloop.h pulse/glib-mainloop.c +libpulse_mainloop_glib_la_CFLAGS = $(AM_CFLAGS) $(GLIB20_CFLAGS) +libpulse_mainloop_glib_la_LIBADD = $(AM_LIBADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la $(GLIB20_LIBS) +libpulse_mainloop_glib_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_MAINLOOP_GLIB_VERSION_INFO) + +################################### +# OSS emulation # +################################### + +if HAVE_OSS_WRAPPER +padsplibdir = $(pkglibdir) +padsplib_LTLIBRARIES = libpulsedsp.la +bin_SCRIPTS += padsp + +edit = @SED@ \ + -e 's|@PULSEDSP_LOCATION[@]|$(PULSEDSP_LOCATION)|g' + +padsp: utils/padsp.in + $(edit) $< > $@ + +CLEANFILES += padsp + +endif + +libpulsedsp_la_SOURCES = utils/padsp.c +libpulsedsp_la_CFLAGS = $(AM_CFLAGS) +libpulsedsp_la_LIBADD = $(AM_LIBADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +libpulsedsp_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version -disable-static + +################################### +# Daemon core library # +################################### + +pkglib_LTLIBRARIES = libpulsecore-@PA_MAJORMINOR@.la + +# Pure core stuff +libpulsecore_@PA_MAJORMINOR@_la_SOURCES = \ + pulsecore/filter/lfe-filter.c pulsecore/filter/lfe-filter.h \ + pulsecore/filter/biquad.c pulsecore/filter/biquad.h \ + pulsecore/filter/crossover.c pulsecore/filter/crossover.h \ + pulsecore/asyncmsgq.c pulsecore/asyncmsgq.h \ + pulsecore/asyncq.c pulsecore/asyncq.h \ + pulsecore/auth-cookie.c pulsecore/auth-cookie.h \ + pulsecore/cli-command.c pulsecore/cli-command.h \ + pulsecore/cli-text.c pulsecore/cli-text.h \ + pulsecore/client.c pulsecore/client.h \ + pulsecore/typedefs.h \ + pulsecore/card.c pulsecore/card.h \ + pulsecore/core-scache.c pulsecore/core-scache.h \ + pulsecore/core-subscribe.c pulsecore/core-subscribe.h \ + pulsecore/core.c pulsecore/core.h \ + pulsecore/message-handler.c pulsecore/message-handler.h \ + pulsecore/hook-list.c pulsecore/hook-list.h \ + pulsecore/ltdl-helper.c pulsecore/ltdl-helper.h \ + pulsecore/modargs.c pulsecore/modargs.h \ + pulsecore/modinfo.c pulsecore/modinfo.h \ + pulsecore/module.c pulsecore/module.h \ + pulsecore/msgobject.c pulsecore/msgobject.h \ + pulsecore/namereg.c pulsecore/namereg.h \ + pulsecore/object.c pulsecore/object.h \ + pulsecore/play-memblockq.c pulsecore/play-memblockq.h \ + pulsecore/play-memchunk.c pulsecore/play-memchunk.h \ + pulsecore/remap.c pulsecore/remap.h \ + pulsecore/remap_mmx.c pulsecore/remap_sse.c \ + pulsecore/resampler.c pulsecore/resampler.h \ + pulsecore/resampler/ffmpeg.c pulsecore/resampler/peaks.c \ + pulsecore/resampler/trivial.c \ + pulsecore/rtpoll.c pulsecore/rtpoll.h \ + pulsecore/stream-util.c pulsecore/stream-util.h \ + pulsecore/svolume_c.c pulsecore/svolume_arm.c \ + pulsecore/svolume_mmx.c pulsecore/svolume_sse.c \ + pulsecore/mix.c pulsecore/mix.h \ + pulsecore/cpu.c pulsecore/cpu.h \ + pulsecore/cpu-arm.c pulsecore/cpu-arm.h \ + pulsecore/cpu-x86.c pulsecore/cpu-x86.h \ + pulsecore/cpu-orc.c pulsecore/cpu-orc.h \ + pulsecore/sconv-s16be.c pulsecore/sconv-s16be.h \ + pulsecore/sconv-s16le.c pulsecore/sconv-s16le.h \ + pulsecore/sconv_sse.c \ + pulsecore/sconv.c pulsecore/sconv.h \ + pulsecore/shared.c pulsecore/shared.h \ + pulsecore/sink-input.c pulsecore/sink-input.h \ + pulsecore/sink.c pulsecore/sink.h \ + pulsecore/device-port.c pulsecore/device-port.h \ + pulsecore/sioman.c pulsecore/sioman.h \ + pulsecore/sound-file-stream.c pulsecore/sound-file-stream.h \ + pulsecore/sound-file.c pulsecore/sound-file.h \ + pulsecore/source-output.c pulsecore/source-output.h \ + pulsecore/source.c pulsecore/source.h \ + pulsecore/start-child.c pulsecore/start-child.h \ + pulsecore/thread-mq.c pulsecore/thread-mq.h \ + pulsecore/database.c pulsecore/database.h + +libpulsecore_@PA_MAJORMINOR@_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) $(LIBSNDFILE_CFLAGS) $(WINSOCK_CFLAGS) +libpulsecore_@PA_MAJORMINOR@_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version +libpulsecore_@PA_MAJORMINOR@_la_LIBADD = $(AM_LIBADD) $(LIBLTDL) $(LIBSNDFILE_LIBS) $(WINSOCK_LIBS) $(LTLIBICONV) libpulsecommon-@PA_MAJORMINOR@.la libpulse.la libpulsecore-foreign.la + +if HAVE_NEON +noinst_LTLIBRARIES += libpulsecore_sconv_neon.la libpulsecore_mix_neon.la libpulsecore_remap_neon.la +libpulsecore_sconv_neon_la_SOURCES = pulsecore/sconv_neon.c +libpulsecore_sconv_neon_la_CFLAGS = $(AM_CFLAGS) $(NEON_CFLAGS) +libpulsecore_mix_neon_la_SOURCES = pulsecore/mix_neon.c +libpulsecore_mix_neon_la_CFLAGS = $(AM_CFLAGS) $(NEON_CFLAGS) +libpulsecore_remap_neon_la_SOURCES = pulsecore/remap_neon.c +libpulsecore_remap_neon_la_CFLAGS = $(AM_CFLAGS) $(NEON_CFLAGS) +libpulsecore_@PA_MAJORMINOR@_la_LIBADD += libpulsecore_sconv_neon.la libpulsecore_mix_neon.la libpulsecore_remap_neon.la +endif + +ORC_SOURCE += pulsecore/svolume +if HAVE_ORC +libpulsecore_@PA_MAJORMINOR@_la_SOURCES += pulsecore/svolume_orc.c +nodist_libpulsecore_@PA_MAJORMINOR@_la_SOURCES = pulsecore/svolume-orc-gen.c pulsecore/svolume-orc-gen.h +libpulsecore_@PA_MAJORMINOR@_la_CFLAGS += $(ORC_CFLAGS) +libpulsecore_@PA_MAJORMINOR@_la_LIBADD += $(ORC_LIBS) +endif + +if HAVE_X11 +libpulsecore_@PA_MAJORMINOR@_la_SOURCES += pulsecore/x11wrap.c pulsecore/x11wrap.h +libpulsecore_@PA_MAJORMINOR@_la_CFLAGS += $(X11_CFLAGS) +libpulsecore_@PA_MAJORMINOR@_la_LDFLAGS += $(X11_LIBS) +endif + +if HAVE_DBUS +libpulsecore_@PA_MAJORMINOR@_la_SOURCES += \ + pulsecore/dbus-shared.c pulsecore/dbus-shared.h \ + pulsecore/protocol-dbus.c pulsecore/protocol-dbus.h +libpulsecore_@PA_MAJORMINOR@_la_CFLAGS += $(DBUS_CFLAGS) +libpulsecore_@PA_MAJORMINOR@_la_LIBADD += $(DBUS_LIBS) +endif + +if HAVE_GDBM +libpulsecore_@PA_MAJORMINOR@_la_SOURCES += pulsecore/database-gdbm.c +libpulsecore_@PA_MAJORMINOR@_la_CFLAGS += $(GDBM_CFLAGS) +libpulsecore_@PA_MAJORMINOR@_la_LIBADD += $(GDBM_LIBS) +endif + +if HAVE_TDB +libpulsecore_@PA_MAJORMINOR@_la_SOURCES += pulsecore/database-tdb.c +libpulsecore_@PA_MAJORMINOR@_la_CFLAGS += $(TDB_CFLAGS) +libpulsecore_@PA_MAJORMINOR@_la_LIBADD += $(TDB_LIBS) +endif + +if HAVE_SIMPLEDB +libpulsecore_@PA_MAJORMINOR@_la_SOURCES += pulsecore/database-simple.c +endif + +if HAVE_SPEEX +libpulsecore_@PA_MAJORMINOR@_la_SOURCES += pulsecore/resampler/speex.c +libpulsecore_@PA_MAJORMINOR@_la_CFLAGS += $(LIBSPEEX_CFLAGS) +libpulsecore_@PA_MAJORMINOR@_la_LIBADD += $(LIBSPEEX_LIBS) +endif + +if HAVE_SOXR +libpulsecore_@PA_MAJORMINOR@_la_SOURCES += pulsecore/resampler/soxr.c +libpulsecore_@PA_MAJORMINOR@_la_CFLAGS += $(LIBSOXR_CFLAGS) +libpulsecore_@PA_MAJORMINOR@_la_LIBADD += $(LIBSOXR_LIBS) +endif + +if HAVE_LIBSAMPLERATE +libpulsecore_@PA_MAJORMINOR@_la_SOURCES += pulsecore/resampler/libsamplerate.c +libpulsecore_@PA_MAJORMINOR@_la_CFLAGS += $(LIBSAMPLERATE_CFLAGS) +libpulsecore_@PA_MAJORMINOR@_la_LIBADD += $(LIBSAMPLERATE_LIBS) +endif + +# We split the foreign code off to not be annoyed by warnings we don't care about +noinst_LTLIBRARIES += libpulsecore-foreign.la + +libpulsecore_foreign_la_SOURCES = \ + pulsecore/ffmpeg/resample2.c pulsecore/ffmpeg/avcodec.h pulsecore/ffmpeg/dsputil.h + +libpulsecore_foreign_la_CFLAGS = $(AM_CFLAGS) $(FOREIGN_CFLAGS) + +################################### +# Plug-in support libraries # +################################### + +### Warning! Due to an obscure bug in libtool/automake it is required +### that the libraries in modlibexec_LTLIBRARIES are specified in-order, +### i.e. libraries near the end of the list depend on libraries near +### the head, and not the other way! + +modlibexec_LTLIBRARIES = \ + libcli.la \ + libprotocol-cli.la \ + libprotocol-simple.la \ + libprotocol-http.la \ + libprotocol-native.la + +if HAVE_WEBRTC +modlibexec_LTLIBRARIES += libwebrtc-util.la +endif + +if HAVE_ESOUND +modlibexec_LTLIBRARIES += \ + libprotocol-esound.la +endif + +# We need to emulate sendmsg/recvmsg to support this on Win32 +if !OS_IS_WIN32 +modlibexec_LTLIBRARIES += \ + librtp.la +endif + +if HAVE_AVAHI +modlibexec_LTLIBRARIES += \ + libavahi-wrap.la +endif + +libprotocol_simple_la_SOURCES = pulsecore/protocol-simple.c pulsecore/protocol-simple.h +libprotocol_simple_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version +libprotocol_simple_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINOR@.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la + +libcli_la_SOURCES = pulsecore/cli.c pulsecore/cli.h +libcli_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version +libcli_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINOR@.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la + +libprotocol_cli_la_SOURCES = pulsecore/protocol-cli.c pulsecore/protocol-cli.h +libprotocol_cli_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version +libprotocol_cli_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINOR@.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la libcli.la + +libprotocol_http_la_SOURCES = pulsecore/protocol-http.c pulsecore/protocol-http.h pulsecore/mime-type.c pulsecore/mime-type.h +libprotocol_http_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version +libprotocol_http_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINOR@.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la + +libprotocol_native_la_SOURCES = pulsecore/protocol-native.c pulsecore/protocol-native.h pulsecore/native-common.h +libprotocol_native_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) +libprotocol_native_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version +libprotocol_native_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINOR@.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la +if HAVE_DBUS +libprotocol_native_la_CFLAGS += $(DBUS_CFLAGS) +libprotocol_native_la_LIBADD += $(DBUS_LIBS) +endif + +if HAVE_ESOUND +libprotocol_esound_la_SOURCES = pulsecore/protocol-esound.c pulsecore/protocol-esound.h pulsecore/esound.h +libprotocol_esound_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version +libprotocol_esound_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINOR@.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la +endif + +librtp_la_SOURCES = \ + modules/rtp/rtp-common.c modules/rtp/rtp.h \ + modules/rtp/sdp.c modules/rtp/sdp.h \ + modules/rtp/sap.c modules/rtp/sap.h \ + modules/rtp/rtsp_client.c modules/rtp/rtsp_client.h \ + modules/rtp/headerlist.c modules/rtp/headerlist.h +librtp_la_CFLAGS = $(AM_CFLAGS) +librtp_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version +librtp_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINOR@.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la +if HAVE_GSTREAMER +librtp_la_SOURCES += modules/rtp/rtp-gstreamer.c +librtp_la_CFLAGS += $(GSTREAMER_CFLAGS) +librtp_la_LIBADD += $(GSTREAMER_LIBS) +else +librtp_la_SOURCES += modules/rtp/rtp-native.c +endif + +libraop_la_SOURCES = \ + modules/raop/raop-util.c modules/raop/raop-util.h \ + modules/raop/raop-crypto.c modules/raop/raop-crypto.h \ + modules/raop/raop-packet-buffer.h modules/raop/raop-packet-buffer.c \ + modules/raop/raop-client.c modules/raop/raop-client.h \ + modules/raop/raop-sink.c modules/raop/raop-sink.h + +libraop_la_CFLAGS = $(AM_CFLAGS) $(OPENSSL_CFLAGS) -I$(top_srcdir)/src/modules/rtp +libraop_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version +libraop_la_LIBADD = $(AM_LIBADD) $(OPENSSL_LIBS) libpulsecore-@PA_MAJORMINOR@.la librtp.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la + +# Avahi +libavahi_wrap_la_SOURCES = pulsecore/avahi-wrap.c pulsecore/avahi-wrap.h +libavahi_wrap_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version +libavahi_wrap_la_CFLAGS = $(AM_CFLAGS) $(AVAHI_CFLAGS) +libavahi_wrap_la_LIBADD = $(AM_LIBADD) $(AVAHI_CFLAGS) libpulsecore-@PA_MAJORMINOR@.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la + +################################### +# Plug-in libraries # +################################### + +if HAVE_DBUS +# Serveral module (e.g. libalsa-util.la) +modlibexec_LTLIBRARIES += \ + module-console-kit.la +endif + +modlibexec_LTLIBRARIES += \ + module-cli.la \ + module-cli-protocol-tcp.la \ + module-simple-protocol-tcp.la \ + module-null-sink.la \ + module-null-source.la \ + module-sine-source.la \ + module-detect.la \ + module-volume-restore.la \ + module-device-manager.la \ + module-device-restore.la \ + module-stream-restore.la \ + module-card-restore.la \ + module-default-device-restore.la \ + module-always-sink.la \ + module-always-source.la \ + module-rescue-streams.la \ + module-intended-roles.la \ + module-suspend-on-idle.la \ + module-echo-cancel.la \ + module-http-protocol-tcp.la \ + module-sine.la \ + module-native-protocol-tcp.la \ + module-native-protocol-fd.la \ + module-combine.la \ + module-combine-sink.la \ + module-remap-sink.la \ + module-remap-source.la \ + module-ladspa-sink.la \ + module-tunnel-sink-new.la \ + module-tunnel-source-new.la \ + module-tunnel-sink.la \ + module-tunnel-source.la \ + module-position-event-sounds.la \ + module-augment-properties.la \ + module-role-cork.la \ + module-loopback.la \ + module-virtual-sink.la \ + module-virtual-source.la \ + module-virtual-surround-sink.la \ + module-switch-on-connect.la \ + module-switch-on-port-available.la \ + module-filter-apply.la \ + module-filter-heuristics.la \ + module-role-ducking.la \ + module-allow-passthrough.la + +if HAVE_ESOUND +modlibexec_LTLIBRARIES += \ + module-esound-protocol-tcp.la \ + module-esound-sink.la +endif + +# See comment at librtp.la above +if !OS_IS_WIN32 +modlibexec_LTLIBRARIES += \ + module-rtp-send.la \ + module-rtp-recv.la +endif + +if HAVE_AF_UNIX +modlibexec_LTLIBRARIES += \ + module-cli-protocol-unix.la \ + module-simple-protocol-unix.la \ + module-http-protocol-unix.la \ + module-native-protocol-unix.la +if HAVE_ESOUND +modlibexec_LTLIBRARIES += \ + module-esound-protocol-unix.la +endif +endif + +if HAVE_MKFIFO +modlibexec_LTLIBRARIES += \ + module-pipe-sink.la \ + module-pipe-source.la +endif + +if !OS_IS_WIN32 +if HAVE_ESOUND +modlibexec_LTLIBRARIES += \ + module-esound-compat-spawnfd.la \ + module-esound-compat-spawnpid.la +endif +endif + +if HAVE_REGEX +modlibexec_LTLIBRARIES += \ + module-match.la +endif + +if HAVE_X11 +modlibexec_LTLIBRARIES += \ + module-x11-bell.la \ + module-x11-publish.la \ + module-x11-xsmp.la \ + module-x11-cork-request.la +endif + +if HAVE_OSS_OUTPUT +modlibexec_LTLIBRARIES += \ + liboss-util.la \ + module-oss.la +endif + +if HAVE_COREAUDIO +modlibexec_LTLIBRARIES += \ + module-coreaudio-detect.la \ + module-coreaudio-device.la +endif + +pulselibexec_PROGRAMS = + +if HAVE_ALSA +modlibexec_LTLIBRARIES += \ + libalsa-util.la \ + module-alsa-sink.la \ + module-alsa-source.la \ + module-alsa-card.la + +dist_alsaprofilesets_DATA = \ + modules/alsa/mixer/profile-sets/default.conf \ + modules/alsa/mixer/profile-sets/force-speaker.conf \ + modules/alsa/mixer/profile-sets/force-speaker-and-int-mic.conf \ + modules/alsa/mixer/profile-sets/audigy.conf \ + modules/alsa/mixer/profile-sets/maudio-fasttrack-pro.conf \ + modules/alsa/mixer/profile-sets/native-instruments-audio4dj.conf \ + modules/alsa/mixer/profile-sets/native-instruments-audio8dj.conf \ + modules/alsa/mixer/profile-sets/native-instruments-traktor-audio2.conf \ + modules/alsa/mixer/profile-sets/native-instruments-traktor-audio6.conf \ + modules/alsa/mixer/profile-sets/native-instruments-traktor-audio10.conf \ + modules/alsa/mixer/profile-sets/native-instruments-traktorkontrol-s4.conf \ + modules/alsa/mixer/profile-sets/native-instruments-korecontroller.conf \ + modules/alsa/mixer/profile-sets/kinect-audio.conf \ + modules/alsa/mixer/profile-sets/sb-omni-surround-5.1.conf \ + modules/alsa/mixer/profile-sets/steelseries-arctis-common-usb-audio.conf \ + modules/alsa/mixer/profile-sets/usb-gaming-headset.conf \ + modules/alsa/mixer/profile-sets/dell-dock-tb16-usb-audio.conf \ + modules/alsa/mixer/profile-sets/cmedia-high-speed-true-hdaudio.conf + +if HAVE_UDEV +dist_udevrules_DATA = \ + modules/alsa/90-pulseaudio.rules +endif + +dist_alsapaths_DATA = \ + modules/alsa/mixer/paths/analog-input-aux.conf \ + modules/alsa/mixer/paths/analog-input.conf \ + modules/alsa/mixer/paths/analog-input.conf.common \ + modules/alsa/mixer/paths/analog-input-fm.conf \ + modules/alsa/mixer/paths/analog-input-linein.conf \ + modules/alsa/mixer/paths/analog-input-mic.conf \ + modules/alsa/mixer/paths/analog-input-dock-mic.conf \ + modules/alsa/mixer/paths/analog-input-front-mic.conf \ + modules/alsa/mixer/paths/analog-input-headphone-mic.conf \ + modules/alsa/mixer/paths/analog-input-headset-mic.conf \ + modules/alsa/mixer/paths/analog-input-internal-mic.conf \ + modules/alsa/mixer/paths/analog-input-internal-mic-always.conf \ + modules/alsa/mixer/paths/analog-input-rear-mic.conf \ + modules/alsa/mixer/paths/analog-input-mic.conf.common \ + modules/alsa/mixer/paths/analog-input-mic-line.conf \ + modules/alsa/mixer/paths/analog-input-tvtuner.conf \ + modules/alsa/mixer/paths/analog-input-video.conf \ + modules/alsa/mixer/paths/analog-output.conf \ + modules/alsa/mixer/paths/analog-output-speaker.conf \ + modules/alsa/mixer/paths/analog-output-speaker-always.conf \ + modules/alsa/mixer/paths/analog-output.conf.common \ + modules/alsa/mixer/paths/analog-output-headphones.conf \ + modules/alsa/mixer/paths/analog-output-headphones-2.conf \ + modules/alsa/mixer/paths/analog-output-lineout.conf \ + modules/alsa/mixer/paths/analog-output-mono.conf \ + modules/alsa/mixer/paths/iec958-stereo-input.conf \ + modules/alsa/mixer/paths/iec958-stereo-output.conf \ + modules/alsa/mixer/paths/hdmi-output-0.conf \ + modules/alsa/mixer/paths/hdmi-output-1.conf \ + modules/alsa/mixer/paths/hdmi-output-2.conf \ + modules/alsa/mixer/paths/hdmi-output-3.conf \ + modules/alsa/mixer/paths/hdmi-output-4.conf \ + modules/alsa/mixer/paths/hdmi-output-5.conf \ + modules/alsa/mixer/paths/hdmi-output-6.conf \ + modules/alsa/mixer/paths/hdmi-output-7.conf \ + modules/alsa/mixer/paths/steelseries-arctis-output-chat-common.conf \ + modules/alsa/mixer/paths/steelseries-arctis-output-game-common.conf \ + modules/alsa/mixer/paths/usb-gaming-headset-input.conf \ + modules/alsa/mixer/paths/usb-gaming-headset-output-mono.conf \ + modules/alsa/mixer/paths/usb-gaming-headset-output-stereo.conf + +endif + +if HAVE_SOLARIS +modlibexec_LTLIBRARIES += \ + module-solaris.la +endif + +if HAVE_AVAHI +modlibexec_LTLIBRARIES += \ + module-zeroconf-publish.la \ + module-zeroconf-discover.la +endif + +if HAVE_BONJOUR +modlibexec_LTLIBRARIES += \ + module-bonjour-publish.la +endif + +if HAVE_LIRC +modlibexec_LTLIBRARIES += \ + module-lirc.la +endif + +if HAVE_EVDEV +modlibexec_LTLIBRARIES += \ + module-mmkbd-evdev.la +endif + +if HAVE_JACK +modlibexec_LTLIBRARIES += \ + module-jack-sink.la \ + module-jack-source.la + +if HAVE_DBUS +modlibexec_LTLIBRARIES += \ + module-jackdbus-detect.la +endif + +endif + +if HAVE_GCONF +modlibexec_LTLIBRARIES += \ + module-gconf.la + +pulselibexec_PROGRAMS += \ + gconf-helper +endif + +if HAVE_GSETTINGS +modlibexec_LTLIBRARIES += \ + module-gsettings.la + +pulselibexec_PROGRAMS += \ + gsettings-helper + +gsettingsdataconvert_DATA = \ + modules/gsettings/pulseaudio.convert +endif + +if HAVE_WAVEOUT +modlibexec_LTLIBRARIES += \ + module-waveout.la +endif + +if HAVE_HAL_COMPAT +modlibexec_LTLIBRARIES += \ + module-hal-detect.la +endif + +if HAVE_UDEV +modlibexec_LTLIBRARIES += \ + module-udev-detect.la +endif + +if HAVE_SYSTEMD_LOGIN +modlibexec_LTLIBRARIES += \ + module-systemd-login.la +endif + +if HAVE_DBUS +modlibexec_LTLIBRARIES += \ + module-rygel-media-server.la \ + module-dbus-protocol.la +endif + +if HAVE_BLUEZ +modlibexec_LTLIBRARIES += \ + module-bluetooth-discover.la \ + module-bluetooth-policy.la +endif + +if HAVE_BLUEZ_5 +modlibexec_LTLIBRARIES += \ + libbluez5-util.la \ + module-bluez5-discover.la \ + module-bluez5-device.la +endif + +# RAOP depends on RTP, and we don't support RTP on Windows, see comment at +# librtp.la above. +if !OS_IS_WIN32 +if HAVE_OPENSSL +modlibexec_LTLIBRARIES += \ + libraop.la \ + module-raop-sink.la +if HAVE_AVAHI +modlibexec_LTLIBRARIES += \ + module-raop-discover.la +endif +endif +endif + +if HAVE_DBUS +if HAVE_FFTW +modlibexec_LTLIBRARIES += \ + module-equalizer-sink.la +bin_SCRIPTS += utils/qpaeq +endif +endif + +# Simple protocol + +module_simple_protocol_tcp_la_SOURCES = modules/module-protocol-stub.c +module_simple_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_SIMPLE $(AM_CFLAGS) -DPA_MODULE_NAME=module_simple_protocol_tcp +module_simple_protocol_tcp_la_LDFLAGS = $(MODULE_LDFLAGS) +module_simple_protocol_tcp_la_LIBADD = $(MODULE_LIBADD) libprotocol-simple.la + +module_simple_protocol_unix_la_SOURCES = modules/module-protocol-stub.c +module_simple_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_SIMPLE $(AM_CFLAGS) -DPA_MODULE_NAME=module_simple_protocol_unix +module_simple_protocol_unix_la_LDFLAGS = $(MODULE_LDFLAGS) +module_simple_protocol_unix_la_LIBADD = $(MODULE_LIBADD) libprotocol-simple.la + +# CLI protocol + +module_cli_la_SOURCES = modules/module-cli.c +module_cli_la_LDFLAGS = $(MODULE_LDFLAGS) +module_cli_la_LIBADD = $(MODULE_LIBADD) libcli.la +module_cli_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_cli + +module_cli_protocol_tcp_la_SOURCES = modules/module-protocol-stub.c +module_cli_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_CLI $(AM_CFLAGS) -DPA_MODULE_NAME=module_cli_protocol_tcp +module_cli_protocol_tcp_la_LDFLAGS = $(MODULE_LDFLAGS) +module_cli_protocol_tcp_la_LIBADD = $(MODULE_LIBADD) libprotocol-cli.la + +module_cli_protocol_unix_la_SOURCES = modules/module-protocol-stub.c +module_cli_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_CLI $(AM_CFLAGS) -DPA_MODULE_NAME=module_cli_protocol_unix +module_cli_protocol_unix_la_LDFLAGS = $(MODULE_LDFLAGS) +module_cli_protocol_unix_la_LIBADD = $(MODULE_LIBADD) libprotocol-cli.la + +# HTTP protocol + +module_http_protocol_tcp_la_SOURCES = modules/module-protocol-stub.c +module_http_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_HTTP $(AM_CFLAGS) -DPA_MODULE_NAME=module_http_protocol_tcp +module_http_protocol_tcp_la_LDFLAGS = $(MODULE_LDFLAGS) +module_http_protocol_tcp_la_LIBADD = $(MODULE_LIBADD) libprotocol-http.la + +module_http_protocol_unix_la_SOURCES = modules/module-protocol-stub.c +module_http_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_HTTP $(AM_CFLAGS) -DPA_MODULE_NAME=module_http_protocol_unix +module_http_protocol_unix_la_LDFLAGS = $(MODULE_LDFLAGS) +module_http_protocol_unix_la_LIBADD = $(MODULE_LIBADD) libprotocol-http.la + +# D-Bus protocol + +module_dbus_protocol_la_SOURCES = \ + modules/dbus/iface-card.c modules/dbus/iface-card.h \ + modules/dbus/iface-card-profile.c modules/dbus/iface-card-profile.h \ + modules/dbus/iface-client.c modules/dbus/iface-client.h \ + modules/dbus/iface-core.c modules/dbus/iface-core.h \ + modules/dbus/iface-device.c modules/dbus/iface-device.h \ + modules/dbus/iface-device-port.c modules/dbus/iface-device-port.h \ + modules/dbus/iface-memstats.c modules/dbus/iface-memstats.h \ + modules/dbus/iface-module.c modules/dbus/iface-module.h \ + modules/dbus/iface-sample.c modules/dbus/iface-sample.h \ + modules/dbus/iface-stream.c modules/dbus/iface-stream.h \ + modules/dbus/module-dbus-protocol.c +module_dbus_protocol_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) -DPA_MODULE_NAME=module_dbus_protocol +module_dbus_protocol_la_LDFLAGS = $(MODULE_LDFLAGS) +module_dbus_protocol_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS) + +# Native protocol + +module_native_protocol_tcp_la_SOURCES = modules/module-protocol-stub.c +module_native_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_NATIVE $(AM_CFLAGS) -DPA_MODULE_NAME=module_native_protocol_tcp +module_native_protocol_tcp_la_LDFLAGS = $(MODULE_LDFLAGS) +module_native_protocol_tcp_la_LIBADD = $(MODULE_LIBADD) libprotocol-native.la + +module_native_protocol_unix_la_SOURCES = modules/module-protocol-stub.c +module_native_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_NATIVE $(AM_CFLAGS) -DPA_MODULE_NAME=module_native_protocol_unix +module_native_protocol_unix_la_LDFLAGS = $(MODULE_LDFLAGS) +module_native_protocol_unix_la_LIBADD = $(MODULE_LIBADD) libprotocol-native.la + +module_native_protocol_fd_la_SOURCES = modules/module-native-protocol-fd.c +module_native_protocol_fd_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_native_protocol_fd +module_native_protocol_fd_la_LDFLAGS = $(MODULE_LDFLAGS) +module_native_protocol_fd_la_LIBADD = $(MODULE_LIBADD) libprotocol-native.la + +# EsounD protocol + +if HAVE_ESOUND +module_esound_protocol_tcp_la_SOURCES = modules/module-protocol-stub.c +module_esound_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_ESOUND $(AM_CFLAGS) -DPA_MODULE_NAME=module_esound_protocol_tcp +module_esound_protocol_tcp_la_LDFLAGS = $(MODULE_LDFLAGS) +module_esound_protocol_tcp_la_LIBADD = $(MODULE_LIBADD) libprotocol-esound.la + +module_esound_protocol_unix_la_SOURCES = modules/module-protocol-stub.c +module_esound_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_ESOUND $(AM_CFLAGS) -DPA_MODULE_NAME=module_esound_protocol_unix +module_esound_protocol_unix_la_LDFLAGS = $(MODULE_LDFLAGS) +module_esound_protocol_unix_la_LIBADD = $(MODULE_LIBADD) libprotocol-esound.la + +module_esound_compat_spawnfd_la_SOURCES = modules/module-esound-compat-spawnfd.c +module_esound_compat_spawnfd_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_esound_compat_spawnfd +module_esound_compat_spawnfd_la_LDFLAGS = $(MODULE_LDFLAGS) +module_esound_compat_spawnfd_la_LIBADD = $(MODULE_LIBADD) + +module_esound_compat_spawnpid_la_SOURCES = modules/module-esound-compat-spawnpid.c +module_esound_compat_spawnpid_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_esound_compat_spawnpid +module_esound_compat_spawnpid_la_LDFLAGS = $(MODULE_LDFLAGS) +module_esound_compat_spawnpid_la_LIBADD = $(MODULE_LIBADD) + +module_esound_sink_la_SOURCES = modules/module-esound-sink.c +module_esound_sink_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_esound_sink +module_esound_sink_la_LDFLAGS = $(MODULE_LDFLAGS) $(WINSOCK_LIBS) +module_esound_sink_la_LIBADD = $(MODULE_LIBADD) +endif + +# Pipes + +module_pipe_sink_la_SOURCES = modules/module-pipe-sink.c +module_pipe_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_pipe_sink_la_LIBADD = $(MODULE_LIBADD) +module_pipe_sink_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_pipe_sink + +module_pipe_source_la_SOURCES = modules/module-pipe-source.c +module_pipe_source_la_LDFLAGS = $(MODULE_LDFLAGS) +module_pipe_source_la_LIBADD = $(MODULE_LIBADD) +module_pipe_source_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_pipe_source + +# Fake sources/sinks + +module_sine_la_SOURCES = modules/module-sine.c +module_sine_la_LDFLAGS = $(MODULE_LDFLAGS) +module_sine_la_LIBADD = $(MODULE_LIBADD) +module_sine_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_sine + +module_null_sink_la_SOURCES = modules/module-null-sink.c +module_null_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_null_sink_la_LIBADD = $(MODULE_LIBADD) +module_null_sink_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_null_sink + +module_null_source_la_SOURCES = modules/module-null-source.c +module_null_source_la_LDFLAGS = $(MODULE_LDFLAGS) +module_null_source_la_LIBADD = $(MODULE_LIBADD) +module_null_source_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_null_source + +module_sine_source_la_SOURCES = modules/module-sine-source.c +module_sine_source_la_LDFLAGS = $(MODULE_LDFLAGS) +module_sine_source_la_LIBADD = $(MODULE_LIBADD) +module_sine_source_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_sine_source + +# Couplings + +module_combine_la_SOURCES = modules/module-combine.c +module_combine_la_LDFLAGS = $(MODULE_LDFLAGS) +module_combine_la_LIBADD = $(MODULE_LIBADD) +module_combine_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_combine + +module_combine_sink_la_SOURCES = modules/module-combine-sink.c +module_combine_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_combine_sink_la_LIBADD = $(MODULE_LIBADD) +module_combine_sink_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_combine_sink + +module_switch_on_connect_la_SOURCES = modules/module-switch-on-connect.c +module_switch_on_connect_la_LDFLAGS = $(MODULE_LDFLAGS) +module_switch_on_connect_la_LIBADD = $(MODULE_LIBADD) +module_switch_on_connect_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_switch_on_connect + +module_switch_on_port_available_la_SOURCES = modules/module-switch-on-port-available.c +module_switch_on_port_available_la_LDFLAGS = $(MODULE_LDFLAGS) +module_switch_on_port_available_la_LIBADD = $(MODULE_LIBADD) +module_switch_on_port_available_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_switch_on_port_available + +module_filter_apply_la_SOURCES = modules/module-filter-apply.c +module_filter_apply_la_LDFLAGS = $(MODULE_LDFLAGS) +module_filter_apply_la_LIBADD = $(MODULE_LIBADD) +module_filter_apply_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_filter_apply + +module_filter_heuristics_la_SOURCES = modules/module-filter-heuristics.c +module_filter_heuristics_la_LDFLAGS = $(MODULE_LDFLAGS) +module_filter_heuristics_la_LIBADD = $(MODULE_LIBADD) +module_filter_heuristics_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_filter_heuristics + +module_remap_sink_la_SOURCES = modules/module-remap-sink.c +module_remap_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_remap_sink_la_LIBADD = $(MODULE_LIBADD) +module_remap_sink_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_remap_sink + +module_remap_source_la_SOURCES = modules/module-remap-source.c +module_remap_source_la_LDFLAGS = $(MODULE_LDFLAGS) +module_remap_source_la_LIBADD = $(MODULE_LIBADD) +module_remap_source_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_remap_source + +module_ladspa_sink_la_SOURCES = modules/module-ladspa-sink.c modules/ladspa.h +module_ladspa_sink_la_CFLAGS = -DLADSPA_PATH="$(libdir)/ladspa:/usr/local/lib/ladspa:/usr/lib/ladspa:/usr/local/lib64/ladspa:/usr/lib64/ladspa" $(AM_CFLAGS) $(SERVER_CFLAGS) -DPA_MODULE_NAME=module_ladspa_sink +module_ladspa_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_ladspa_sink_la_LIBADD = $(MODULE_LIBADD) $(LIBLTDL) + +if HAVE_DBUS +module_ladspa_sink_la_CFLAGS += $(DBUS_CFLAGS) +module_ladspa_sink_la_LIBADD += $(DBUS_LIBS) +endif + +module_equalizer_sink_la_SOURCES = modules/module-equalizer-sink.c +module_equalizer_sink_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) $(DBUS_CFLAGS) $(FFTW_CFLAGS) -DPA_MODULE_NAME=module_equalizer_sink +module_equalizer_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_equalizer_sink_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS) $(FFTW_LIBS) + +module_match_la_SOURCES = modules/module-match.c +module_match_la_LDFLAGS = $(MODULE_LDFLAGS) +module_match_la_LIBADD = $(MODULE_LIBADD) +module_match_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_match + +module_tunnel_sink_new_la_SOURCES = modules/module-tunnel-sink-new.c +module_tunnel_sink_new_la_LDFLAGS = $(MODULE_LDFLAGS) +module_tunnel_sink_new_la_LIBADD = $(MODULE_LIBADD) +module_tunnel_sink_new_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_tunnel_sink_new + +module_tunnel_source_new_la_SOURCES = modules/module-tunnel-source-new.c +module_tunnel_source_new_la_LDFLAGS = $(MODULE_LDFLAGS) +module_tunnel_source_new_la_LIBADD = $(MODULE_LIBADD) +module_tunnel_source_new_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_tunnel_source_new + +module_tunnel_sink_la_SOURCES = modules/module-tunnel.c +module_tunnel_sink_la_CFLAGS = -DTUNNEL_SINK=1 $(AM_CFLAGS) $(X11_CFLAGS) -DPA_MODULE_NAME=module_tunnel_sink +module_tunnel_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_tunnel_sink_la_LIBADD = $(MODULE_LIBADD) $(X11_LIBS) + +module_tunnel_source_la_SOURCES = modules/module-tunnel.c +module_tunnel_source_la_LDFLAGS = $(MODULE_LDFLAGS) +module_tunnel_source_la_LIBADD = $(MODULE_LIBADD) $(X11_LIBS) +module_tunnel_source_la_CFLAGS = $(AM_CFLAGS) $(X11_CFLAGS) -DPA_MODULE_NAME=module_tunnel_source + +module_loopback_la_SOURCES = modules/module-loopback.c +module_loopback_la_LDFLAGS = $(MODULE_LDFLAGS) +module_loopback_la_LIBADD = $(MODULE_LIBADD) +module_loopback_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_loopback + +module_virtual_sink_la_SOURCES = modules/module-virtual-sink.c +module_virtual_sink_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) -DPA_MODULE_NAME=module_virtual_sink +module_virtual_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_virtual_sink_la_LIBADD = $(MODULE_LIBADD) + +module_virtual_source_la_SOURCES = modules/module-virtual-source.c +module_virtual_source_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) -DPA_MODULE_NAME=module_virtual_source +module_virtual_source_la_LDFLAGS = $(MODULE_LDFLAGS) +module_virtual_source_la_LIBADD = $(MODULE_LIBADD) + +module_virtual_surround_sink_la_SOURCES = modules/module-virtual-surround-sink.c +module_virtual_surround_sink_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) -DPA_MODULE_NAME=module_virtual_surround_sink +module_virtual_surround_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_virtual_surround_sink_la_LIBADD = $(MODULE_LIBADD) + +# X11 + +module_x11_bell_la_SOURCES = modules/x11/module-x11-bell.c +module_x11_bell_la_CFLAGS = $(AM_CFLAGS) $(X11_CFLAGS) -DPA_MODULE_NAME=module_x11_bell +module_x11_bell_la_LDFLAGS = $(MODULE_LDFLAGS) +module_x11_bell_la_LIBADD = $(MODULE_LIBADD) $(X11_LIBS) + +module_x11_publish_la_SOURCES = modules/x11/module-x11-publish.c +module_x11_publish_la_CFLAGS = $(AM_CFLAGS) $(X11_CFLAGS) -DPA_MODULE_NAME=module_x11_publish +module_x11_publish_la_LDFLAGS = $(MODULE_LDFLAGS) +module_x11_publish_la_LIBADD = $(MODULE_LIBADD) libprotocol-native.la $(X11_LIBS) + +module_x11_xsmp_la_SOURCES = modules/x11/module-x11-xsmp.c +module_x11_xsmp_la_CFLAGS = $(AM_CFLAGS) $(X11_CFLAGS) -DPA_MODULE_NAME=module_x11_xsmp +module_x11_xsmp_la_LDFLAGS = $(MODULE_LDFLAGS) +module_x11_xsmp_la_LIBADD = $(MODULE_LIBADD) $(X11_LIBS) + +module_x11_cork_request_la_SOURCES = modules/x11/module-x11-cork-request.c +module_x11_cork_request_la_CFLAGS = $(AM_CFLAGS) $(X11_CFLAGS) -DPA_MODULE_NAME=module_x11_cork_request +module_x11_cork_request_la_LDFLAGS = $(MODULE_LDFLAGS) +module_x11_cork_request_la_LIBADD = $(MODULE_LIBADD) $(X11_LIBS) + +# OSS + +liboss_util_la_SOURCES = modules/oss/oss-util.c modules/oss/oss-util.h +liboss_util_la_LDFLAGS = -avoid-version +liboss_util_la_LIBADD = $(MODULE_LIBADD) + +module_oss_la_SOURCES = modules/oss/module-oss.c +module_oss_la_LDFLAGS = $(MODULE_LDFLAGS) +module_oss_la_LIBADD = $(MODULE_LIBADD) liboss-util.la +module_oss_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_oss + +# COREAUDIO + +module_coreaudio_detect_la_SOURCES = modules/macosx/module-coreaudio-detect.c +module_coreaudio_detect_la_LDFLAGS = $(MODULE_LDFLAGS) \ + -Wl,-framework -Wl,Cocoa -framework CoreAudio \ + -Wl,-framework -Wl,AudioUnit -framework AudioUnit +module_coreaudio_detect_la_LIBADD = $(MODULE_LIBADD) +module_coreaudio_detect_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_coreaudio_detect + +module_coreaudio_device_la_SOURCES = modules/macosx/module-coreaudio-device.c +module_coreaudio_device_la_LDFLAGS = $(MODULE_LDFLAGS) \ + -Wl,-framework -Wl,Cocoa -framework CoreAudio \ + -Wl,-framework -Wl,AudioUnit -framework AudioUnit +module_coreaudio_device_la_LIBADD = $(MODULE_LIBADD) +module_coreaudio_device_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_coreaudio_device + +# ALSA + +libalsa_util_la_SOURCES = \ + modules/alsa/alsa-util.c modules/alsa/alsa-util.h \ + modules/alsa/alsa-ucm.c modules/alsa/alsa-ucm.h \ + modules/alsa/alsa-mixer.c modules/alsa/alsa-mixer.h \ + modules/alsa/alsa-sink.c modules/alsa/alsa-sink.h \ + modules/alsa/alsa-source.c modules/alsa/alsa-source.h \ + modules/reserve-wrap.c modules/reserve-wrap.h +libalsa_util_la_LDFLAGS = -avoid-version +libalsa_util_la_LIBADD = $(MODULE_LIBADD) $(ASOUNDLIB_LIBS) +libalsa_util_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) $(ASOUNDLIB_CFLAGS) + +if HAVE_UDEV +libalsa_util_la_SOURCES += modules/udev-util.h modules/udev-util.c +libalsa_util_la_LIBADD += $(UDEV_LIBS) +libalsa_util_la_CFLAGS += $(UDEV_CFLAGS) +endif + +if HAVE_DBUS +libalsa_util_la_SOURCES += modules/reserve.h modules/reserve.c modules/reserve-monitor.h modules/reserve-monitor.c +libalsa_util_la_LIBADD += $(DBUS_LIBS) +libalsa_util_la_CFLAGS += $(DBUS_CFLAGS) +endif + +module_alsa_sink_la_SOURCES = modules/alsa/module-alsa-sink.c +module_alsa_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_alsa_sink_la_LIBADD = $(MODULE_LIBADD) $(ASOUNDLIB_LIBS) libalsa-util.la +module_alsa_sink_la_CFLAGS = $(AM_CFLAGS) $(ASOUNDLIB_CFLAGS) -DPA_MODULE_NAME=module_alsa_sink + +module_alsa_source_la_SOURCES = modules/alsa/module-alsa-source.c +module_alsa_source_la_LDFLAGS = $(MODULE_LDFLAGS) +module_alsa_source_la_LIBADD = $(MODULE_LIBADD) $(ASOUNDLIB_LIBS) libalsa-util.la +module_alsa_source_la_CFLAGS = $(AM_CFLAGS) $(ASOUNDLIB_CFLAGS) -DPA_MODULE_NAME=module_alsa_source + +module_alsa_card_la_SOURCES = modules/alsa/module-alsa-card.c +module_alsa_card_la_LDFLAGS = $(MODULE_LDFLAGS) +module_alsa_card_la_LIBADD = $(MODULE_LIBADD) $(ASOUNDLIB_LIBS) libalsa-util.la +module_alsa_card_la_CFLAGS = $(AM_CFLAGS) $(ASOUNDLIB_CFLAGS) -DPA_MODULE_NAME=module_alsa_card + +# Solaris + +module_solaris_la_SOURCES = modules/module-solaris.c +module_solaris_la_LDFLAGS = $(MODULE_LDFLAGS) +module_solaris_la_LIBADD = $(MODULE_LIBADD) +module_solaris_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_solaris + +# Avahi + +module_zeroconf_publish_la_SOURCES = modules/module-zeroconf-publish.c +module_zeroconf_publish_la_LDFLAGS = $(MODULE_LDFLAGS) +module_zeroconf_publish_la_LIBADD = $(MODULE_LIBADD) $(AVAHI_LIBS) $(DBUS_LIBS) libavahi-wrap.la libprotocol-native.la +module_zeroconf_publish_la_CFLAGS = $(AM_CFLAGS) $(AVAHI_CFLAGS) $(DBUS_CFLAGS) -DPA_MODULE_NAME=module_zeroconf_publish + +module_zeroconf_discover_la_SOURCES = modules/module-zeroconf-discover.c +module_zeroconf_discover_la_LDFLAGS = $(MODULE_LDFLAGS) +module_zeroconf_discover_la_LIBADD = $(MODULE_LIBADD) $(AVAHI_LIBS) libavahi-wrap.la +module_zeroconf_discover_la_CFLAGS = $(AM_CFLAGS) $(AVAHI_CFLAGS) -DPA_MODULE_NAME=module_zeroconf_discover + +# Bonjour + +module_bonjour_publish_la_SOURCES = modules/macosx/module-bonjour-publish.c +module_bonjour_publish_la_LDFLAGS = $(MODULE_LDFLAGS) \ + -Wl,-framework -Wl,CoreFoundation -framework CoreFoundation +module_bonjour_publish_la_LIBADD = $(MODULE_LIBADD) libprotocol-native.la +module_bonjour_publish_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_bonjour_publish + +# LIRC + +module_lirc_la_SOURCES = modules/module-lirc.c +module_lirc_la_LDFLAGS = $(MODULE_LDFLAGS) +module_lirc_la_LIBADD = $(MODULE_LIBADD) $(LIRC_LIBS) +module_lirc_la_CFLAGS = $(AM_CFLAGS) $(LIRC_CFLAGS) -DPA_MODULE_NAME=module_lirc + + +# Linux evdev + +module_mmkbd_evdev_la_SOURCES = modules/module-mmkbd-evdev.c +module_mmkbd_evdev_la_LDFLAGS = $(MODULE_LDFLAGS) +module_mmkbd_evdev_la_LIBADD = $(MODULE_LIBADD) +module_mmkbd_evdev_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_mmkbd_evdev + +# Windows waveout +module_waveout_la_SOURCES = modules/module-waveout.c +module_waveout_la_LDFLAGS = $(MODULE_LDFLAGS) +module_waveout_la_LIBADD = $(MODULE_LIBADD) -lwinmm +module_waveout_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_waveout + +# Hardware autodetection module +module_detect_la_SOURCES = modules/module-detect.c +module_detect_la_LDFLAGS = $(MODULE_LDFLAGS) +module_detect_la_LIBADD = $(MODULE_LIBADD) +module_detect_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_detect + +# Volume restore module +module_volume_restore_la_SOURCES = modules/module-volume-restore.c +module_volume_restore_la_LDFLAGS = $(MODULE_LDFLAGS) +module_volume_restore_la_LIBADD = $(MODULE_LIBADD) +module_volume_restore_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_volume_restore + +# Position event sounds in space +module_position_event_sounds_la_SOURCES = modules/module-position-event-sounds.c +module_position_event_sounds_la_LDFLAGS = $(MODULE_LDFLAGS) +module_position_event_sounds_la_LIBADD = $(MODULE_LIBADD) +module_position_event_sounds_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_position_event_sounds + +# Ducking effect based on stream roles +module_role_ducking_la_SOURCES = modules/module-role-ducking.c \ + modules/stream-interaction.c modules/stream-interaction.h +module_role_ducking_la_LDFLAGS = $(MODULE_LDFLAGS) +module_role_ducking_la_LIBADD = $(MODULE_LIBADD) +module_role_ducking_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_role_ducking + +# Augment properties from XDG .desktop files +module_augment_properties_la_SOURCES = modules/module-augment-properties.c +module_augment_properties_la_LDFLAGS = $(MODULE_LDFLAGS) +module_augment_properties_la_LIBADD = $(MODULE_LIBADD) +#module_augment_properties_la_CFLAGS = $(AM_CFLAGS) -DDESKTOPFILEDIR=\"$(datadir)/applications\" +module_augment_properties_la_CFLAGS = $(AM_CFLAGS) -DDESKTOPFILEDIR=\"/usr/share/applications\" -DPA_MODULE_NAME=module_augment_properties + +# Cork certain streams while others are active (e.g. cork music when phone streams appear) +module_role_cork_la_SOURCES = modules/module-role-cork.c \ + modules/stream-interaction.c modules/stream-interaction.h +module_role_cork_la_LDFLAGS = $(MODULE_LDFLAGS) +module_role_cork_la_LIBADD = $(MODULE_LIBADD) +module_role_cork_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_role_cork + +# Device description restore module +module_device_manager_la_SOURCES = modules/module-device-manager.c +module_device_manager_la_LDFLAGS = $(MODULE_LDFLAGS) +module_device_manager_la_LIBADD = $(MODULE_LIBADD) libprotocol-native.la +module_device_manager_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_device_manager + +# Device volume/muted restore module +module_device_restore_la_SOURCES = modules/module-device-restore.c +module_device_restore_la_LDFLAGS = $(MODULE_LDFLAGS) +module_device_restore_la_LIBADD = $(MODULE_LIBADD) libprotocol-native.la +module_device_restore_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_device_restore + +if HAVE_DBUS +module_device_restore_la_LIBADD += $(DBUS_LIBS) +module_device_restore_la_CFLAGS += $(DBUS_CFLAGS) +endif + +# Stream volume/muted/device restore module +module_stream_restore_la_SOURCES = modules/module-stream-restore.c +module_stream_restore_la_LDFLAGS = $(MODULE_LDFLAGS) +module_stream_restore_la_LIBADD = $(MODULE_LIBADD) libprotocol-native.la +module_stream_restore_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_stream_restore + +if HAVE_DBUS +module_stream_restore_la_LIBADD += $(DBUS_LIBS) +module_stream_restore_la_CFLAGS += $(DBUS_CFLAGS) +endif + +# Card profile restore module +module_card_restore_la_SOURCES = modules/module-card-restore.c +module_card_restore_la_LDFLAGS = $(MODULE_LDFLAGS) +module_card_restore_la_LIBADD = $(MODULE_LIBADD) +module_card_restore_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_card_restore + +# Default sink/source restore module +module_default_device_restore_la_SOURCES = modules/module-default-device-restore.c +module_default_device_restore_la_LDFLAGS = $(MODULE_LDFLAGS) +module_default_device_restore_la_LIBADD = $(MODULE_LIBADD) +module_default_device_restore_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_default_device_restore + +# Always Sink module +module_always_sink_la_SOURCES = modules/module-always-sink.c +module_always_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_always_sink_la_LIBADD = $(MODULE_LIBADD) +module_always_sink_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_always_sink + +# Always Source module +module_always_source_la_SOURCES = modules/module-always-source.c +module_always_source_la_LDFLAGS = $(MODULE_LDFLAGS) +module_always_source_la_LIBADD = $(MODULE_LIBADD) +module_always_source_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_always_source + +# Rescue streams module +module_rescue_streams_la_SOURCES = modules/module-rescue-streams.c +module_rescue_streams_la_LDFLAGS = $(MODULE_LDFLAGS) +module_rescue_streams_la_LIBADD = $(MODULE_LIBADD) +module_rescue_streams_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_rescue_streams + +# Automatically move streams to devices that are intended for their roles +module_intended_roles_la_SOURCES = modules/module-intended-roles.c +module_intended_roles_la_LDFLAGS = $(MODULE_LDFLAGS) +module_intended_roles_la_LIBADD = $(MODULE_LIBADD) +module_intended_roles_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_intended_roles + +# Suspend-on-idle module +module_suspend_on_idle_la_SOURCES = modules/module-suspend-on-idle.c +module_suspend_on_idle_la_LDFLAGS = $(MODULE_LDFLAGS) +module_suspend_on_idle_la_LIBADD = $(MODULE_LIBADD) +module_suspend_on_idle_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_suspend_on_idle + +# echo-cancel module +module_echo_cancel_la_SOURCES = \ + modules/echo-cancel/module-echo-cancel.c \ + modules/echo-cancel/null.c \ + modules/echo-cancel/echo-cancel.h +module_echo_cancel_la_LDFLAGS = $(MODULE_LDFLAGS) +module_echo_cancel_la_LIBADD = $(MODULE_LIBADD) +module_echo_cancel_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) -DPA_MODULE_NAME=module_echo_cancel +if HAVE_ADRIAN_EC +module_echo_cancel_la_SOURCES += \ + modules/echo-cancel/adrian-aec.c modules/echo-cancel/adrian-aec.h \ + modules/echo-cancel/adrian.c modules/echo-cancel/adrian.h +module_echo_cancel_la_CFLAGS += -DHAVE_ADRIAN_EC=1 +ORC_SOURCE += modules/echo-cancel/adrian-aec +if HAVE_ORC +nodist_module_echo_cancel_la_SOURCES = \ + modules/echo-cancel/adrian-aec-orc-gen.c \ + modules/echo-cancel/adrian-aec-orc-gen.h +module_echo_cancel_la_LIBADD += $(ORC_LIBS) +module_echo_cancel_la_CFLAGS += $(ORC_CFLAGS) -I$(top_builddir)/src/modules/echo-cancel +endif +endif +if HAVE_SPEEX +module_echo_cancel_la_SOURCES += modules/echo-cancel/speex.c +module_echo_cancel_la_CFLAGS += $(LIBSPEEX_CFLAGS) +module_echo_cancel_la_LIBADD += $(LIBSPEEX_LIBS) +endif +if HAVE_WEBRTC +# The webrtc code is split off into a helper library to avoid having automake +# link module-echo-cancel with C++ (which it does if there are any C++ deps, +# even conditional ones). + +libwebrtc_util_la_SOURCES = modules/echo-cancel/webrtc.cc +libwebrtc_util_la_CXXFLAGS = $(AM_CXXFLAGS) $(SERVER_CFLAGS) $(WEBRTC_CFLAGS) -DHAVE_WEBRTC=1 +libwebrtc_util_la_LIBADD = libpulsecore-@PA_MAJORMINOR@.la $(WEBRTC_LIBS) +libwebrtc_util_la_LDFLAGS = -avoid-version + +module_echo_cancel_la_CFLAGS += -DHAVE_WEBRTC=1 +module_echo_cancel_la_LIBADD += libwebrtc-util.la +endif + +# RTP modules +module_rtp_send_la_SOURCES = modules/rtp/module-rtp-send.c +module_rtp_send_la_LDFLAGS = $(MODULE_LDFLAGS) +module_rtp_send_la_LIBADD = $(MODULE_LIBADD) librtp.la +module_rtp_send_la_CFLAGS = $(AM_CFLAGS) $(GSTREAMER_CFLAGS) -DPA_MODULE_NAME=module_rtp_send + +module_rtp_recv_la_SOURCES = modules/rtp/module-rtp-recv.c +module_rtp_recv_la_LDFLAGS = $(MODULE_LDFLAGS) +module_rtp_recv_la_LIBADD = $(MODULE_LIBADD) librtp.la +module_rtp_recv_la_CFLAGS = $(AM_CFLAGS) $(GSTREAMER_CFLAGS) -DPA_MODULE_NAME=module_rtp_recv + +# JACK + +module_jackdbus_detect_la_SOURCES = modules/jack/module-jackdbus-detect.c +module_jackdbus_detect_la_LDFLAGS = $(MODULE_LDFLAGS) +module_jackdbus_detect_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS) $(JACK_LIBS) +module_jackdbus_detect_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) $(JACK_CFLAGS) -DPA_MODULE_NAME=module_jackdbus_detect + +module_jack_sink_la_SOURCES = modules/jack/module-jack-sink.c +module_jack_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_jack_sink_la_LIBADD = $(MODULE_LIBADD) $(JACK_LIBS) +module_jack_sink_la_CFLAGS = $(AM_CFLAGS) $(JACK_CFLAGS) -DPA_MODULE_NAME=module_jack_sink + +module_jack_source_la_SOURCES = modules/jack/module-jack-source.c +module_jack_source_la_LDFLAGS = $(MODULE_LDFLAGS) +module_jack_source_la_LIBADD = $(MODULE_LIBADD) $(JACK_LIBS) +module_jack_source_la_CFLAGS = $(AM_CFLAGS) $(JACK_CFLAGS) -DPA_MODULE_NAME=module_jack_source + +module_hal_detect_la_SOURCES = modules/module-hal-detect-compat.c +module_hal_detect_la_LIBADD = $(MODULE_LIBADD) +module_hal_detect_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_hal_detect +module_hal_detect_la_LDFLAGS = $(MODULE_LDFLAGS) + +module_udev_detect_la_SOURCES = modules/module-udev-detect.c +module_udev_detect_la_LDFLAGS = $(MODULE_LDFLAGS) +module_udev_detect_la_LIBADD = $(MODULE_LIBADD) $(UDEV_LIBS) +module_udev_detect_la_CFLAGS = $(AM_CFLAGS) $(UDEV_CFLAGS) -DPA_MODULE_NAME=module_udev_detect + +module_console_kit_la_SOURCES = modules/module-console-kit.c +module_console_kit_la_LDFLAGS = $(MODULE_LDFLAGS) +module_console_kit_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS) +module_console_kit_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) -DPA_MODULE_NAME=module_console_kit + +module_systemd_login_la_SOURCES = modules/module-systemd-login.c +module_systemd_login_la_LDFLAGS = $(MODULE_LDFLAGS) +module_systemd_login_la_LIBADD = $(MODULE_LIBADD) $(SYSTEMD_LIBS) $(SYSTEMDLOGIN_LIBS) +module_systemd_login_la_CFLAGS = $(AM_CFLAGS) $(SYSTEMD_CFLAGS) $(SYSTEMDLOGIN_CFLAGS) -DPA_MODULE_NAME=module_systemd_login + +# GConf support +module_gconf_la_SOURCES = \ + modules/stdin-util.c modules/stdin-util.h \ + modules/gconf/module-gconf.c + +module_gconf_la_LDFLAGS = $(MODULE_LDFLAGS) +module_gconf_la_LIBADD = $(MODULE_LIBADD) +module_gconf_la_CFLAGS = $(AM_CFLAGS) -DPA_GCONF_HELPER=\"$(pulselibexecdir)/gconf-helper\" -DPA_MODULE_NAME=module_gconf + +gconf_helper_SOURCES = modules/gconf/gconf-helper.c +gconf_helper_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la $(GCONF_LIBS) +gconf_helper_CFLAGS = $(AM_CFLAGS) $(GCONF_CFLAGS) +gconf_helper_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +# GSettings support +module_gsettings_la_SOURCES = \ + modules/stdin-util.c modules/stdin-util.h \ + modules/gsettings/module-gsettings.c +module_gsettings_la_LDFLAGS = $(MODULE_LDFLAGS) +module_gsettings_la_LIBADD = $(MODULE_LIBADD) +module_gsettings_la_CFLAGS = $(AM_CFLAGS) -DPA_GSETTINGS_HELPER=\"$(pulselibexecdir)/gsettings-helper\" -DPA_MODULE_NAME=module_gsettings + +gsettings_helper_SOURCES = modules/gsettings/gsettings-helper.c +gsettings_helper_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la $(GSETTINGS_LIBS) +gsettings_helper_CFLAGS = $(AM_CFLAGS) $(GSETTINGS_CFLAGS) +gsettings_helper_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +if HAVE_GSETTINGS +gsettings_SCHEMAS = modules/gsettings/org.freedesktop.pulseaudio.gschema.xml +@GSETTINGS_RULES@ +endif + +# Bluetooth policy +module_bluetooth_policy_la_SOURCES = modules/bluetooth/module-bluetooth-policy.c +module_bluetooth_policy_la_LDFLAGS = $(MODULE_LDFLAGS) +module_bluetooth_policy_la_LIBADD = $(MODULE_LIBADD) +module_bluetooth_policy_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) -DPA_MODULE_NAME=module_bluetooth_policy + +# Bluetooth discover +module_bluetooth_discover_la_SOURCES = modules/bluetooth/module-bluetooth-discover.c +module_bluetooth_discover_la_LDFLAGS = $(MODULE_LDFLAGS) +module_bluetooth_discover_la_LIBADD = $(MODULE_LIBADD) +module_bluetooth_discover_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_bluetooth_discover + +# Bluetooth BlueZ 5 sink / source +libbluez5_util_la_SOURCES = \ + modules/bluetooth/bluez5-util.c \ + modules/bluetooth/bluez5-util.h \ + modules/bluetooth/a2dp-codec-api.h \ + modules/bluetooth/a2dp-codec-util.c \ + modules/bluetooth/a2dp-codec-util.h \ + modules/bluetooth/a2dp-codecs.h \ + modules/bluetooth/rtp.h +if HAVE_BLUEZ_5_OFONO_HEADSET +libbluez5_util_la_SOURCES += \ + modules/bluetooth/backend-ofono.c +endif +if HAVE_BLUEZ_5_NATIVE_HEADSET +libbluez5_util_la_SOURCES += \ + modules/bluetooth/backend-native.c +endif + +libbluez5_util_la_LDFLAGS = -avoid-version +libbluez5_util_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS) +libbluez5_util_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) +libbluez5_util_la_CPPFLAGS = $(AM_CPPFLAGS) + +libbluez5_util_la_SOURCES += modules/bluetooth/a2dp-codec-sbc.c +libbluez5_util_la_LIBADD += $(SBC_LIBS) +libbluez5_util_la_CFLAGS += $(SBC_CFLAGS) + +module_bluez5_discover_la_SOURCES = modules/bluetooth/module-bluez5-discover.c +module_bluez5_discover_la_LDFLAGS = $(MODULE_LDFLAGS) +module_bluez5_discover_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS) libbluez5-util.la +module_bluez5_discover_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) -DPA_MODULE_NAME=module_bluez5_discover + +module_bluez5_device_la_SOURCES = modules/bluetooth/module-bluez5-device.c +module_bluez5_device_la_LDFLAGS = $(MODULE_LDFLAGS) +module_bluez5_device_la_LIBADD = $(MODULE_LIBADD) libbluez5-util.la +module_bluez5_device_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_bluez5_device + +# Apple Airtunes/RAOP +module_raop_sink_la_SOURCES = modules/raop/module-raop-sink.c +module_raop_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_raop_sink_la_LIBADD = $(MODULE_LIBADD) librtp.la libraop.la +module_raop_sink_la_CFLAGS = $(AM_CFLAGS) -I$(top_srcdir)/src/modules/rtp -DPA_MODULE_NAME=module_raop_sink + +module_raop_discover_la_SOURCES = modules/raop/module-raop-discover.c +module_raop_discover_la_LDFLAGS = $(MODULE_LDFLAGS) +module_raop_discover_la_LIBADD = $(MODULE_LIBADD) $(AVAHI_LIBS) libavahi-wrap.la +module_raop_discover_la_CFLAGS = $(AM_CFLAGS) $(AVAHI_CFLAGS) -DPA_MODULE_NAME=module_raop_discover + +# Rygel +module_rygel_media_server_la_SOURCES = modules/module-rygel-media-server.c +module_rygel_media_server_la_LDFLAGS = $(MODULE_LDFLAGS) +module_rygel_media_server_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS) libprotocol-http.la +module_rygel_media_server_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) -DPA_MODULE_NAME=module_rygel_media_server + +# Allow passthrough module +module_allow_passthrough_la_SOURCES = modules/module-allow-passthrough.c +module_allow_passthrough_la_LDFLAGS = $(MODULE_LDFLAGS) +module_allow_passthrough_la_LIBADD = $(MODULE_LIBADD) +module_allow_passthrough_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_allow_passthrough + +################################### +# Some minor stuff # +################################### + +CLEANFILES += daemon/pulseaudio.desktop +DISTCLEANFILES = esdcompat client.conf default.pa system.pa daemon.conf start-pulseaudio-x11 pulseaudio.service + +if OS_IS_WIN32 +SYMLINK_PROGRAM=cd $(DESTDIR)$(bindir) && cp +else +SYMLINK_PROGRAM=ln -sf +endif +install-exec-hook: + $(SYMLINK_PROGRAM) pacat$(EXEEXT) $(DESTDIR)$(bindir)/parec$(EXEEXT) + $(SYMLINK_PROGRAM) pacat$(EXEEXT) $(DESTDIR)$(bindir)/pamon$(EXEEXT) + $(SYMLINK_PROGRAM) pacat$(EXEEXT) $(DESTDIR)$(bindir)/paplay$(EXEEXT) + $(SYMLINK_PROGRAM) pacat$(EXEEXT) $(DESTDIR)$(bindir)/parecord$(EXEEXT) + rm -f $(DESTDIR)$(libdir)/libpulsedsp.la + rm -f $(DESTDIR)$(modlibexecdir)/*.la + +uninstall-hook: + rm -f $(DESTDIR)$(bindir)/parec$(EXEEXT) + rm -f $(DESTDIR)$(bindir)/pamon$(EXEEXT) + rm -f $(DESTDIR)$(bindir)/paplay$(EXEEXT) + rm -f $(DESTDIR)$(bindir)/parecord$(EXEEXT) + rm -f $(DESTDIR)$(libdir)/libpulsedsp.* + rm -f $(DESTDIR)$(modlibexecdir)/*.so + +massif: pulseaudio + libtool --mode=execute valgrind --tool=massif --depth=6 --alloc-fn=pa_xmalloc --alloc-fn=pa_xmalloc0 --alloc-fn=pa_xrealloc --alloc-fn=dbus_realloc --alloc-fn=pa_xnew0_internal --alloc-fn=pa_xnew_internal ./pulseaudio + +update-ffmpeg: + wget -O pulsecore/ffmpeg/resample2.c http://svn.mplayerhq.hu/ffmpeg/trunk/libavcodec/resample2.c?view=co + +update-reserve: + for i in reserve.c reserve.h reserve-monitor.c reserve-monitor.h ; do \ + wget -O $(top_srcdir)/src/modules/$$i http://git.0pointer.de/\?p=reserve.git\;a=blob_plain\;f=$$i\;hb=master ; \ + done + +update-rtkit: + for i in rtkit.c rtkit.h ; do \ + wget -O $(top_srcdir)/src/pulsecore/$$i http://git.0pointer.de/\?p=rtkit.git\;a=blob_plain\;f=$$i\;hb=master ; \ + done + +# Automatically generate linker version script. We use the same one for all public .sos +update-map-file: + ( echo "PULSE_0 {" ; \ + echo "global:" ; \ + ctags -I PA_GCC_MALLOC,PA_GCC_ALLOC_SIZE2,PA_GCC_ALLOC_SIZE,PA_GCC_PURE,PA_GCC_CONST,PA_GCC_DEPRECATED,PA_GCC_PRINTF_ATTR -f - --c-kinds=p $(pulseinclude_HEADERS) | awk '/^pa_/ { print $$1 ";" }' | sort ; \ + echo "local:" ; \ + echo "*;" ; \ + echo "};" ) > $(srcdir)/map-file + +update-all: update-ffmpeg update-map-file + +# Force installation order of libraries. libtool relinks on install time, in +# which case libpulsecommon has to be installed before others, but the padsp +# preload library has to be done after the normal libraries (e.g. libpulse) +# ... +# Unfortunately automake behaviour means that rules without commands also +# override build-in rules, so it's not trivial to add dependencies. +# See http://debbugs.gnu.org/cgi/bugreport.cgi?bug=7328 for the workaround +# ... +# Isn't libtool/autotools fun! + +installlibLTLIBRARIES = install-libLTLIBRARIES +$(installlibLTLIBRARIES): install-commonlibLTLIBRARIES + +installpkglibLTLIBRARIES = install-pkglibLTLIBRARIES +$(installpkglibLTLIBRARIES): install-libLTLIBRARIES + +installmodlibexecLTLIBRARIES = install-modlibexecLTLIBRARIES +$(installmodlibexecLTLIBRARIES): install-pkglibLTLIBRARIES install-libLTLIBRARIES + +installpadsplibLTLIBRARIES = install-padsplibLTLIBRARIES +$(installpadsplibLTLIBRARIES): install-libLTLIBRARIES + +if HAVE_GCOV +coverage: + @echo "" + @echo "Don't forget to run 'make check' before generating coverage stats." + @echo "" + lcov --capture --directory . --output-file $(builddir)/gcov-all.info + -rm -r $(builddir)/coverage + genhtml --output-directory $(builddir)/coverage gcov-all.info + @echo "" + @echo "Coverage data now available at: $(abs_builddir)/coverage/index.html" +else +coverage: + @echo "" + @echo "To generate coverage stats, rerun configure with '--enable-gcov'," + @echo "and don't forget to disable it again for regular builds." + @echo "" +endif + +.PHONY: massif update-all update-ffmpeg update-map-file coverage diff --git a/src/Makefile.in b/src/Makefile.in new file mode 100644 index 0000000..dd5f934 --- /dev/null +++ b/src/Makefile.in @@ -0,0 +1,13159 @@ +# Makefile.in generated by automake 1.16.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2018 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# This file is part of PulseAudio. +# +# Copyright 2004-2006 Lennart Poettering +# Copyright 2006 Pierre Ossman for Cendio AB +# Copyright 2006 Diego Pettenò +# +# PulseAudio 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 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +################################### +# Extra directories # +################################### + +# +# This is a Makefile.am fragment to build Orc code. It is based +# on the orc.mak file distributed in the GStreamer common +# repository. +# +# Include this file like this: +# +# include $(top_srcdir)/orc.mak +# +# For each Orc source file, append its name (without the extension) +# to ORC_SOURCE: +# +# ORC_SOURCE += gstadderorc +# +# This will create gstadder-orc-gen.c and gstadder-orc-gen.h, which +# you need to add to your nodist_module_SOURCES. +# +# Note that this file appends to BUILT_SOURCES and CLEANFILES, so +# define them before including this file. +# + + + + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@HAVE_GCOV_TRUE@am__append_1 = $(GCOV_CFLAGS) +@HAVE_GCOV_TRUE@am__append_2 = $(GCOV_CFLAGS) +@HAVE_GCOV_TRUE@am__append_3 = $(GCOV_LIBS) +@OS_IS_WIN32_TRUE@am__append_4 = -Wl,--export-all-symbols,--enable-auto-import -no-undefined +@OS_IS_DARWIN_TRUE@am__append_5 = -Wl,-headerpad_max_install_names -headerpad_max_install_names +@HAVE_ORC_TRUE@am__append_6 = $(ORC_BUILT_SOURCE) $(ORC_BUILT_HEADER) +@HAVE_ORC_TRUE@am__append_7 = $(BUILT_SOURCES) +bin_PROGRAMS = pulseaudio$(EXEEXT) pacat$(EXEEXT) pactl$(EXEEXT) \ + $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) +@HAVE_DBUS_TRUE@am__append_8 = $(DBUS_CFLAGS) +@HAVE_DBUS_TRUE@am__append_9 = daemon/server-lookup.c daemon/server-lookup.h +@HAVE_DBUS_TRUE@am__append_10 = $(DBUS_LIBS) +@HAVE_SYSTEMD_DAEMON_TRUE@am__append_11 = $(SYSTEMD_FLAGS) $(SYSTEMDDAEMON_FLAGS) +@HAVE_SYSTEMD_DAEMON_TRUE@am__append_12 = $(SYSTEMD_LIBS) $(SYSTEMDDAEMON_LIBS) +@HAVE_ESOUND_TRUE@am__append_13 = esdcompat +@OS_IS_WIN32_FALSE@am__append_14 = pasuspender +@HAVE_AF_UNIX_TRUE@am__append_15 = pacmd +@HAVE_X11_TRUE@am__append_16 = pax11publish +@HAVE_X11_TRUE@am__append_17 = start-pulseaudio-x11 +@OS_IS_WIN32_FALSE@am__append_18 = \ +@OS_IS_WIN32_FALSE@ sigbus-test \ +@OS_IS_WIN32_FALSE@ usergroup-test + +@HAVE_PTHREAD_SETAFFINITY_NP_TRUE@am__append_19 = \ +@HAVE_PTHREAD_SETAFFINITY_NP_TRUE@ atomic-test + +@HAVE_SYS_EVENTFD_H_TRUE@am__append_20 = \ +@HAVE_SYS_EVENTFD_H_TRUE@ srbchannel-test + +@OS_IS_DARWIN_FALSE@am__append_21 = \ +@OS_IS_DARWIN_FALSE@ once-test + +@HAVE_SIGXCPU_TRUE@am__append_22 = \ +@HAVE_SIGXCPU_TRUE@ cpulimit-test \ +@HAVE_SIGXCPU_TRUE@ cpulimit-test2 + +@HAVE_GLIB20_TRUE@am__append_23 = \ +@HAVE_GLIB20_TRUE@ mainloop-test-glib + + +# gtk-test depends on both glib and gtk +@HAVE_GLIB20_TRUE@@HAVE_GTK30_TRUE@am__append_24 = \ +@HAVE_GLIB20_TRUE@@HAVE_GTK30_TRUE@ gtk-test + +@HAVE_ALSA_TRUE@am__append_25 = \ +@HAVE_ALSA_TRUE@ alsa-time-test + +@HAVE_ALSA_TRUE@am__append_26 = \ +@HAVE_ALSA_TRUE@ alsa-mixer-path-test + +@HAVE_TESTS_TRUE@TESTS = $(am__EXEEXT_9) +@BUILD_TESTS_DEFAULT_TRUE@@HAVE_TESTS_TRUE@noinst_PROGRAMS = \ +@BUILD_TESTS_DEFAULT_TRUE@@HAVE_TESTS_TRUE@ $(am__EXEEXT_9) \ +@BUILD_TESTS_DEFAULT_TRUE@@HAVE_TESTS_TRUE@ $(am__EXEEXT_14) \ +@BUILD_TESTS_DEFAULT_TRUE@@HAVE_TESTS_TRUE@ $(am__EXEEXT_15) \ +@BUILD_TESTS_DEFAULT_TRUE@@HAVE_TESTS_TRUE@ $(am__EXEEXT_16) +@BUILD_TESTS_DEFAULT_FALSE@@HAVE_TESTS_TRUE@check_PROGRAMS = \ +@BUILD_TESTS_DEFAULT_FALSE@@HAVE_TESTS_TRUE@ $(am__EXEEXT_9) \ +@BUILD_TESTS_DEFAULT_FALSE@@HAVE_TESTS_TRUE@ $(am__EXEEXT_14) +@OS_IS_WIN32_TRUE@am__append_27 = \ +@OS_IS_WIN32_TRUE@ pulsecore/poll-win32.c pulsecore/poll.h \ +@OS_IS_WIN32_TRUE@ pulsecore/winerrno.h + +@OS_IS_WIN32_FALSE@am__append_28 = pulsecore/poll-posix.c pulsecore/poll.h +@HAVE_MEMFD_TRUE@am__append_29 = \ +@HAVE_MEMFD_TRUE@ pulsecore/memfd-wrappers.h + +@HAVE_X11_TRUE@am__append_30 = \ +@HAVE_X11_TRUE@ pulse/client-conf-x11.c pulse/client-conf-x11.h \ +@HAVE_X11_TRUE@ pulsecore/x11prop.c pulsecore/x11prop.h + +@HAVE_X11_TRUE@am__append_31 = $(X11_CFLAGS) +@HAVE_X11_TRUE@am__append_32 = $(X11_LIBS) +@HAVE_SYSTEMD_DAEMON_TRUE@am__append_33 = $(SYSTEMD_FLAGS) $(SYSTEMDDAEMON_FLAGS) +@HAVE_SYSTEMD_DAEMON_TRUE@am__append_34 = $(SYSTEMD_LIBS) $(SYSTEMDDAEMON_LIBS) +@HAVE_SYSTEMD_JOURNAL_TRUE@am__append_35 = $(SYSTEMD_FLAGS) $(SYSTEMDJOURNAL_FLAGS) +@HAVE_SYSTEMD_JOURNAL_TRUE@am__append_36 = $(SYSTEMD_LIBS) $(SYSTEMDJOURNAL_LIBS) +@OS_IS_WIN32_TRUE@am__append_37 = \ +@OS_IS_WIN32_TRUE@ pulsecore/mutex-win32.c pulsecore/mutex.h \ +@OS_IS_WIN32_TRUE@ pulsecore/thread-win32.c pulsecore/thread.h \ +@OS_IS_WIN32_TRUE@ pulsecore/semaphore-win32.c pulsecore/semaphore.h + +@OS_IS_DARWIN_TRUE@@OS_IS_WIN32_FALSE@am__append_38 = \ +@OS_IS_DARWIN_TRUE@@OS_IS_WIN32_FALSE@ pulsecore/mutex-posix.c pulsecore/mutex.h \ +@OS_IS_DARWIN_TRUE@@OS_IS_WIN32_FALSE@ pulsecore/thread-posix.c pulsecore/thread.h \ +@OS_IS_DARWIN_TRUE@@OS_IS_WIN32_FALSE@ pulsecore/semaphore-osx.c pulsecore/semaphore.h + +@OS_IS_DARWIN_FALSE@@OS_IS_WIN32_FALSE@am__append_39 = \ +@OS_IS_DARWIN_FALSE@@OS_IS_WIN32_FALSE@ pulsecore/mutex-posix.c pulsecore/mutex.h \ +@OS_IS_DARWIN_FALSE@@OS_IS_WIN32_FALSE@ pulsecore/thread-posix.c pulsecore/thread.h \ +@OS_IS_DARWIN_FALSE@@OS_IS_WIN32_FALSE@ pulsecore/semaphore-posix.c pulsecore/semaphore.h + +@HAVE_LIBASYNCNS_TRUE@am__append_40 = $(LIBASYNCNS_CFLAGS) +@HAVE_LIBASYNCNS_TRUE@am__append_41 = $(LIBASYNCNS_LIBS) +@OS_IS_WIN32_TRUE@am__append_42 = pulsecore/dllmain.c +@HAVE_DBUS_TRUE@am__append_43 = \ +@HAVE_DBUS_TRUE@ pulsecore/dbus-util.c pulsecore/dbus-util.h \ +@HAVE_DBUS_TRUE@ pulsecore/rtkit.c pulsecore/rtkit.h + +@HAVE_DBUS_TRUE@am__append_44 = $(DBUS_CFLAGS) +@HAVE_DBUS_TRUE@am__append_45 = $(DBUS_LIBS) +@HAVE_GLIB20_TRUE@am__append_46 = \ +@HAVE_GLIB20_TRUE@ pulse/glib-mainloop.h + +@HAVE_GLIB20_TRUE@am__append_47 = \ +@HAVE_GLIB20_TRUE@ libpulse-mainloop-glib.la + +@HAVE_DBUS_TRUE@am__append_48 = $(DBUS_CFLAGS) +@HAVE_DBUS_TRUE@am__append_49 = $(DBUS_LIBS) +@HAVE_OSS_WRAPPER_TRUE@am__append_50 = padsp +@HAVE_OSS_WRAPPER_TRUE@am__append_51 = padsp +@HAVE_NEON_TRUE@am__append_52 = libpulsecore_sconv_neon.la libpulsecore_mix_neon.la libpulsecore_remap_neon.la +@HAVE_NEON_TRUE@am__append_53 = libpulsecore_sconv_neon.la libpulsecore_mix_neon.la libpulsecore_remap_neon.la +@HAVE_ORC_TRUE@am__append_54 = pulsecore/svolume_orc.c +@HAVE_ORC_TRUE@am__append_55 = $(ORC_CFLAGS) +@HAVE_ORC_TRUE@am__append_56 = $(ORC_LIBS) +@HAVE_X11_TRUE@am__append_57 = pulsecore/x11wrap.c pulsecore/x11wrap.h +@HAVE_X11_TRUE@am__append_58 = $(X11_CFLAGS) +@HAVE_X11_TRUE@am__append_59 = $(X11_LIBS) +@HAVE_DBUS_TRUE@am__append_60 = \ +@HAVE_DBUS_TRUE@ pulsecore/dbus-shared.c pulsecore/dbus-shared.h \ +@HAVE_DBUS_TRUE@ pulsecore/protocol-dbus.c pulsecore/protocol-dbus.h + +@HAVE_DBUS_TRUE@am__append_61 = $(DBUS_CFLAGS) +@HAVE_DBUS_TRUE@am__append_62 = $(DBUS_LIBS) +@HAVE_GDBM_TRUE@am__append_63 = pulsecore/database-gdbm.c +@HAVE_GDBM_TRUE@am__append_64 = $(GDBM_CFLAGS) +@HAVE_GDBM_TRUE@am__append_65 = $(GDBM_LIBS) +@HAVE_TDB_TRUE@am__append_66 = pulsecore/database-tdb.c +@HAVE_TDB_TRUE@am__append_67 = $(TDB_CFLAGS) +@HAVE_TDB_TRUE@am__append_68 = $(TDB_LIBS) +@HAVE_SIMPLEDB_TRUE@am__append_69 = pulsecore/database-simple.c +@HAVE_SPEEX_TRUE@am__append_70 = pulsecore/resampler/speex.c +@HAVE_SPEEX_TRUE@am__append_71 = $(LIBSPEEX_CFLAGS) +@HAVE_SPEEX_TRUE@am__append_72 = $(LIBSPEEX_LIBS) +@HAVE_SOXR_TRUE@am__append_73 = pulsecore/resampler/soxr.c +@HAVE_SOXR_TRUE@am__append_74 = $(LIBSOXR_CFLAGS) +@HAVE_SOXR_TRUE@am__append_75 = $(LIBSOXR_LIBS) +@HAVE_LIBSAMPLERATE_TRUE@am__append_76 = pulsecore/resampler/libsamplerate.c +@HAVE_LIBSAMPLERATE_TRUE@am__append_77 = $(LIBSAMPLERATE_CFLAGS) +@HAVE_LIBSAMPLERATE_TRUE@am__append_78 = $(LIBSAMPLERATE_LIBS) +@HAVE_WEBRTC_TRUE@am__append_79 = libwebrtc-util.la +@HAVE_ESOUND_TRUE@am__append_80 = \ +@HAVE_ESOUND_TRUE@ libprotocol-esound.la + + +# We need to emulate sendmsg/recvmsg to support this on Win32 +@OS_IS_WIN32_FALSE@am__append_81 = \ +@OS_IS_WIN32_FALSE@ librtp.la + +@HAVE_AVAHI_TRUE@am__append_82 = \ +@HAVE_AVAHI_TRUE@ libavahi-wrap.la + +@HAVE_DBUS_TRUE@am__append_83 = $(DBUS_CFLAGS) +@HAVE_DBUS_TRUE@am__append_84 = $(DBUS_LIBS) +@HAVE_GSTREAMER_TRUE@am__append_85 = modules/rtp/rtp-gstreamer.c +@HAVE_GSTREAMER_TRUE@am__append_86 = $(GSTREAMER_CFLAGS) +@HAVE_GSTREAMER_TRUE@am__append_87 = $(GSTREAMER_LIBS) +@HAVE_GSTREAMER_FALSE@am__append_88 = modules/rtp/rtp-native.c + +################################### +# Plug-in libraries # +################################### + +# Serveral module (e.g. libalsa-util.la) +@HAVE_DBUS_TRUE@am__append_89 = \ +@HAVE_DBUS_TRUE@ module-console-kit.la + +@HAVE_ESOUND_TRUE@am__append_90 = \ +@HAVE_ESOUND_TRUE@ module-esound-protocol-tcp.la \ +@HAVE_ESOUND_TRUE@ module-esound-sink.la + + +# See comment at librtp.la above +@OS_IS_WIN32_FALSE@am__append_91 = \ +@OS_IS_WIN32_FALSE@ module-rtp-send.la \ +@OS_IS_WIN32_FALSE@ module-rtp-recv.la + +@HAVE_AF_UNIX_TRUE@am__append_92 = \ +@HAVE_AF_UNIX_TRUE@ module-cli-protocol-unix.la \ +@HAVE_AF_UNIX_TRUE@ module-simple-protocol-unix.la \ +@HAVE_AF_UNIX_TRUE@ module-http-protocol-unix.la \ +@HAVE_AF_UNIX_TRUE@ module-native-protocol-unix.la + +@HAVE_AF_UNIX_TRUE@@HAVE_ESOUND_TRUE@am__append_93 = \ +@HAVE_AF_UNIX_TRUE@@HAVE_ESOUND_TRUE@ module-esound-protocol-unix.la + +@HAVE_MKFIFO_TRUE@am__append_94 = \ +@HAVE_MKFIFO_TRUE@ module-pipe-sink.la \ +@HAVE_MKFIFO_TRUE@ module-pipe-source.la + +@HAVE_ESOUND_TRUE@@OS_IS_WIN32_FALSE@am__append_95 = \ +@HAVE_ESOUND_TRUE@@OS_IS_WIN32_FALSE@ module-esound-compat-spawnfd.la \ +@HAVE_ESOUND_TRUE@@OS_IS_WIN32_FALSE@ module-esound-compat-spawnpid.la + +@HAVE_REGEX_TRUE@am__append_96 = \ +@HAVE_REGEX_TRUE@ module-match.la + +@HAVE_X11_TRUE@am__append_97 = \ +@HAVE_X11_TRUE@ module-x11-bell.la \ +@HAVE_X11_TRUE@ module-x11-publish.la \ +@HAVE_X11_TRUE@ module-x11-xsmp.la \ +@HAVE_X11_TRUE@ module-x11-cork-request.la + +@HAVE_OSS_OUTPUT_TRUE@am__append_98 = \ +@HAVE_OSS_OUTPUT_TRUE@ liboss-util.la \ +@HAVE_OSS_OUTPUT_TRUE@ module-oss.la + +@HAVE_COREAUDIO_TRUE@am__append_99 = \ +@HAVE_COREAUDIO_TRUE@ module-coreaudio-detect.la \ +@HAVE_COREAUDIO_TRUE@ module-coreaudio-device.la + +pulselibexec_PROGRAMS = $(am__EXEEXT_17) $(am__EXEEXT_18) +@HAVE_ALSA_TRUE@am__append_100 = \ +@HAVE_ALSA_TRUE@ libalsa-util.la \ +@HAVE_ALSA_TRUE@ module-alsa-sink.la \ +@HAVE_ALSA_TRUE@ module-alsa-source.la \ +@HAVE_ALSA_TRUE@ module-alsa-card.la + +@HAVE_SOLARIS_TRUE@am__append_101 = \ +@HAVE_SOLARIS_TRUE@ module-solaris.la + +@HAVE_AVAHI_TRUE@am__append_102 = \ +@HAVE_AVAHI_TRUE@ module-zeroconf-publish.la \ +@HAVE_AVAHI_TRUE@ module-zeroconf-discover.la + +@HAVE_BONJOUR_TRUE@am__append_103 = \ +@HAVE_BONJOUR_TRUE@ module-bonjour-publish.la + +@HAVE_LIRC_TRUE@am__append_104 = \ +@HAVE_LIRC_TRUE@ module-lirc.la + +@HAVE_EVDEV_TRUE@am__append_105 = \ +@HAVE_EVDEV_TRUE@ module-mmkbd-evdev.la + +@HAVE_JACK_TRUE@am__append_106 = \ +@HAVE_JACK_TRUE@ module-jack-sink.la \ +@HAVE_JACK_TRUE@ module-jack-source.la + +@HAVE_DBUS_TRUE@@HAVE_JACK_TRUE@am__append_107 = \ +@HAVE_DBUS_TRUE@@HAVE_JACK_TRUE@ module-jackdbus-detect.la + +@HAVE_GCONF_TRUE@am__append_108 = \ +@HAVE_GCONF_TRUE@ module-gconf.la + +@HAVE_GCONF_TRUE@am__append_109 = \ +@HAVE_GCONF_TRUE@ gconf-helper + +@HAVE_GSETTINGS_TRUE@am__append_110 = \ +@HAVE_GSETTINGS_TRUE@ module-gsettings.la + +@HAVE_GSETTINGS_TRUE@am__append_111 = \ +@HAVE_GSETTINGS_TRUE@ gsettings-helper + +@HAVE_WAVEOUT_TRUE@am__append_112 = \ +@HAVE_WAVEOUT_TRUE@ module-waveout.la + +@HAVE_HAL_COMPAT_TRUE@am__append_113 = \ +@HAVE_HAL_COMPAT_TRUE@ module-hal-detect.la + +@HAVE_UDEV_TRUE@am__append_114 = \ +@HAVE_UDEV_TRUE@ module-udev-detect.la + +@HAVE_SYSTEMD_LOGIN_TRUE@am__append_115 = \ +@HAVE_SYSTEMD_LOGIN_TRUE@ module-systemd-login.la + +@HAVE_DBUS_TRUE@am__append_116 = \ +@HAVE_DBUS_TRUE@ module-rygel-media-server.la \ +@HAVE_DBUS_TRUE@ module-dbus-protocol.la + +@HAVE_BLUEZ_TRUE@am__append_117 = \ +@HAVE_BLUEZ_TRUE@ module-bluetooth-discover.la \ +@HAVE_BLUEZ_TRUE@ module-bluetooth-policy.la + +@HAVE_BLUEZ_5_TRUE@am__append_118 = \ +@HAVE_BLUEZ_5_TRUE@ libbluez5-util.la \ +@HAVE_BLUEZ_5_TRUE@ module-bluez5-discover.la \ +@HAVE_BLUEZ_5_TRUE@ module-bluez5-device.la + + +# RAOP depends on RTP, and we don't support RTP on Windows, see comment at +# librtp.la above. +@HAVE_OPENSSL_TRUE@@OS_IS_WIN32_FALSE@am__append_119 = \ +@HAVE_OPENSSL_TRUE@@OS_IS_WIN32_FALSE@ libraop.la \ +@HAVE_OPENSSL_TRUE@@OS_IS_WIN32_FALSE@ module-raop-sink.la + +@HAVE_AVAHI_TRUE@@HAVE_OPENSSL_TRUE@@OS_IS_WIN32_FALSE@am__append_120 = \ +@HAVE_AVAHI_TRUE@@HAVE_OPENSSL_TRUE@@OS_IS_WIN32_FALSE@ module-raop-discover.la + +@HAVE_DBUS_TRUE@@HAVE_FFTW_TRUE@am__append_121 = \ +@HAVE_DBUS_TRUE@@HAVE_FFTW_TRUE@ module-equalizer-sink.la + +@HAVE_DBUS_TRUE@@HAVE_FFTW_TRUE@am__append_122 = utils/qpaeq +@HAVE_DBUS_TRUE@am__append_123 = $(DBUS_CFLAGS) +@HAVE_DBUS_TRUE@am__append_124 = $(DBUS_LIBS) +@HAVE_UDEV_TRUE@am__append_125 = modules/udev-util.h modules/udev-util.c +@HAVE_UDEV_TRUE@am__append_126 = $(UDEV_LIBS) +@HAVE_UDEV_TRUE@am__append_127 = $(UDEV_CFLAGS) +@HAVE_DBUS_TRUE@am__append_128 = modules/reserve.h modules/reserve.c modules/reserve-monitor.h modules/reserve-monitor.c +@HAVE_DBUS_TRUE@am__append_129 = $(DBUS_LIBS) +@HAVE_DBUS_TRUE@am__append_130 = $(DBUS_CFLAGS) +@HAVE_DBUS_TRUE@am__append_131 = $(DBUS_LIBS) +@HAVE_DBUS_TRUE@am__append_132 = $(DBUS_CFLAGS) +@HAVE_DBUS_TRUE@am__append_133 = $(DBUS_LIBS) +@HAVE_DBUS_TRUE@am__append_134 = $(DBUS_CFLAGS) +@HAVE_ADRIAN_EC_TRUE@am__append_135 = \ +@HAVE_ADRIAN_EC_TRUE@ modules/echo-cancel/adrian-aec.c modules/echo-cancel/adrian-aec.h \ +@HAVE_ADRIAN_EC_TRUE@ modules/echo-cancel/adrian.c modules/echo-cancel/adrian.h + +@HAVE_ADRIAN_EC_TRUE@am__append_136 = -DHAVE_ADRIAN_EC=1 +@HAVE_ADRIAN_EC_TRUE@am__append_137 = modules/echo-cancel/adrian-aec +@HAVE_ADRIAN_EC_TRUE@@HAVE_ORC_TRUE@am__append_138 = $(ORC_LIBS) +@HAVE_ADRIAN_EC_TRUE@@HAVE_ORC_TRUE@am__append_139 = $(ORC_CFLAGS) -I$(top_builddir)/src/modules/echo-cancel +@HAVE_SPEEX_TRUE@am__append_140 = modules/echo-cancel/speex.c +@HAVE_SPEEX_TRUE@am__append_141 = $(LIBSPEEX_CFLAGS) +@HAVE_SPEEX_TRUE@am__append_142 = $(LIBSPEEX_LIBS) +@HAVE_WEBRTC_TRUE@am__append_143 = -DHAVE_WEBRTC=1 +@HAVE_WEBRTC_TRUE@am__append_144 = libwebrtc-util.la +@HAVE_BLUEZ_5_OFONO_HEADSET_TRUE@am__append_145 = \ +@HAVE_BLUEZ_5_OFONO_HEADSET_TRUE@ modules/bluetooth/backend-ofono.c + +@HAVE_BLUEZ_5_NATIVE_HEADSET_TRUE@am__append_146 = \ +@HAVE_BLUEZ_5_NATIVE_HEADSET_TRUE@ modules/bluetooth/backend-native.c + +subdir = src +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/acx_libwrap.m4 \ + $(top_srcdir)/m4/ax_check_define.m4 \ + $(top_srcdir)/m4/ax_check_flag.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ + $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ + $(top_srcdir)/m4/ax_define_dir.m4 \ + $(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/ax_tls.m4 \ + $(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/intlmacosx.m4 $(top_srcdir)/m4/lib-ld.m4 \ + $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ + $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ + $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ + $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/orc.m4 $(top_srcdir)/m4/po.m4 \ + $(top_srcdir)/m4/progtest.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__dist_alsapaths_DATA_DIST) \ + $(am__dist_alsaprofilesets_DATA_DIST) \ + $(am__dist_udevrules_DATA_DIST) \ + $(am__pulseinclude_HEADERS_DIST) $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = esdcompat start-pulseaudio-x11 client.conf \ + daemon.conf default.pa system.pa pulseaudio.service +CONFIG_CLEAN_VPATH_FILES = +@OS_IS_WIN32_FALSE@am__EXEEXT_1 = pasuspender$(EXEEXT) +@HAVE_AF_UNIX_TRUE@am__EXEEXT_2 = pacmd$(EXEEXT) +@HAVE_X11_TRUE@am__EXEEXT_3 = pax11publish$(EXEEXT) +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pulselibexecdir)" \ + "$(DESTDIR)$(commonlibdir)" "$(DESTDIR)$(libdir)" \ + "$(DESTDIR)$(modlibexecdir)" "$(DESTDIR)$(padsplibdir)" \ + "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" \ + "$(DESTDIR)$(dbuspolicydir)" "$(DESTDIR)$(alsapathsdir)" \ + "$(DESTDIR)$(alsaprofilesetsdir)" "$(DESTDIR)$(udevrulesdir)" \ + "$(DESTDIR)$(gsettingsdataconvertdir)" \ + "$(DESTDIR)$(pulseconfdir)" "$(DESTDIR)$(systemduserunitdir)" \ + "$(DESTDIR)$(xdgautostartdir)" "$(DESTDIR)$(pulseincludedir)" +@OS_IS_WIN32_FALSE@am__EXEEXT_4 = sigbus-test$(EXEEXT) \ +@OS_IS_WIN32_FALSE@ usergroup-test$(EXEEXT) +@HAVE_SYS_EVENTFD_H_TRUE@am__EXEEXT_5 = srbchannel-test$(EXEEXT) +@OS_IS_DARWIN_FALSE@am__EXEEXT_6 = once-test$(EXEEXT) +@HAVE_GLIB20_TRUE@am__EXEEXT_7 = mainloop-test-glib$(EXEEXT) +@HAVE_ALSA_TRUE@am__EXEEXT_8 = alsa-mixer-path-test$(EXEEXT) +am__EXEEXT_9 = asyncmsgq-test$(EXEEXT) asyncq-test$(EXEEXT) \ + channelmap-test$(EXEEXT) close-test$(EXEEXT) \ + core-util-test$(EXEEXT) cpu-mix-test$(EXEEXT) \ + cpu-remap-test$(EXEEXT) cpu-sconv-test$(EXEEXT) \ + cpu-volume-test$(EXEEXT) format-test$(EXEEXT) \ + get-binary-name-test$(EXEEXT) hashmap-test$(EXEEXT) \ + hook-list-test$(EXEEXT) json-test$(EXEEXT) \ + lfe-filter-test$(EXEEXT) lock-autospawn-test$(EXEEXT) \ + mainloop-test$(EXEEXT) memblock-test$(EXEEXT) \ + memblockq-test$(EXEEXT) mix-test$(EXEEXT) \ + mult-s16-test$(EXEEXT) proplist-test$(EXEEXT) \ + queue-test$(EXEEXT) resampler-test$(EXEEXT) \ + rtpoll-test$(EXEEXT) smoother-test$(EXEEXT) \ + strlist-test$(EXEEXT) thread-mainloop-test$(EXEEXT) \ + thread-test$(EXEEXT) utf8-test$(EXEEXT) volume-test$(EXEEXT) \ + $(am__EXEEXT_4) $(am__EXEEXT_5) $(am__EXEEXT_6) \ + $(am__EXEEXT_7) $(am__EXEEXT_8) +@HAVE_PTHREAD_SETAFFINITY_NP_TRUE@am__EXEEXT_10 = \ +@HAVE_PTHREAD_SETAFFINITY_NP_TRUE@ atomic-test$(EXEEXT) +@HAVE_SIGXCPU_TRUE@am__EXEEXT_11 = cpulimit-test$(EXEEXT) \ +@HAVE_SIGXCPU_TRUE@ cpulimit-test2$(EXEEXT) +@HAVE_GLIB20_TRUE@@HAVE_GTK30_TRUE@am__EXEEXT_12 = gtk-test$(EXEEXT) +@HAVE_ALSA_TRUE@am__EXEEXT_13 = alsa-time-test$(EXEEXT) +am__EXEEXT_14 = ipacl-test$(EXEEXT) mcalign-test$(EXEEXT) \ + pacat-simple$(EXEEXT) parec-simple$(EXEEXT) \ + flist-test$(EXEEXT) remix-test$(EXEEXT) rtstutter$(EXEEXT) \ + sig2str-test$(EXEEXT) stripnul$(EXEEXT) \ + echo-cancel-test$(EXEEXT) lo-latency-test$(EXEEXT) \ + $(am__EXEEXT_10) $(am__EXEEXT_11) $(am__EXEEXT_12) \ + $(am__EXEEXT_13) +am__EXEEXT_15 = extended-test$(EXEEXT) passthrough-test$(EXEEXT) \ + sync-playback$(EXEEXT) +am__EXEEXT_16 = connect-stress$(EXEEXT) interpol-test$(EXEEXT) +@HAVE_GCONF_TRUE@am__EXEEXT_17 = gconf-helper$(EXEEXT) +@HAVE_GSETTINGS_TRUE@am__EXEEXT_18 = gsettings-helper$(EXEEXT) +PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) $(pulselibexec_PROGRAMS) +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +LTLIBRARIES = $(commonlib_LTLIBRARIES) $(lib_LTLIBRARIES) \ + $(modlibexec_LTLIBRARIES) $(noinst_LTLIBRARIES) \ + $(padsplib_LTLIBRARIES) $(pkglib_LTLIBRARIES) +am__DEPENDENCIES_1 = +am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am__DEPENDENCIES_3 = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la \ + libpulsecommon-@PA_MAJORMINOR@.la libpulse.la +@HAVE_UDEV_TRUE@am__DEPENDENCIES_4 = $(am__DEPENDENCIES_1) +@HAVE_DBUS_TRUE@am__DEPENDENCIES_5 = $(am__DEPENDENCIES_1) +libalsa_util_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_4) \ + $(am__DEPENDENCIES_5) +am__libalsa_util_la_SOURCES_DIST = modules/alsa/alsa-util.c \ + modules/alsa/alsa-util.h modules/alsa/alsa-ucm.c \ + modules/alsa/alsa-ucm.h modules/alsa/alsa-mixer.c \ + modules/alsa/alsa-mixer.h modules/alsa/alsa-sink.c \ + modules/alsa/alsa-sink.h modules/alsa/alsa-source.c \ + modules/alsa/alsa-source.h modules/reserve-wrap.c \ + modules/reserve-wrap.h modules/udev-util.h modules/udev-util.c \ + modules/reserve.h modules/reserve.c modules/reserve-monitor.h \ + modules/reserve-monitor.c +am__dirstamp = $(am__leading_dot)dirstamp +@HAVE_UDEV_TRUE@am__objects_1 = modules/libalsa_util_la-udev-util.lo +@HAVE_DBUS_TRUE@am__objects_2 = modules/libalsa_util_la-reserve.lo \ +@HAVE_DBUS_TRUE@ modules/libalsa_util_la-reserve-monitor.lo +am_libalsa_util_la_OBJECTS = \ + modules/alsa/libalsa_util_la-alsa-util.lo \ + modules/alsa/libalsa_util_la-alsa-ucm.lo \ + modules/alsa/libalsa_util_la-alsa-mixer.lo \ + modules/alsa/libalsa_util_la-alsa-sink.lo \ + modules/alsa/libalsa_util_la-alsa-source.lo \ + modules/libalsa_util_la-reserve-wrap.lo $(am__objects_1) \ + $(am__objects_2) +libalsa_util_la_OBJECTS = $(am_libalsa_util_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libalsa_util_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libalsa_util_la_CFLAGS) $(CFLAGS) $(libalsa_util_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +@HAVE_ALSA_TRUE@am_libalsa_util_la_rpath = -rpath $(modlibexecdir) +libavahi_wrap_la_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) libpulsecore-@PA_MAJORMINOR@.la \ + libpulsecommon-@PA_MAJORMINOR@.la libpulse.la +am_libavahi_wrap_la_OBJECTS = \ + pulsecore/libavahi_wrap_la-avahi-wrap.lo +libavahi_wrap_la_OBJECTS = $(am_libavahi_wrap_la_OBJECTS) +libavahi_wrap_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libavahi_wrap_la_CFLAGS) $(CFLAGS) \ + $(libavahi_wrap_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_AVAHI_TRUE@am_libavahi_wrap_la_rpath = -rpath $(modlibexecdir) +libbluez5_util_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am__libbluez5_util_la_SOURCES_DIST = modules/bluetooth/bluez5-util.c \ + modules/bluetooth/bluez5-util.h \ + modules/bluetooth/a2dp-codec-api.h \ + modules/bluetooth/a2dp-codec-util.c \ + modules/bluetooth/a2dp-codec-util.h \ + modules/bluetooth/a2dp-codecs.h modules/bluetooth/rtp.h \ + modules/bluetooth/backend-ofono.c \ + modules/bluetooth/backend-native.c \ + modules/bluetooth/a2dp-codec-sbc.c +@HAVE_BLUEZ_5_OFONO_HEADSET_TRUE@am__objects_3 = modules/bluetooth/libbluez5_util_la-backend-ofono.lo +@HAVE_BLUEZ_5_NATIVE_HEADSET_TRUE@am__objects_4 = modules/bluetooth/libbluez5_util_la-backend-native.lo +am_libbluez5_util_la_OBJECTS = \ + modules/bluetooth/libbluez5_util_la-bluez5-util.lo \ + modules/bluetooth/libbluez5_util_la-a2dp-codec-util.lo \ + $(am__objects_3) $(am__objects_4) \ + modules/bluetooth/libbluez5_util_la-a2dp-codec-sbc.lo +libbluez5_util_la_OBJECTS = $(am_libbluez5_util_la_OBJECTS) +libbluez5_util_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libbluez5_util_la_CFLAGS) $(CFLAGS) \ + $(libbluez5_util_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_BLUEZ_5_TRUE@am_libbluez5_util_la_rpath = -rpath \ +@HAVE_BLUEZ_5_TRUE@ $(modlibexecdir) +libcli_la_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la \ + libpulsecommon-@PA_MAJORMINOR@.la libpulse.la +am_libcli_la_OBJECTS = pulsecore/cli.lo +libcli_la_OBJECTS = $(am_libcli_la_OBJECTS) +libcli_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libcli_la_LDFLAGS) $(LDFLAGS) -o $@ +liblo_test_util_la_DEPENDENCIES = libpulsecore-@PA_MAJORMINOR@.la +am_liblo_test_util_la_OBJECTS = tests/lo-test-util.lo +liblo_test_util_la_OBJECTS = $(am_liblo_test_util_la_OBJECTS) +liblo_test_util_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(liblo_test_util_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +liboss_util_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_liboss_util_la_OBJECTS = modules/oss/oss-util.lo +liboss_util_la_OBJECTS = $(am_liboss_util_la_OBJECTS) +liboss_util_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(liboss_util_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +@HAVE_OSS_OUTPUT_TRUE@am_liboss_util_la_rpath = -rpath \ +@HAVE_OSS_OUTPUT_TRUE@ $(modlibexecdir) +libprotocol_cli_la_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la \ + libpulsecommon-@PA_MAJORMINOR@.la libpulse.la libcli.la +am_libprotocol_cli_la_OBJECTS = pulsecore/protocol-cli.lo +libprotocol_cli_la_OBJECTS = $(am_libprotocol_cli_la_OBJECTS) +libprotocol_cli_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(libprotocol_cli_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +@HAVE_ESOUND_TRUE@libprotocol_esound_la_DEPENDENCIES = \ +@HAVE_ESOUND_TRUE@ $(am__DEPENDENCIES_2) \ +@HAVE_ESOUND_TRUE@ libpulsecore-@PA_MAJORMINOR@.la \ +@HAVE_ESOUND_TRUE@ libpulsecommon-@PA_MAJORMINOR@.la \ +@HAVE_ESOUND_TRUE@ libpulse.la +am__libprotocol_esound_la_SOURCES_DIST = pulsecore/protocol-esound.c \ + pulsecore/protocol-esound.h pulsecore/esound.h +@HAVE_ESOUND_TRUE@am_libprotocol_esound_la_OBJECTS = \ +@HAVE_ESOUND_TRUE@ pulsecore/protocol-esound.lo +libprotocol_esound_la_OBJECTS = $(am_libprotocol_esound_la_OBJECTS) +libprotocol_esound_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(libprotocol_esound_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +@HAVE_ESOUND_TRUE@am_libprotocol_esound_la_rpath = -rpath \ +@HAVE_ESOUND_TRUE@ $(modlibexecdir) +libprotocol_http_la_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la \ + libpulsecommon-@PA_MAJORMINOR@.la libpulse.la +am_libprotocol_http_la_OBJECTS = pulsecore/protocol-http.lo \ + pulsecore/mime-type.lo +libprotocol_http_la_OBJECTS = $(am_libprotocol_http_la_OBJECTS) +libprotocol_http_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(libprotocol_http_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +libprotocol_native_la_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la \ + libpulsecommon-@PA_MAJORMINOR@.la libpulse.la \ + $(am__DEPENDENCIES_5) +am_libprotocol_native_la_OBJECTS = \ + pulsecore/libprotocol_native_la-protocol-native.lo +libprotocol_native_la_OBJECTS = $(am_libprotocol_native_la_OBJECTS) +libprotocol_native_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libprotocol_native_la_CFLAGS) $(CFLAGS) \ + $(libprotocol_native_la_LDFLAGS) $(LDFLAGS) -o $@ +libprotocol_simple_la_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la \ + libpulsecommon-@PA_MAJORMINOR@.la libpulse.la +am_libprotocol_simple_la_OBJECTS = pulsecore/protocol-simple.lo +libprotocol_simple_la_OBJECTS = $(am_libprotocol_simple_la_OBJECTS) +libprotocol_simple_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(libprotocol_simple_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +libpulse_mainloop_glib_la_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulse.la libpulsecommon-@PA_MAJORMINOR@.la \ + $(am__DEPENDENCIES_1) +am_libpulse_mainloop_glib_la_OBJECTS = \ + pulse/libpulse_mainloop_glib_la-glib-mainloop.lo +libpulse_mainloop_glib_la_OBJECTS = \ + $(am_libpulse_mainloop_glib_la_OBJECTS) +libpulse_mainloop_glib_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libpulse_mainloop_glib_la_CFLAGS) $(CFLAGS) \ + $(libpulse_mainloop_glib_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_GLIB20_TRUE@am_libpulse_mainloop_glib_la_rpath = -rpath \ +@HAVE_GLIB20_TRUE@ $(libdir) +libpulse_simple_la_DEPENDENCIES = $(am__DEPENDENCIES_2) libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +am_libpulse_simple_la_OBJECTS = pulse/libpulse_simple_la-simple.lo +libpulse_simple_la_OBJECTS = $(am_libpulse_simple_la_OBJECTS) +libpulse_simple_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libpulse_simple_la_CFLAGS) $(CFLAGS) \ + $(libpulse_simple_la_LDFLAGS) $(LDFLAGS) -o $@ +libpulse_la_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) libpulsecommon-@PA_MAJORMINOR@.la \ + $(am__DEPENDENCIES_5) +am_libpulse_la_OBJECTS = pulse/libpulse_la-channelmap.lo \ + pulse/libpulse_la-context.lo pulse/libpulse_la-direction.lo \ + pulse/libpulse_la-error.lo \ + pulse/libpulse_la-ext-device-manager.lo \ + pulse/libpulse_la-ext-device-restore.lo \ + pulse/libpulse_la-ext-stream-restore.lo \ + pulse/libpulse_la-format.lo pulse/libpulse_la-introspect.lo \ + pulse/libpulse_la-mainloop-api.lo \ + pulse/libpulse_la-mainloop-signal.lo \ + pulse/libpulse_la-mainloop.lo pulse/libpulse_la-operation.lo \ + pulse/libpulse_la-proplist.lo pulse/libpulse_la-rtclock.lo \ + pulse/libpulse_la-sample.lo pulse/libpulse_la-scache.lo \ + pulse/libpulse_la-stream.lo pulse/libpulse_la-subscribe.lo \ + pulse/libpulse_la-thread-mainloop.lo \ + pulse/libpulse_la-timeval.lo pulse/libpulse_la-utf8.lo \ + pulse/libpulse_la-util.lo pulse/libpulse_la-volume.lo \ + pulse/libpulse_la-xmalloc.lo +libpulse_la_OBJECTS = $(am_libpulse_la_OBJECTS) +libpulse_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libpulse_la_CFLAGS) \ + $(CFLAGS) $(libpulse_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_LIBASYNCNS_TRUE@am__DEPENDENCIES_6 = $(am__DEPENDENCIES_1) +libpulsecommon_@PA_MAJORMINOR@_la_DEPENDENCIES = \ + $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_6) \ + $(am__DEPENDENCIES_5) +am__libpulsecommon_@PA_MAJORMINOR@_la_SOURCES_DIST = \ + pulse/client-conf.c pulse/client-conf.h pulse/fork-detect.c \ + pulse/fork-detect.h pulse/format.c pulse/format.h pulse/json.c \ + pulse/json.h pulse/xmalloc.c pulse/xmalloc.h pulse/proplist.c \ + pulse/proplist.h pulse/utf8.c pulse/utf8.h pulse/channelmap.c \ + pulse/channelmap.h pulse/sample.c pulse/sample.h pulse/util.c \ + pulse/util.h pulse/timeval.c pulse/timeval.h pulse/rtclock.c \ + pulse/rtclock.h pulse/volume.c pulse/volume.h \ + pulsecore/atomic.h pulsecore/authkey.c pulsecore/authkey.h \ + pulsecore/conf-parser.c pulsecore/conf-parser.h \ + pulsecore/core-error.c pulsecore/core-error.h \ + pulsecore/core-format.c pulsecore/core-format.h \ + pulsecore/core-rtclock.c pulsecore/core-rtclock.h \ + pulsecore/core-util.c pulsecore/core-util.h pulsecore/creds.h \ + pulsecore/dynarray.c pulsecore/dynarray.h \ + pulsecore/endianmacros.h pulsecore/fdsem.c pulsecore/fdsem.h \ + pulsecore/flist.c pulsecore/flist.h pulsecore/g711.c \ + pulsecore/g711.h pulsecore/hashmap.c pulsecore/hashmap.h \ + pulsecore/i18n.c pulsecore/i18n.h pulsecore/idxset.c \ + pulsecore/idxset.h pulsecore/arpa-inet.c pulsecore/arpa-inet.h \ + pulsecore/iochannel.c pulsecore/iochannel.h pulsecore/ioline.c \ + pulsecore/ioline.h pulsecore/ipacl.c pulsecore/ipacl.h \ + pulsecore/llist.h pulsecore/lock-autospawn.c \ + pulsecore/lock-autospawn.h pulsecore/log.c pulsecore/log.h \ + pulsecore/ratelimit.c pulsecore/ratelimit.h pulsecore/macro.h \ + pulsecore/mcalign.c pulsecore/mcalign.h pulsecore/memblock.c \ + pulsecore/memblock.h pulsecore/memblockq.c \ + pulsecore/memblockq.h pulsecore/memchunk.c \ + pulsecore/memchunk.h pulsecore/native-common.c \ + pulsecore/native-common.h pulsecore/once.c pulsecore/once.h \ + pulsecore/packet.c pulsecore/packet.h pulsecore/parseaddr.c \ + pulsecore/parseaddr.h pulsecore/pdispatch.c \ + pulsecore/pdispatch.h pulsecore/pid.c pulsecore/pid.h \ + pulsecore/pipe.c pulsecore/pipe.h pulsecore/memtrap.c \ + pulsecore/memtrap.h pulsecore/aupdate.c pulsecore/aupdate.h \ + pulsecore/proplist-util.c pulsecore/proplist-util.h \ + pulsecore/pstream-util.c pulsecore/pstream-util.h \ + pulsecore/pstream.c pulsecore/pstream.h pulsecore/queue.c \ + pulsecore/queue.h pulsecore/random.c pulsecore/random.h \ + pulsecore/refcnt.h pulsecore/srbchannel.c \ + pulsecore/srbchannel.h pulsecore/sample-util.c \ + pulsecore/sample-util.h pulsecore/mem.h pulsecore/shm.c \ + pulsecore/shm.h pulsecore/bitset.c pulsecore/bitset.h \ + pulsecore/socket-client.c pulsecore/socket-client.h \ + pulsecore/socket-server.c pulsecore/socket-server.h \ + pulsecore/socket-util.c pulsecore/socket-util.h \ + pulsecore/strbuf.c pulsecore/strbuf.h pulsecore/strlist.c \ + pulsecore/strlist.h pulsecore/tagstruct.c \ + pulsecore/tagstruct.h pulsecore/time-smoother.c \ + pulsecore/time-smoother.h pulsecore/tokenizer.c \ + pulsecore/tokenizer.h pulsecore/usergroup.c \ + pulsecore/usergroup.h pulsecore/sndfile-util.c \ + pulsecore/sndfile-util.h pulsecore/socket.h \ + pulsecore/poll-win32.c pulsecore/poll.h pulsecore/winerrno.h \ + pulsecore/poll-posix.c pulsecore/memfd-wrappers.h \ + pulse/client-conf-x11.c pulse/client-conf-x11.h \ + pulsecore/x11prop.c pulsecore/x11prop.h \ + pulsecore/mutex-win32.c pulsecore/mutex.h \ + pulsecore/thread-win32.c pulsecore/thread.h \ + pulsecore/semaphore-win32.c pulsecore/semaphore.h \ + pulsecore/mutex-posix.c pulsecore/thread-posix.c \ + pulsecore/semaphore-osx.c pulsecore/semaphore-posix.c \ + pulsecore/dllmain.c pulsecore/dbus-util.c \ + pulsecore/dbus-util.h pulsecore/rtkit.c pulsecore/rtkit.h +@OS_IS_WIN32_TRUE@am__objects_5 = pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-poll-win32.lo +@OS_IS_WIN32_FALSE@am__objects_6 = pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-poll-posix.lo +am__objects_7 = +@HAVE_X11_TRUE@am__objects_8 = pulse/libpulsecommon_@PA_MAJORMINOR@_la-client-conf-x11.lo \ +@HAVE_X11_TRUE@ pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-x11prop.lo +@OS_IS_WIN32_TRUE@am__objects_9 = pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-mutex-win32.lo \ +@OS_IS_WIN32_TRUE@ pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-thread-win32.lo \ +@OS_IS_WIN32_TRUE@ pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-win32.lo +@OS_IS_DARWIN_TRUE@@OS_IS_WIN32_FALSE@am__objects_10 = pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-mutex-posix.lo \ +@OS_IS_DARWIN_TRUE@@OS_IS_WIN32_FALSE@ pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-thread-posix.lo \ +@OS_IS_DARWIN_TRUE@@OS_IS_WIN32_FALSE@ pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-osx.lo +@OS_IS_DARWIN_FALSE@@OS_IS_WIN32_FALSE@am__objects_11 = pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-mutex-posix.lo \ +@OS_IS_DARWIN_FALSE@@OS_IS_WIN32_FALSE@ pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-thread-posix.lo \ +@OS_IS_DARWIN_FALSE@@OS_IS_WIN32_FALSE@ pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-posix.lo +@OS_IS_WIN32_TRUE@am__objects_12 = pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-dllmain.lo +@HAVE_DBUS_TRUE@am__objects_13 = pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-dbus-util.lo \ +@HAVE_DBUS_TRUE@ pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-rtkit.lo +am_libpulsecommon_@PA_MAJORMINOR@_la_OBJECTS = \ + pulse/libpulsecommon_@PA_MAJORMINOR@_la-client-conf.lo \ + pulse/libpulsecommon_@PA_MAJORMINOR@_la-fork-detect.lo \ + pulse/libpulsecommon_@PA_MAJORMINOR@_la-format.lo \ + pulse/libpulsecommon_@PA_MAJORMINOR@_la-json.lo \ + pulse/libpulsecommon_@PA_MAJORMINOR@_la-xmalloc.lo \ + pulse/libpulsecommon_@PA_MAJORMINOR@_la-proplist.lo \ + pulse/libpulsecommon_@PA_MAJORMINOR@_la-utf8.lo \ + pulse/libpulsecommon_@PA_MAJORMINOR@_la-channelmap.lo \ + pulse/libpulsecommon_@PA_MAJORMINOR@_la-sample.lo \ + pulse/libpulsecommon_@PA_MAJORMINOR@_la-util.lo \ + pulse/libpulsecommon_@PA_MAJORMINOR@_la-timeval.lo \ + pulse/libpulsecommon_@PA_MAJORMINOR@_la-rtclock.lo \ + pulse/libpulsecommon_@PA_MAJORMINOR@_la-volume.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-authkey.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-conf-parser.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-error.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-format.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-rtclock.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-util.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-dynarray.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-fdsem.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-flist.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-g711.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-hashmap.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-i18n.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-idxset.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-arpa-inet.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-iochannel.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-ioline.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-ipacl.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-lock-autospawn.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-log.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-ratelimit.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-mcalign.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memblock.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memblockq.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memchunk.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-native-common.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-once.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-packet.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-parseaddr.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pdispatch.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pid.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pipe.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memtrap.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-aupdate.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-proplist-util.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pstream-util.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pstream.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-queue.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-random.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-srbchannel.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-sample-util.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-shm.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-bitset.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-socket-client.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-socket-server.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-socket-util.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-strbuf.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-strlist.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-tagstruct.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-time-smoother.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-tokenizer.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-usergroup.lo \ + pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-sndfile-util.lo \ + $(am__objects_5) $(am__objects_6) $(am__objects_7) \ + $(am__objects_8) $(am__objects_9) $(am__objects_10) \ + $(am__objects_11) $(am__objects_12) $(am__objects_13) +libpulsecommon_@PA_MAJORMINOR@_la_OBJECTS = \ + $(am_libpulsecommon_@PA_MAJORMINOR@_la_OBJECTS) +libpulsecommon_@PA_MAJORMINOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) \ + --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) \ + $(libpulsecommon_@PA_MAJORMINOR@_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_ORC_TRUE@am__DEPENDENCIES_7 = $(am__DEPENDENCIES_1) +@HAVE_GDBM_TRUE@am__DEPENDENCIES_8 = $(am__DEPENDENCIES_1) +@HAVE_TDB_TRUE@am__DEPENDENCIES_9 = $(am__DEPENDENCIES_1) +@HAVE_SPEEX_TRUE@am__DEPENDENCIES_10 = $(am__DEPENDENCIES_1) +@HAVE_SOXR_TRUE@am__DEPENDENCIES_11 = $(am__DEPENDENCIES_1) +@HAVE_LIBSAMPLERATE_TRUE@am__DEPENDENCIES_12 = $(am__DEPENDENCIES_1) +libpulsecore_@PA_MAJORMINOR@_la_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + libpulsecommon-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecore-foreign.la $(am__append_53) $(am__DEPENDENCIES_7) \ + $(am__DEPENDENCIES_5) $(am__DEPENDENCIES_8) \ + $(am__DEPENDENCIES_9) $(am__DEPENDENCIES_10) \ + $(am__DEPENDENCIES_11) $(am__DEPENDENCIES_12) +am__libpulsecore_@PA_MAJORMINOR@_la_SOURCES_DIST = \ + pulsecore/filter/lfe-filter.c pulsecore/filter/lfe-filter.h \ + pulsecore/filter/biquad.c pulsecore/filter/biquad.h \ + pulsecore/filter/crossover.c pulsecore/filter/crossover.h \ + pulsecore/asyncmsgq.c pulsecore/asyncmsgq.h pulsecore/asyncq.c \ + pulsecore/asyncq.h pulsecore/auth-cookie.c \ + pulsecore/auth-cookie.h pulsecore/cli-command.c \ + pulsecore/cli-command.h pulsecore/cli-text.c \ + pulsecore/cli-text.h pulsecore/client.c pulsecore/client.h \ + pulsecore/typedefs.h pulsecore/card.c pulsecore/card.h \ + pulsecore/core-scache.c pulsecore/core-scache.h \ + pulsecore/core-subscribe.c pulsecore/core-subscribe.h \ + pulsecore/core.c pulsecore/core.h pulsecore/message-handler.c \ + pulsecore/message-handler.h pulsecore/hook-list.c \ + pulsecore/hook-list.h pulsecore/ltdl-helper.c \ + pulsecore/ltdl-helper.h pulsecore/modargs.c \ + pulsecore/modargs.h pulsecore/modinfo.c pulsecore/modinfo.h \ + pulsecore/module.c pulsecore/module.h pulsecore/msgobject.c \ + pulsecore/msgobject.h pulsecore/namereg.c pulsecore/namereg.h \ + pulsecore/object.c pulsecore/object.h \ + pulsecore/play-memblockq.c pulsecore/play-memblockq.h \ + pulsecore/play-memchunk.c pulsecore/play-memchunk.h \ + pulsecore/remap.c pulsecore/remap.h pulsecore/remap_mmx.c \ + pulsecore/remap_sse.c pulsecore/resampler.c \ + pulsecore/resampler.h pulsecore/resampler/ffmpeg.c \ + pulsecore/resampler/peaks.c pulsecore/resampler/trivial.c \ + pulsecore/rtpoll.c pulsecore/rtpoll.h pulsecore/stream-util.c \ + pulsecore/stream-util.h pulsecore/svolume_c.c \ + pulsecore/svolume_arm.c pulsecore/svolume_mmx.c \ + pulsecore/svolume_sse.c pulsecore/mix.c pulsecore/mix.h \ + pulsecore/cpu.c pulsecore/cpu.h pulsecore/cpu-arm.c \ + pulsecore/cpu-arm.h pulsecore/cpu-x86.c pulsecore/cpu-x86.h \ + pulsecore/cpu-orc.c pulsecore/cpu-orc.h \ + pulsecore/sconv-s16be.c pulsecore/sconv-s16be.h \ + pulsecore/sconv-s16le.c pulsecore/sconv-s16le.h \ + pulsecore/sconv_sse.c pulsecore/sconv.c pulsecore/sconv.h \ + pulsecore/shared.c pulsecore/shared.h pulsecore/sink-input.c \ + pulsecore/sink-input.h pulsecore/sink.c pulsecore/sink.h \ + pulsecore/device-port.c pulsecore/device-port.h \ + pulsecore/sioman.c pulsecore/sioman.h \ + pulsecore/sound-file-stream.c pulsecore/sound-file-stream.h \ + pulsecore/sound-file.c pulsecore/sound-file.h \ + pulsecore/source-output.c pulsecore/source-output.h \ + pulsecore/source.c pulsecore/source.h pulsecore/start-child.c \ + pulsecore/start-child.h pulsecore/thread-mq.c \ + pulsecore/thread-mq.h pulsecore/database.c \ + pulsecore/database.h pulsecore/svolume_orc.c \ + pulsecore/x11wrap.c pulsecore/x11wrap.h \ + pulsecore/dbus-shared.c pulsecore/dbus-shared.h \ + pulsecore/protocol-dbus.c pulsecore/protocol-dbus.h \ + pulsecore/database-gdbm.c pulsecore/database-tdb.c \ + pulsecore/database-simple.c pulsecore/resampler/speex.c \ + pulsecore/resampler/soxr.c pulsecore/resampler/libsamplerate.c +@HAVE_ORC_TRUE@am__objects_14 = pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_orc.lo +@HAVE_X11_TRUE@am__objects_15 = pulsecore/libpulsecore_@PA_MAJORMINOR@_la-x11wrap.lo +@HAVE_DBUS_TRUE@am__objects_16 = pulsecore/libpulsecore_@PA_MAJORMINOR@_la-dbus-shared.lo \ +@HAVE_DBUS_TRUE@ pulsecore/libpulsecore_@PA_MAJORMINOR@_la-protocol-dbus.lo +@HAVE_GDBM_TRUE@am__objects_17 = pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database-gdbm.lo +@HAVE_TDB_TRUE@am__objects_18 = pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database-tdb.lo +@HAVE_SIMPLEDB_TRUE@am__objects_19 = pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database-simple.lo +@HAVE_SPEEX_TRUE@am__objects_20 = pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-speex.lo +@HAVE_SOXR_TRUE@am__objects_21 = pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-soxr.lo +@HAVE_LIBSAMPLERATE_TRUE@am__objects_22 = pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-libsamplerate.lo +am_libpulsecore_@PA_MAJORMINOR@_la_OBJECTS = pulsecore/filter/libpulsecore_@PA_MAJORMINOR@_la-lfe-filter.lo \ + pulsecore/filter/libpulsecore_@PA_MAJORMINOR@_la-biquad.lo \ + pulsecore/filter/libpulsecore_@PA_MAJORMINOR@_la-crossover.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-asyncmsgq.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-asyncq.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-auth-cookie.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cli-command.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cli-text.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-client.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-card.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-core-scache.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-core-subscribe.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-core.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-message-handler.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-hook-list.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-ltdl-helper.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-modargs.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-modinfo.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-module.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-msgobject.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-namereg.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-object.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-play-memblockq.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-play-memchunk.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-remap.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-remap_mmx.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-remap_sse.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-resampler.lo \ + pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-ffmpeg.lo \ + pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-peaks.lo \ + pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-trivial.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-rtpoll.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-stream-util.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_c.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_arm.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_mmx.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_sse.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-mix.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu-arm.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu-x86.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu-orc.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16be.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16le.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv_sse.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-shared.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sink-input.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sink.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-device-port.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sioman.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sound-file-stream.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sound-file.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-source-output.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-source.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-start-child.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-thread-mq.lo \ + pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database.lo \ + $(am__objects_14) $(am__objects_15) $(am__objects_16) \ + $(am__objects_17) $(am__objects_18) $(am__objects_19) \ + $(am__objects_20) $(am__objects_21) $(am__objects_22) +@HAVE_ORC_TRUE@nodist_libpulsecore_@PA_MAJORMINOR@_la_OBJECTS = pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume-orc-gen.lo +libpulsecore_@PA_MAJORMINOR@_la_OBJECTS = \ + $(am_libpulsecore_@PA_MAJORMINOR@_la_OBJECTS) \ + $(nodist_libpulsecore_@PA_MAJORMINOR@_la_OBJECTS) +libpulsecore_@PA_MAJORMINOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) \ + $(libpulsecore_@PA_MAJORMINOR@_la_LDFLAGS) $(LDFLAGS) -o $@ +libpulsecore_foreign_la_LIBADD = +am_libpulsecore_foreign_la_OBJECTS = \ + pulsecore/ffmpeg/libpulsecore_foreign_la-resample2.lo +libpulsecore_foreign_la_OBJECTS = \ + $(am_libpulsecore_foreign_la_OBJECTS) +libpulsecore_foreign_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libpulsecore_foreign_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +libpulsecore_mix_neon_la_LIBADD = +am__libpulsecore_mix_neon_la_SOURCES_DIST = pulsecore/mix_neon.c +@HAVE_NEON_TRUE@am_libpulsecore_mix_neon_la_OBJECTS = pulsecore/libpulsecore_mix_neon_la-mix_neon.lo +libpulsecore_mix_neon_la_OBJECTS = \ + $(am_libpulsecore_mix_neon_la_OBJECTS) +libpulsecore_mix_neon_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libpulsecore_mix_neon_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +@HAVE_NEON_TRUE@am_libpulsecore_mix_neon_la_rpath = +libpulsecore_remap_neon_la_LIBADD = +am__libpulsecore_remap_neon_la_SOURCES_DIST = pulsecore/remap_neon.c +@HAVE_NEON_TRUE@am_libpulsecore_remap_neon_la_OBJECTS = pulsecore/libpulsecore_remap_neon_la-remap_neon.lo +libpulsecore_remap_neon_la_OBJECTS = \ + $(am_libpulsecore_remap_neon_la_OBJECTS) +libpulsecore_remap_neon_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libpulsecore_remap_neon_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +@HAVE_NEON_TRUE@am_libpulsecore_remap_neon_la_rpath = +libpulsecore_sconv_neon_la_LIBADD = +am__libpulsecore_sconv_neon_la_SOURCES_DIST = pulsecore/sconv_neon.c +@HAVE_NEON_TRUE@am_libpulsecore_sconv_neon_la_OBJECTS = pulsecore/libpulsecore_sconv_neon_la-sconv_neon.lo +libpulsecore_sconv_neon_la_OBJECTS = \ + $(am_libpulsecore_sconv_neon_la_OBJECTS) +libpulsecore_sconv_neon_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libpulsecore_sconv_neon_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +@HAVE_NEON_TRUE@am_libpulsecore_sconv_neon_la_rpath = +libpulsedsp_la_DEPENDENCIES = $(am__DEPENDENCIES_2) libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +am_libpulsedsp_la_OBJECTS = utils/libpulsedsp_la-padsp.lo +libpulsedsp_la_OBJECTS = $(am_libpulsedsp_la_OBJECTS) +libpulsedsp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(libpulsedsp_la_CFLAGS) $(CFLAGS) $(libpulsedsp_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +@HAVE_OSS_WRAPPER_TRUE@am_libpulsedsp_la_rpath = -rpath $(padsplibdir) +libraop_la_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + libpulsecore-@PA_MAJORMINOR@.la librtp.la \ + libpulsecommon-@PA_MAJORMINOR@.la libpulse.la +am_libraop_la_OBJECTS = modules/raop/libraop_la-raop-util.lo \ + modules/raop/libraop_la-raop-crypto.lo \ + modules/raop/libraop_la-raop-packet-buffer.lo \ + modules/raop/libraop_la-raop-client.lo \ + modules/raop/libraop_la-raop-sink.lo +libraop_la_OBJECTS = $(am_libraop_la_OBJECTS) +libraop_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libraop_la_CFLAGS) \ + $(CFLAGS) $(libraop_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_OPENSSL_TRUE@@OS_IS_WIN32_FALSE@am_libraop_la_rpath = -rpath \ +@HAVE_OPENSSL_TRUE@@OS_IS_WIN32_FALSE@ $(modlibexecdir) +@HAVE_GSTREAMER_TRUE@am__DEPENDENCIES_13 = $(am__DEPENDENCIES_1) +librtp_la_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la \ + libpulsecommon-@PA_MAJORMINOR@.la libpulse.la \ + $(am__DEPENDENCIES_13) +am__librtp_la_SOURCES_DIST = modules/rtp/rtp-common.c \ + modules/rtp/rtp.h modules/rtp/sdp.c modules/rtp/sdp.h \ + modules/rtp/sap.c modules/rtp/sap.h modules/rtp/rtsp_client.c \ + modules/rtp/rtsp_client.h modules/rtp/headerlist.c \ + modules/rtp/headerlist.h modules/rtp/rtp-gstreamer.c \ + modules/rtp/rtp-native.c +@HAVE_GSTREAMER_TRUE@am__objects_23 = \ +@HAVE_GSTREAMER_TRUE@ modules/rtp/librtp_la-rtp-gstreamer.lo +@HAVE_GSTREAMER_FALSE@am__objects_24 = \ +@HAVE_GSTREAMER_FALSE@ modules/rtp/librtp_la-rtp-native.lo +am_librtp_la_OBJECTS = modules/rtp/librtp_la-rtp-common.lo \ + modules/rtp/librtp_la-sdp.lo modules/rtp/librtp_la-sap.lo \ + modules/rtp/librtp_la-rtsp_client.lo \ + modules/rtp/librtp_la-headerlist.lo $(am__objects_23) \ + $(am__objects_24) +librtp_la_OBJECTS = $(am_librtp_la_OBJECTS) +librtp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(librtp_la_CFLAGS) \ + $(CFLAGS) $(librtp_la_LDFLAGS) $(LDFLAGS) -o $@ +@OS_IS_WIN32_FALSE@am_librtp_la_rpath = -rpath $(modlibexecdir) +@HAVE_WEBRTC_TRUE@libwebrtc_util_la_DEPENDENCIES = \ +@HAVE_WEBRTC_TRUE@ libpulsecore-@PA_MAJORMINOR@.la \ +@HAVE_WEBRTC_TRUE@ $(am__DEPENDENCIES_1) +am__libwebrtc_util_la_SOURCES_DIST = modules/echo-cancel/webrtc.cc +@HAVE_WEBRTC_TRUE@am_libwebrtc_util_la_OBJECTS = modules/echo-cancel/libwebrtc_util_la-webrtc.lo +libwebrtc_util_la_OBJECTS = $(am_libwebrtc_util_la_OBJECTS) +libwebrtc_util_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ + $(libwebrtc_util_la_CXXFLAGS) $(CXXFLAGS) \ + $(libwebrtc_util_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_WEBRTC_TRUE@am_libwebrtc_util_la_rpath = -rpath $(modlibexecdir) +module_allow_passthrough_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_allow_passthrough_la_OBJECTS = modules/module_allow_passthrough_la-module-allow-passthrough.lo +module_allow_passthrough_la_OBJECTS = \ + $(am_module_allow_passthrough_la_OBJECTS) +module_allow_passthrough_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_allow_passthrough_la_CFLAGS) $(CFLAGS) \ + $(module_allow_passthrough_la_LDFLAGS) $(LDFLAGS) -o $@ +module_alsa_card_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) libalsa-util.la +am_module_alsa_card_la_OBJECTS = \ + modules/alsa/module_alsa_card_la-module-alsa-card.lo +module_alsa_card_la_OBJECTS = $(am_module_alsa_card_la_OBJECTS) +module_alsa_card_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_alsa_card_la_CFLAGS) $(CFLAGS) \ + $(module_alsa_card_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_ALSA_TRUE@am_module_alsa_card_la_rpath = -rpath $(modlibexecdir) +module_alsa_sink_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) libalsa-util.la +am_module_alsa_sink_la_OBJECTS = \ + modules/alsa/module_alsa_sink_la-module-alsa-sink.lo +module_alsa_sink_la_OBJECTS = $(am_module_alsa_sink_la_OBJECTS) +module_alsa_sink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_alsa_sink_la_CFLAGS) $(CFLAGS) \ + $(module_alsa_sink_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_ALSA_TRUE@am_module_alsa_sink_la_rpath = -rpath $(modlibexecdir) +module_alsa_source_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) libalsa-util.la +am_module_alsa_source_la_OBJECTS = \ + modules/alsa/module_alsa_source_la-module-alsa-source.lo +module_alsa_source_la_OBJECTS = $(am_module_alsa_source_la_OBJECTS) +module_alsa_source_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_alsa_source_la_CFLAGS) $(CFLAGS) \ + $(module_alsa_source_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_ALSA_TRUE@am_module_alsa_source_la_rpath = -rpath \ +@HAVE_ALSA_TRUE@ $(modlibexecdir) +module_always_sink_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_always_sink_la_OBJECTS = \ + modules/module_always_sink_la-module-always-sink.lo +module_always_sink_la_OBJECTS = $(am_module_always_sink_la_OBJECTS) +module_always_sink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_always_sink_la_CFLAGS) $(CFLAGS) \ + $(module_always_sink_la_LDFLAGS) $(LDFLAGS) -o $@ +module_always_source_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_always_source_la_OBJECTS = \ + modules/module_always_source_la-module-always-source.lo +module_always_source_la_OBJECTS = \ + $(am_module_always_source_la_OBJECTS) +module_always_source_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_always_source_la_CFLAGS) $(CFLAGS) \ + $(module_always_source_la_LDFLAGS) $(LDFLAGS) -o $@ +module_augment_properties_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_augment_properties_la_OBJECTS = modules/module_augment_properties_la-module-augment-properties.lo +module_augment_properties_la_OBJECTS = \ + $(am_module_augment_properties_la_OBJECTS) +module_augment_properties_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_augment_properties_la_CFLAGS) $(CFLAGS) \ + $(module_augment_properties_la_LDFLAGS) $(LDFLAGS) -o $@ +module_bluetooth_discover_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_bluetooth_discover_la_OBJECTS = modules/bluetooth/module_bluetooth_discover_la-module-bluetooth-discover.lo +module_bluetooth_discover_la_OBJECTS = \ + $(am_module_bluetooth_discover_la_OBJECTS) +module_bluetooth_discover_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_bluetooth_discover_la_CFLAGS) $(CFLAGS) \ + $(module_bluetooth_discover_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_BLUEZ_TRUE@am_module_bluetooth_discover_la_rpath = -rpath \ +@HAVE_BLUEZ_TRUE@ $(modlibexecdir) +module_bluetooth_policy_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_bluetooth_policy_la_OBJECTS = modules/bluetooth/module_bluetooth_policy_la-module-bluetooth-policy.lo +module_bluetooth_policy_la_OBJECTS = \ + $(am_module_bluetooth_policy_la_OBJECTS) +module_bluetooth_policy_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_bluetooth_policy_la_CFLAGS) $(CFLAGS) \ + $(module_bluetooth_policy_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_BLUEZ_TRUE@am_module_bluetooth_policy_la_rpath = -rpath \ +@HAVE_BLUEZ_TRUE@ $(modlibexecdir) +module_bluez5_device_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + libbluez5-util.la +am_module_bluez5_device_la_OBJECTS = modules/bluetooth/module_bluez5_device_la-module-bluez5-device.lo +module_bluez5_device_la_OBJECTS = \ + $(am_module_bluez5_device_la_OBJECTS) +module_bluez5_device_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_bluez5_device_la_CFLAGS) $(CFLAGS) \ + $(module_bluez5_device_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_BLUEZ_5_TRUE@am_module_bluez5_device_la_rpath = -rpath \ +@HAVE_BLUEZ_5_TRUE@ $(modlibexecdir) +module_bluez5_discover_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) libbluez5-util.la +am_module_bluez5_discover_la_OBJECTS = modules/bluetooth/module_bluez5_discover_la-module-bluez5-discover.lo +module_bluez5_discover_la_OBJECTS = \ + $(am_module_bluez5_discover_la_OBJECTS) +module_bluez5_discover_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_bluez5_discover_la_CFLAGS) $(CFLAGS) \ + $(module_bluez5_discover_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_BLUEZ_5_TRUE@am_module_bluez5_discover_la_rpath = -rpath \ +@HAVE_BLUEZ_5_TRUE@ $(modlibexecdir) +module_bonjour_publish_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + libprotocol-native.la +am_module_bonjour_publish_la_OBJECTS = modules/macosx/module_bonjour_publish_la-module-bonjour-publish.lo +module_bonjour_publish_la_OBJECTS = \ + $(am_module_bonjour_publish_la_OBJECTS) +module_bonjour_publish_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_bonjour_publish_la_CFLAGS) $(CFLAGS) \ + $(module_bonjour_publish_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_BONJOUR_TRUE@am_module_bonjour_publish_la_rpath = -rpath \ +@HAVE_BONJOUR_TRUE@ $(modlibexecdir) +module_card_restore_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_card_restore_la_OBJECTS = \ + modules/module_card_restore_la-module-card-restore.lo +module_card_restore_la_OBJECTS = $(am_module_card_restore_la_OBJECTS) +module_card_restore_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_card_restore_la_CFLAGS) $(CFLAGS) \ + $(module_card_restore_la_LDFLAGS) $(LDFLAGS) -o $@ +module_cli_protocol_tcp_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + libprotocol-cli.la +am_module_cli_protocol_tcp_la_OBJECTS = \ + modules/module_cli_protocol_tcp_la-module-protocol-stub.lo +module_cli_protocol_tcp_la_OBJECTS = \ + $(am_module_cli_protocol_tcp_la_OBJECTS) +module_cli_protocol_tcp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_cli_protocol_tcp_la_CFLAGS) $(CFLAGS) \ + $(module_cli_protocol_tcp_la_LDFLAGS) $(LDFLAGS) -o $@ +module_cli_protocol_unix_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + libprotocol-cli.la +am_module_cli_protocol_unix_la_OBJECTS = \ + modules/module_cli_protocol_unix_la-module-protocol-stub.lo +module_cli_protocol_unix_la_OBJECTS = \ + $(am_module_cli_protocol_unix_la_OBJECTS) +module_cli_protocol_unix_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_cli_protocol_unix_la_CFLAGS) $(CFLAGS) \ + $(module_cli_protocol_unix_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_AF_UNIX_TRUE@am_module_cli_protocol_unix_la_rpath = -rpath \ +@HAVE_AF_UNIX_TRUE@ $(modlibexecdir) +module_cli_la_DEPENDENCIES = $(am__DEPENDENCIES_3) libcli.la +am_module_cli_la_OBJECTS = modules/module_cli_la-module-cli.lo +module_cli_la_OBJECTS = $(am_module_cli_la_OBJECTS) +module_cli_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(module_cli_la_CFLAGS) \ + $(CFLAGS) $(module_cli_la_LDFLAGS) $(LDFLAGS) -o $@ +module_combine_sink_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_combine_sink_la_OBJECTS = \ + modules/module_combine_sink_la-module-combine-sink.lo +module_combine_sink_la_OBJECTS = $(am_module_combine_sink_la_OBJECTS) +module_combine_sink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_combine_sink_la_CFLAGS) $(CFLAGS) \ + $(module_combine_sink_la_LDFLAGS) $(LDFLAGS) -o $@ +module_combine_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_combine_la_OBJECTS = \ + modules/module_combine_la-module-combine.lo +module_combine_la_OBJECTS = $(am_module_combine_la_OBJECTS) +module_combine_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_combine_la_CFLAGS) $(CFLAGS) \ + $(module_combine_la_LDFLAGS) $(LDFLAGS) -o $@ +module_console_kit_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) +am_module_console_kit_la_OBJECTS = \ + modules/module_console_kit_la-module-console-kit.lo +module_console_kit_la_OBJECTS = $(am_module_console_kit_la_OBJECTS) +module_console_kit_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_console_kit_la_CFLAGS) $(CFLAGS) \ + $(module_console_kit_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_DBUS_TRUE@am_module_console_kit_la_rpath = -rpath \ +@HAVE_DBUS_TRUE@ $(modlibexecdir) +module_coreaudio_detect_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_coreaudio_detect_la_OBJECTS = modules/macosx/module_coreaudio_detect_la-module-coreaudio-detect.lo +module_coreaudio_detect_la_OBJECTS = \ + $(am_module_coreaudio_detect_la_OBJECTS) +module_coreaudio_detect_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_coreaudio_detect_la_CFLAGS) $(CFLAGS) \ + $(module_coreaudio_detect_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_COREAUDIO_TRUE@am_module_coreaudio_detect_la_rpath = -rpath \ +@HAVE_COREAUDIO_TRUE@ $(modlibexecdir) +module_coreaudio_device_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_coreaudio_device_la_OBJECTS = modules/macosx/module_coreaudio_device_la-module-coreaudio-device.lo +module_coreaudio_device_la_OBJECTS = \ + $(am_module_coreaudio_device_la_OBJECTS) +module_coreaudio_device_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_coreaudio_device_la_CFLAGS) $(CFLAGS) \ + $(module_coreaudio_device_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_COREAUDIO_TRUE@am_module_coreaudio_device_la_rpath = -rpath \ +@HAVE_COREAUDIO_TRUE@ $(modlibexecdir) +module_dbus_protocol_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) +am_module_dbus_protocol_la_OBJECTS = \ + modules/dbus/module_dbus_protocol_la-iface-card.lo \ + modules/dbus/module_dbus_protocol_la-iface-card-profile.lo \ + modules/dbus/module_dbus_protocol_la-iface-client.lo \ + modules/dbus/module_dbus_protocol_la-iface-core.lo \ + modules/dbus/module_dbus_protocol_la-iface-device.lo \ + modules/dbus/module_dbus_protocol_la-iface-device-port.lo \ + modules/dbus/module_dbus_protocol_la-iface-memstats.lo \ + modules/dbus/module_dbus_protocol_la-iface-module.lo \ + modules/dbus/module_dbus_protocol_la-iface-sample.lo \ + modules/dbus/module_dbus_protocol_la-iface-stream.lo \ + modules/dbus/module_dbus_protocol_la-module-dbus-protocol.lo +module_dbus_protocol_la_OBJECTS = \ + $(am_module_dbus_protocol_la_OBJECTS) +module_dbus_protocol_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_dbus_protocol_la_CFLAGS) $(CFLAGS) \ + $(module_dbus_protocol_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_DBUS_TRUE@am_module_dbus_protocol_la_rpath = -rpath \ +@HAVE_DBUS_TRUE@ $(modlibexecdir) +module_default_device_restore_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_default_device_restore_la_OBJECTS = modules/module_default_device_restore_la-module-default-device-restore.lo +module_default_device_restore_la_OBJECTS = \ + $(am_module_default_device_restore_la_OBJECTS) +module_default_device_restore_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_default_device_restore_la_CFLAGS) $(CFLAGS) \ + $(module_default_device_restore_la_LDFLAGS) $(LDFLAGS) -o $@ +module_detect_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_detect_la_OBJECTS = \ + modules/module_detect_la-module-detect.lo +module_detect_la_OBJECTS = $(am_module_detect_la_OBJECTS) +module_detect_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_detect_la_CFLAGS) $(CFLAGS) \ + $(module_detect_la_LDFLAGS) $(LDFLAGS) -o $@ +module_device_manager_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + libprotocol-native.la +am_module_device_manager_la_OBJECTS = \ + modules/module_device_manager_la-module-device-manager.lo +module_device_manager_la_OBJECTS = \ + $(am_module_device_manager_la_OBJECTS) +module_device_manager_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_device_manager_la_CFLAGS) $(CFLAGS) \ + $(module_device_manager_la_LDFLAGS) $(LDFLAGS) -o $@ +module_device_restore_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + libprotocol-native.la $(am__DEPENDENCIES_5) +am_module_device_restore_la_OBJECTS = \ + modules/module_device_restore_la-module-device-restore.lo +module_device_restore_la_OBJECTS = \ + $(am_module_device_restore_la_OBJECTS) +module_device_restore_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_device_restore_la_CFLAGS) $(CFLAGS) \ + $(module_device_restore_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_ADRIAN_EC_TRUE@@HAVE_ORC_TRUE@am__DEPENDENCIES_14 = \ +@HAVE_ADRIAN_EC_TRUE@@HAVE_ORC_TRUE@ $(am__DEPENDENCIES_1) +module_echo_cancel_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_14) $(am__DEPENDENCIES_10) \ + $(am__append_144) +am__module_echo_cancel_la_SOURCES_DIST = \ + modules/echo-cancel/module-echo-cancel.c \ + modules/echo-cancel/null.c modules/echo-cancel/echo-cancel.h \ + modules/echo-cancel/adrian-aec.c \ + modules/echo-cancel/adrian-aec.h modules/echo-cancel/adrian.c \ + modules/echo-cancel/adrian.h modules/echo-cancel/speex.c +@HAVE_ADRIAN_EC_TRUE@am__objects_25 = modules/echo-cancel/module_echo_cancel_la-adrian-aec.lo \ +@HAVE_ADRIAN_EC_TRUE@ modules/echo-cancel/module_echo_cancel_la-adrian.lo +@HAVE_SPEEX_TRUE@am__objects_26 = modules/echo-cancel/module_echo_cancel_la-speex.lo +am_module_echo_cancel_la_OBJECTS = modules/echo-cancel/module_echo_cancel_la-module-echo-cancel.lo \ + modules/echo-cancel/module_echo_cancel_la-null.lo \ + $(am__objects_25) $(am__objects_26) +@HAVE_ADRIAN_EC_TRUE@@HAVE_ORC_TRUE@nodist_module_echo_cancel_la_OBJECTS = modules/echo-cancel/module_echo_cancel_la-adrian-aec-orc-gen.lo +module_echo_cancel_la_OBJECTS = $(am_module_echo_cancel_la_OBJECTS) \ + $(nodist_module_echo_cancel_la_OBJECTS) +module_echo_cancel_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_echo_cancel_la_CFLAGS) $(CFLAGS) \ + $(module_echo_cancel_la_LDFLAGS) $(LDFLAGS) -o $@ +module_equalizer_sink_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_module_equalizer_sink_la_OBJECTS = \ + modules/module_equalizer_sink_la-module-equalizer-sink.lo +module_equalizer_sink_la_OBJECTS = \ + $(am_module_equalizer_sink_la_OBJECTS) +module_equalizer_sink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_equalizer_sink_la_CFLAGS) $(CFLAGS) \ + $(module_equalizer_sink_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_DBUS_TRUE@@HAVE_FFTW_TRUE@am_module_equalizer_sink_la_rpath = \ +@HAVE_DBUS_TRUE@@HAVE_FFTW_TRUE@ -rpath $(modlibexecdir) +@HAVE_ESOUND_TRUE@module_esound_compat_spawnfd_la_DEPENDENCIES = \ +@HAVE_ESOUND_TRUE@ $(am__DEPENDENCIES_3) +am__module_esound_compat_spawnfd_la_SOURCES_DIST = \ + modules/module-esound-compat-spawnfd.c +@HAVE_ESOUND_TRUE@am_module_esound_compat_spawnfd_la_OBJECTS = modules/module_esound_compat_spawnfd_la-module-esound-compat-spawnfd.lo +module_esound_compat_spawnfd_la_OBJECTS = \ + $(am_module_esound_compat_spawnfd_la_OBJECTS) +module_esound_compat_spawnfd_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_esound_compat_spawnfd_la_CFLAGS) $(CFLAGS) \ + $(module_esound_compat_spawnfd_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_ESOUND_TRUE@@OS_IS_WIN32_FALSE@am_module_esound_compat_spawnfd_la_rpath = \ +@HAVE_ESOUND_TRUE@@OS_IS_WIN32_FALSE@ -rpath $(modlibexecdir) +@HAVE_ESOUND_TRUE@module_esound_compat_spawnpid_la_DEPENDENCIES = \ +@HAVE_ESOUND_TRUE@ $(am__DEPENDENCIES_3) +am__module_esound_compat_spawnpid_la_SOURCES_DIST = \ + modules/module-esound-compat-spawnpid.c +@HAVE_ESOUND_TRUE@am_module_esound_compat_spawnpid_la_OBJECTS = modules/module_esound_compat_spawnpid_la-module-esound-compat-spawnpid.lo +module_esound_compat_spawnpid_la_OBJECTS = \ + $(am_module_esound_compat_spawnpid_la_OBJECTS) +module_esound_compat_spawnpid_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_esound_compat_spawnpid_la_CFLAGS) $(CFLAGS) \ + $(module_esound_compat_spawnpid_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_ESOUND_TRUE@@OS_IS_WIN32_FALSE@am_module_esound_compat_spawnpid_la_rpath = \ +@HAVE_ESOUND_TRUE@@OS_IS_WIN32_FALSE@ -rpath $(modlibexecdir) +@HAVE_ESOUND_TRUE@module_esound_protocol_tcp_la_DEPENDENCIES = \ +@HAVE_ESOUND_TRUE@ $(am__DEPENDENCIES_3) libprotocol-esound.la +am__module_esound_protocol_tcp_la_SOURCES_DIST = \ + modules/module-protocol-stub.c +@HAVE_ESOUND_TRUE@am_module_esound_protocol_tcp_la_OBJECTS = modules/module_esound_protocol_tcp_la-module-protocol-stub.lo +module_esound_protocol_tcp_la_OBJECTS = \ + $(am_module_esound_protocol_tcp_la_OBJECTS) +module_esound_protocol_tcp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_esound_protocol_tcp_la_CFLAGS) $(CFLAGS) \ + $(module_esound_protocol_tcp_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_ESOUND_TRUE@am_module_esound_protocol_tcp_la_rpath = -rpath \ +@HAVE_ESOUND_TRUE@ $(modlibexecdir) +@HAVE_ESOUND_TRUE@module_esound_protocol_unix_la_DEPENDENCIES = \ +@HAVE_ESOUND_TRUE@ $(am__DEPENDENCIES_3) libprotocol-esound.la +am__module_esound_protocol_unix_la_SOURCES_DIST = \ + modules/module-protocol-stub.c +@HAVE_ESOUND_TRUE@am_module_esound_protocol_unix_la_OBJECTS = modules/module_esound_protocol_unix_la-module-protocol-stub.lo +module_esound_protocol_unix_la_OBJECTS = \ + $(am_module_esound_protocol_unix_la_OBJECTS) +module_esound_protocol_unix_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_esound_protocol_unix_la_CFLAGS) $(CFLAGS) \ + $(module_esound_protocol_unix_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_AF_UNIX_TRUE@@HAVE_ESOUND_TRUE@am_module_esound_protocol_unix_la_rpath = \ +@HAVE_AF_UNIX_TRUE@@HAVE_ESOUND_TRUE@ -rpath $(modlibexecdir) +@HAVE_ESOUND_TRUE@module_esound_sink_la_DEPENDENCIES = \ +@HAVE_ESOUND_TRUE@ $(am__DEPENDENCIES_3) +am__module_esound_sink_la_SOURCES_DIST = modules/module-esound-sink.c +@HAVE_ESOUND_TRUE@am_module_esound_sink_la_OBJECTS = modules/module_esound_sink_la-module-esound-sink.lo +module_esound_sink_la_OBJECTS = $(am_module_esound_sink_la_OBJECTS) +module_esound_sink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_esound_sink_la_CFLAGS) $(CFLAGS) \ + $(module_esound_sink_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_ESOUND_TRUE@am_module_esound_sink_la_rpath = -rpath \ +@HAVE_ESOUND_TRUE@ $(modlibexecdir) +module_filter_apply_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_filter_apply_la_OBJECTS = \ + modules/module_filter_apply_la-module-filter-apply.lo +module_filter_apply_la_OBJECTS = $(am_module_filter_apply_la_OBJECTS) +module_filter_apply_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_filter_apply_la_CFLAGS) $(CFLAGS) \ + $(module_filter_apply_la_LDFLAGS) $(LDFLAGS) -o $@ +module_filter_heuristics_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_filter_heuristics_la_OBJECTS = modules/module_filter_heuristics_la-module-filter-heuristics.lo +module_filter_heuristics_la_OBJECTS = \ + $(am_module_filter_heuristics_la_OBJECTS) +module_filter_heuristics_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_filter_heuristics_la_CFLAGS) $(CFLAGS) \ + $(module_filter_heuristics_la_LDFLAGS) $(LDFLAGS) -o $@ +module_gconf_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_gconf_la_OBJECTS = modules/module_gconf_la-stdin-util.lo \ + modules/gconf/module_gconf_la-module-gconf.lo +module_gconf_la_OBJECTS = $(am_module_gconf_la_OBJECTS) +module_gconf_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_gconf_la_CFLAGS) $(CFLAGS) $(module_gconf_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +@HAVE_GCONF_TRUE@am_module_gconf_la_rpath = -rpath $(modlibexecdir) +module_gsettings_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_gsettings_la_OBJECTS = \ + modules/module_gsettings_la-stdin-util.lo \ + modules/gsettings/module_gsettings_la-module-gsettings.lo +module_gsettings_la_OBJECTS = $(am_module_gsettings_la_OBJECTS) +module_gsettings_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_gsettings_la_CFLAGS) $(CFLAGS) \ + $(module_gsettings_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_GSETTINGS_TRUE@am_module_gsettings_la_rpath = -rpath \ +@HAVE_GSETTINGS_TRUE@ $(modlibexecdir) +module_hal_detect_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_hal_detect_la_OBJECTS = \ + modules/module_hal_detect_la-module-hal-detect-compat.lo +module_hal_detect_la_OBJECTS = $(am_module_hal_detect_la_OBJECTS) +module_hal_detect_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_hal_detect_la_CFLAGS) $(CFLAGS) \ + $(module_hal_detect_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_HAL_COMPAT_TRUE@am_module_hal_detect_la_rpath = -rpath \ +@HAVE_HAL_COMPAT_TRUE@ $(modlibexecdir) +module_http_protocol_tcp_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + libprotocol-http.la +am_module_http_protocol_tcp_la_OBJECTS = \ + modules/module_http_protocol_tcp_la-module-protocol-stub.lo +module_http_protocol_tcp_la_OBJECTS = \ + $(am_module_http_protocol_tcp_la_OBJECTS) +module_http_protocol_tcp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_http_protocol_tcp_la_CFLAGS) $(CFLAGS) \ + $(module_http_protocol_tcp_la_LDFLAGS) $(LDFLAGS) -o $@ +module_http_protocol_unix_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + libprotocol-http.la +am_module_http_protocol_unix_la_OBJECTS = \ + modules/module_http_protocol_unix_la-module-protocol-stub.lo +module_http_protocol_unix_la_OBJECTS = \ + $(am_module_http_protocol_unix_la_OBJECTS) +module_http_protocol_unix_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_http_protocol_unix_la_CFLAGS) $(CFLAGS) \ + $(module_http_protocol_unix_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_AF_UNIX_TRUE@am_module_http_protocol_unix_la_rpath = -rpath \ +@HAVE_AF_UNIX_TRUE@ $(modlibexecdir) +module_intended_roles_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_intended_roles_la_OBJECTS = \ + modules/module_intended_roles_la-module-intended-roles.lo +module_intended_roles_la_OBJECTS = \ + $(am_module_intended_roles_la_OBJECTS) +module_intended_roles_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_intended_roles_la_CFLAGS) $(CFLAGS) \ + $(module_intended_roles_la_LDFLAGS) $(LDFLAGS) -o $@ +module_jack_sink_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) +am_module_jack_sink_la_OBJECTS = \ + modules/jack/module_jack_sink_la-module-jack-sink.lo +module_jack_sink_la_OBJECTS = $(am_module_jack_sink_la_OBJECTS) +module_jack_sink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_jack_sink_la_CFLAGS) $(CFLAGS) \ + $(module_jack_sink_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_JACK_TRUE@am_module_jack_sink_la_rpath = -rpath $(modlibexecdir) +module_jack_source_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) +am_module_jack_source_la_OBJECTS = \ + modules/jack/module_jack_source_la-module-jack-source.lo +module_jack_source_la_OBJECTS = $(am_module_jack_source_la_OBJECTS) +module_jack_source_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_jack_source_la_CFLAGS) $(CFLAGS) \ + $(module_jack_source_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_JACK_TRUE@am_module_jack_source_la_rpath = -rpath \ +@HAVE_JACK_TRUE@ $(modlibexecdir) +module_jackdbus_detect_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_module_jackdbus_detect_la_OBJECTS = modules/jack/module_jackdbus_detect_la-module-jackdbus-detect.lo +module_jackdbus_detect_la_OBJECTS = \ + $(am_module_jackdbus_detect_la_OBJECTS) +module_jackdbus_detect_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_jackdbus_detect_la_CFLAGS) $(CFLAGS) \ + $(module_jackdbus_detect_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_DBUS_TRUE@@HAVE_JACK_TRUE@am_module_jackdbus_detect_la_rpath = \ +@HAVE_DBUS_TRUE@@HAVE_JACK_TRUE@ -rpath $(modlibexecdir) +module_ladspa_sink_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_5) +am_module_ladspa_sink_la_OBJECTS = \ + modules/module_ladspa_sink_la-module-ladspa-sink.lo +module_ladspa_sink_la_OBJECTS = $(am_module_ladspa_sink_la_OBJECTS) +module_ladspa_sink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_ladspa_sink_la_CFLAGS) $(CFLAGS) \ + $(module_ladspa_sink_la_LDFLAGS) $(LDFLAGS) -o $@ +module_lirc_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) +am_module_lirc_la_OBJECTS = modules/module_lirc_la-module-lirc.lo +module_lirc_la_OBJECTS = $(am_module_lirc_la_OBJECTS) +module_lirc_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_lirc_la_CFLAGS) $(CFLAGS) $(module_lirc_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +@HAVE_LIRC_TRUE@am_module_lirc_la_rpath = -rpath $(modlibexecdir) +module_loopback_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_loopback_la_OBJECTS = \ + modules/module_loopback_la-module-loopback.lo +module_loopback_la_OBJECTS = $(am_module_loopback_la_OBJECTS) +module_loopback_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_loopback_la_CFLAGS) $(CFLAGS) \ + $(module_loopback_la_LDFLAGS) $(LDFLAGS) -o $@ +module_match_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_match_la_OBJECTS = modules/module_match_la-module-match.lo +module_match_la_OBJECTS = $(am_module_match_la_OBJECTS) +module_match_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_match_la_CFLAGS) $(CFLAGS) $(module_match_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +@HAVE_REGEX_TRUE@am_module_match_la_rpath = -rpath $(modlibexecdir) +module_mmkbd_evdev_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_mmkbd_evdev_la_OBJECTS = \ + modules/module_mmkbd_evdev_la-module-mmkbd-evdev.lo +module_mmkbd_evdev_la_OBJECTS = $(am_module_mmkbd_evdev_la_OBJECTS) +module_mmkbd_evdev_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_mmkbd_evdev_la_CFLAGS) $(CFLAGS) \ + $(module_mmkbd_evdev_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_EVDEV_TRUE@am_module_mmkbd_evdev_la_rpath = -rpath \ +@HAVE_EVDEV_TRUE@ $(modlibexecdir) +module_native_protocol_fd_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + libprotocol-native.la +am_module_native_protocol_fd_la_OBJECTS = modules/module_native_protocol_fd_la-module-native-protocol-fd.lo +module_native_protocol_fd_la_OBJECTS = \ + $(am_module_native_protocol_fd_la_OBJECTS) +module_native_protocol_fd_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_native_protocol_fd_la_CFLAGS) $(CFLAGS) \ + $(module_native_protocol_fd_la_LDFLAGS) $(LDFLAGS) -o $@ +module_native_protocol_tcp_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + libprotocol-native.la +am_module_native_protocol_tcp_la_OBJECTS = \ + modules/module_native_protocol_tcp_la-module-protocol-stub.lo +module_native_protocol_tcp_la_OBJECTS = \ + $(am_module_native_protocol_tcp_la_OBJECTS) +module_native_protocol_tcp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_native_protocol_tcp_la_CFLAGS) $(CFLAGS) \ + $(module_native_protocol_tcp_la_LDFLAGS) $(LDFLAGS) -o $@ +module_native_protocol_unix_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + libprotocol-native.la +am_module_native_protocol_unix_la_OBJECTS = modules/module_native_protocol_unix_la-module-protocol-stub.lo +module_native_protocol_unix_la_OBJECTS = \ + $(am_module_native_protocol_unix_la_OBJECTS) +module_native_protocol_unix_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_native_protocol_unix_la_CFLAGS) $(CFLAGS) \ + $(module_native_protocol_unix_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_AF_UNIX_TRUE@am_module_native_protocol_unix_la_rpath = -rpath \ +@HAVE_AF_UNIX_TRUE@ $(modlibexecdir) +module_null_sink_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_null_sink_la_OBJECTS = \ + modules/module_null_sink_la-module-null-sink.lo +module_null_sink_la_OBJECTS = $(am_module_null_sink_la_OBJECTS) +module_null_sink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_null_sink_la_CFLAGS) $(CFLAGS) \ + $(module_null_sink_la_LDFLAGS) $(LDFLAGS) -o $@ +module_null_source_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_null_source_la_OBJECTS = \ + modules/module_null_source_la-module-null-source.lo +module_null_source_la_OBJECTS = $(am_module_null_source_la_OBJECTS) +module_null_source_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_null_source_la_CFLAGS) $(CFLAGS) \ + $(module_null_source_la_LDFLAGS) $(LDFLAGS) -o $@ +module_oss_la_DEPENDENCIES = $(am__DEPENDENCIES_3) liboss-util.la +am_module_oss_la_OBJECTS = modules/oss/module_oss_la-module-oss.lo +module_oss_la_OBJECTS = $(am_module_oss_la_OBJECTS) +module_oss_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(module_oss_la_CFLAGS) \ + $(CFLAGS) $(module_oss_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_OSS_OUTPUT_TRUE@am_module_oss_la_rpath = -rpath $(modlibexecdir) +module_pipe_sink_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_pipe_sink_la_OBJECTS = \ + modules/module_pipe_sink_la-module-pipe-sink.lo +module_pipe_sink_la_OBJECTS = $(am_module_pipe_sink_la_OBJECTS) +module_pipe_sink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_pipe_sink_la_CFLAGS) $(CFLAGS) \ + $(module_pipe_sink_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_MKFIFO_TRUE@am_module_pipe_sink_la_rpath = -rpath \ +@HAVE_MKFIFO_TRUE@ $(modlibexecdir) +module_pipe_source_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_pipe_source_la_OBJECTS = \ + modules/module_pipe_source_la-module-pipe-source.lo +module_pipe_source_la_OBJECTS = $(am_module_pipe_source_la_OBJECTS) +module_pipe_source_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_pipe_source_la_CFLAGS) $(CFLAGS) \ + $(module_pipe_source_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_MKFIFO_TRUE@am_module_pipe_source_la_rpath = -rpath \ +@HAVE_MKFIFO_TRUE@ $(modlibexecdir) +module_position_event_sounds_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_position_event_sounds_la_OBJECTS = modules/module_position_event_sounds_la-module-position-event-sounds.lo +module_position_event_sounds_la_OBJECTS = \ + $(am_module_position_event_sounds_la_OBJECTS) +module_position_event_sounds_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_position_event_sounds_la_CFLAGS) $(CFLAGS) \ + $(module_position_event_sounds_la_LDFLAGS) $(LDFLAGS) -o $@ +module_raop_discover_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) libavahi-wrap.la +am_module_raop_discover_la_OBJECTS = \ + modules/raop/module_raop_discover_la-module-raop-discover.lo +module_raop_discover_la_OBJECTS = \ + $(am_module_raop_discover_la_OBJECTS) +module_raop_discover_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_raop_discover_la_CFLAGS) $(CFLAGS) \ + $(module_raop_discover_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_AVAHI_TRUE@@HAVE_OPENSSL_TRUE@@OS_IS_WIN32_FALSE@am_module_raop_discover_la_rpath = \ +@HAVE_AVAHI_TRUE@@HAVE_OPENSSL_TRUE@@OS_IS_WIN32_FALSE@ -rpath \ +@HAVE_AVAHI_TRUE@@HAVE_OPENSSL_TRUE@@OS_IS_WIN32_FALSE@ $(modlibexecdir) +module_raop_sink_la_DEPENDENCIES = $(am__DEPENDENCIES_3) librtp.la \ + libraop.la +am_module_raop_sink_la_OBJECTS = \ + modules/raop/module_raop_sink_la-module-raop-sink.lo +module_raop_sink_la_OBJECTS = $(am_module_raop_sink_la_OBJECTS) +module_raop_sink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_raop_sink_la_CFLAGS) $(CFLAGS) \ + $(module_raop_sink_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_OPENSSL_TRUE@@OS_IS_WIN32_FALSE@am_module_raop_sink_la_rpath = \ +@HAVE_OPENSSL_TRUE@@OS_IS_WIN32_FALSE@ -rpath $(modlibexecdir) +module_remap_sink_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_remap_sink_la_OBJECTS = \ + modules/module_remap_sink_la-module-remap-sink.lo +module_remap_sink_la_OBJECTS = $(am_module_remap_sink_la_OBJECTS) +module_remap_sink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_remap_sink_la_CFLAGS) $(CFLAGS) \ + $(module_remap_sink_la_LDFLAGS) $(LDFLAGS) -o $@ +module_remap_source_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_remap_source_la_OBJECTS = \ + modules/module_remap_source_la-module-remap-source.lo +module_remap_source_la_OBJECTS = $(am_module_remap_source_la_OBJECTS) +module_remap_source_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_remap_source_la_CFLAGS) $(CFLAGS) \ + $(module_remap_source_la_LDFLAGS) $(LDFLAGS) -o $@ +module_rescue_streams_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_rescue_streams_la_OBJECTS = \ + modules/module_rescue_streams_la-module-rescue-streams.lo +module_rescue_streams_la_OBJECTS = \ + $(am_module_rescue_streams_la_OBJECTS) +module_rescue_streams_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_rescue_streams_la_CFLAGS) $(CFLAGS) \ + $(module_rescue_streams_la_LDFLAGS) $(LDFLAGS) -o $@ +module_role_cork_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_role_cork_la_OBJECTS = \ + modules/module_role_cork_la-module-role-cork.lo \ + modules/module_role_cork_la-stream-interaction.lo +module_role_cork_la_OBJECTS = $(am_module_role_cork_la_OBJECTS) +module_role_cork_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_role_cork_la_CFLAGS) $(CFLAGS) \ + $(module_role_cork_la_LDFLAGS) $(LDFLAGS) -o $@ +module_role_ducking_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_role_ducking_la_OBJECTS = \ + modules/module_role_ducking_la-module-role-ducking.lo \ + modules/module_role_ducking_la-stream-interaction.lo +module_role_ducking_la_OBJECTS = $(am_module_role_ducking_la_OBJECTS) +module_role_ducking_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_role_ducking_la_CFLAGS) $(CFLAGS) \ + $(module_role_ducking_la_LDFLAGS) $(LDFLAGS) -o $@ +module_rtp_recv_la_DEPENDENCIES = $(am__DEPENDENCIES_3) librtp.la +am_module_rtp_recv_la_OBJECTS = \ + modules/rtp/module_rtp_recv_la-module-rtp-recv.lo +module_rtp_recv_la_OBJECTS = $(am_module_rtp_recv_la_OBJECTS) +module_rtp_recv_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_rtp_recv_la_CFLAGS) $(CFLAGS) \ + $(module_rtp_recv_la_LDFLAGS) $(LDFLAGS) -o $@ +@OS_IS_WIN32_FALSE@am_module_rtp_recv_la_rpath = -rpath \ +@OS_IS_WIN32_FALSE@ $(modlibexecdir) +module_rtp_send_la_DEPENDENCIES = $(am__DEPENDENCIES_3) librtp.la +am_module_rtp_send_la_OBJECTS = \ + modules/rtp/module_rtp_send_la-module-rtp-send.lo +module_rtp_send_la_OBJECTS = $(am_module_rtp_send_la_OBJECTS) +module_rtp_send_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_rtp_send_la_CFLAGS) $(CFLAGS) \ + $(module_rtp_send_la_LDFLAGS) $(LDFLAGS) -o $@ +@OS_IS_WIN32_FALSE@am_module_rtp_send_la_rpath = -rpath \ +@OS_IS_WIN32_FALSE@ $(modlibexecdir) +module_rygel_media_server_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) libprotocol-http.la +am_module_rygel_media_server_la_OBJECTS = modules/module_rygel_media_server_la-module-rygel-media-server.lo +module_rygel_media_server_la_OBJECTS = \ + $(am_module_rygel_media_server_la_OBJECTS) +module_rygel_media_server_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_rygel_media_server_la_CFLAGS) $(CFLAGS) \ + $(module_rygel_media_server_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_DBUS_TRUE@am_module_rygel_media_server_la_rpath = -rpath \ +@HAVE_DBUS_TRUE@ $(modlibexecdir) +module_simple_protocol_tcp_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + libprotocol-simple.la +am_module_simple_protocol_tcp_la_OBJECTS = \ + modules/module_simple_protocol_tcp_la-module-protocol-stub.lo +module_simple_protocol_tcp_la_OBJECTS = \ + $(am_module_simple_protocol_tcp_la_OBJECTS) +module_simple_protocol_tcp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_simple_protocol_tcp_la_CFLAGS) $(CFLAGS) \ + $(module_simple_protocol_tcp_la_LDFLAGS) $(LDFLAGS) -o $@ +module_simple_protocol_unix_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + libprotocol-simple.la +am_module_simple_protocol_unix_la_OBJECTS = modules/module_simple_protocol_unix_la-module-protocol-stub.lo +module_simple_protocol_unix_la_OBJECTS = \ + $(am_module_simple_protocol_unix_la_OBJECTS) +module_simple_protocol_unix_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_simple_protocol_unix_la_CFLAGS) $(CFLAGS) \ + $(module_simple_protocol_unix_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_AF_UNIX_TRUE@am_module_simple_protocol_unix_la_rpath = -rpath \ +@HAVE_AF_UNIX_TRUE@ $(modlibexecdir) +module_sine_source_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_sine_source_la_OBJECTS = \ + modules/module_sine_source_la-module-sine-source.lo +module_sine_source_la_OBJECTS = $(am_module_sine_source_la_OBJECTS) +module_sine_source_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_sine_source_la_CFLAGS) $(CFLAGS) \ + $(module_sine_source_la_LDFLAGS) $(LDFLAGS) -o $@ +module_sine_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_sine_la_OBJECTS = modules/module_sine_la-module-sine.lo +module_sine_la_OBJECTS = $(am_module_sine_la_OBJECTS) +module_sine_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_sine_la_CFLAGS) $(CFLAGS) $(module_sine_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +module_solaris_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_solaris_la_OBJECTS = \ + modules/module_solaris_la-module-solaris.lo +module_solaris_la_OBJECTS = $(am_module_solaris_la_OBJECTS) +module_solaris_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_solaris_la_CFLAGS) $(CFLAGS) \ + $(module_solaris_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_SOLARIS_TRUE@am_module_solaris_la_rpath = -rpath \ +@HAVE_SOLARIS_TRUE@ $(modlibexecdir) +module_stream_restore_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + libprotocol-native.la $(am__DEPENDENCIES_5) +am_module_stream_restore_la_OBJECTS = \ + modules/module_stream_restore_la-module-stream-restore.lo +module_stream_restore_la_OBJECTS = \ + $(am_module_stream_restore_la_OBJECTS) +module_stream_restore_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_stream_restore_la_CFLAGS) $(CFLAGS) \ + $(module_stream_restore_la_LDFLAGS) $(LDFLAGS) -o $@ +module_suspend_on_idle_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_suspend_on_idle_la_OBJECTS = \ + modules/module_suspend_on_idle_la-module-suspend-on-idle.lo +module_suspend_on_idle_la_OBJECTS = \ + $(am_module_suspend_on_idle_la_OBJECTS) +module_suspend_on_idle_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_suspend_on_idle_la_CFLAGS) $(CFLAGS) \ + $(module_suspend_on_idle_la_LDFLAGS) $(LDFLAGS) -o $@ +module_switch_on_connect_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_switch_on_connect_la_OBJECTS = modules/module_switch_on_connect_la-module-switch-on-connect.lo +module_switch_on_connect_la_OBJECTS = \ + $(am_module_switch_on_connect_la_OBJECTS) +module_switch_on_connect_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_switch_on_connect_la_CFLAGS) $(CFLAGS) \ + $(module_switch_on_connect_la_LDFLAGS) $(LDFLAGS) -o $@ +module_switch_on_port_available_la_DEPENDENCIES = \ + $(am__DEPENDENCIES_3) +am_module_switch_on_port_available_la_OBJECTS = modules/module_switch_on_port_available_la-module-switch-on-port-available.lo +module_switch_on_port_available_la_OBJECTS = \ + $(am_module_switch_on_port_available_la_OBJECTS) +module_switch_on_port_available_la_LINK = $(LIBTOOL) $(AM_V_lt) \ + --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ + $(CCLD) $(module_switch_on_port_available_la_CFLAGS) $(CFLAGS) \ + $(module_switch_on_port_available_la_LDFLAGS) $(LDFLAGS) -o $@ +module_systemd_login_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_module_systemd_login_la_OBJECTS = \ + modules/module_systemd_login_la-module-systemd-login.lo +module_systemd_login_la_OBJECTS = \ + $(am_module_systemd_login_la_OBJECTS) +module_systemd_login_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_systemd_login_la_CFLAGS) $(CFLAGS) \ + $(module_systemd_login_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_SYSTEMD_LOGIN_TRUE@am_module_systemd_login_la_rpath = -rpath \ +@HAVE_SYSTEMD_LOGIN_TRUE@ $(modlibexecdir) +module_tunnel_sink_new_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_tunnel_sink_new_la_OBJECTS = \ + modules/module_tunnel_sink_new_la-module-tunnel-sink-new.lo +module_tunnel_sink_new_la_OBJECTS = \ + $(am_module_tunnel_sink_new_la_OBJECTS) +module_tunnel_sink_new_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_tunnel_sink_new_la_CFLAGS) $(CFLAGS) \ + $(module_tunnel_sink_new_la_LDFLAGS) $(LDFLAGS) -o $@ +module_tunnel_sink_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) +am_module_tunnel_sink_la_OBJECTS = \ + modules/module_tunnel_sink_la-module-tunnel.lo +module_tunnel_sink_la_OBJECTS = $(am_module_tunnel_sink_la_OBJECTS) +module_tunnel_sink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_tunnel_sink_la_CFLAGS) $(CFLAGS) \ + $(module_tunnel_sink_la_LDFLAGS) $(LDFLAGS) -o $@ +module_tunnel_source_new_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_tunnel_source_new_la_OBJECTS = modules/module_tunnel_source_new_la-module-tunnel-source-new.lo +module_tunnel_source_new_la_OBJECTS = \ + $(am_module_tunnel_source_new_la_OBJECTS) +module_tunnel_source_new_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_tunnel_source_new_la_CFLAGS) $(CFLAGS) \ + $(module_tunnel_source_new_la_LDFLAGS) $(LDFLAGS) -o $@ +module_tunnel_source_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) +am_module_tunnel_source_la_OBJECTS = \ + modules/module_tunnel_source_la-module-tunnel.lo +module_tunnel_source_la_OBJECTS = \ + $(am_module_tunnel_source_la_OBJECTS) +module_tunnel_source_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_tunnel_source_la_CFLAGS) $(CFLAGS) \ + $(module_tunnel_source_la_LDFLAGS) $(LDFLAGS) -o $@ +module_udev_detect_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) +am_module_udev_detect_la_OBJECTS = \ + modules/module_udev_detect_la-module-udev-detect.lo +module_udev_detect_la_OBJECTS = $(am_module_udev_detect_la_OBJECTS) +module_udev_detect_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_udev_detect_la_CFLAGS) $(CFLAGS) \ + $(module_udev_detect_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_UDEV_TRUE@am_module_udev_detect_la_rpath = -rpath \ +@HAVE_UDEV_TRUE@ $(modlibexecdir) +module_virtual_sink_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_virtual_sink_la_OBJECTS = \ + modules/module_virtual_sink_la-module-virtual-sink.lo +module_virtual_sink_la_OBJECTS = $(am_module_virtual_sink_la_OBJECTS) +module_virtual_sink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_virtual_sink_la_CFLAGS) $(CFLAGS) \ + $(module_virtual_sink_la_LDFLAGS) $(LDFLAGS) -o $@ +module_virtual_source_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_virtual_source_la_OBJECTS = \ + modules/module_virtual_source_la-module-virtual-source.lo +module_virtual_source_la_OBJECTS = \ + $(am_module_virtual_source_la_OBJECTS) +module_virtual_source_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_virtual_source_la_CFLAGS) $(CFLAGS) \ + $(module_virtual_source_la_LDFLAGS) $(LDFLAGS) -o $@ +module_virtual_surround_sink_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_virtual_surround_sink_la_OBJECTS = modules/module_virtual_surround_sink_la-module-virtual-surround-sink.lo +module_virtual_surround_sink_la_OBJECTS = \ + $(am_module_virtual_surround_sink_la_OBJECTS) +module_virtual_surround_sink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_virtual_surround_sink_la_CFLAGS) $(CFLAGS) \ + $(module_virtual_surround_sink_la_LDFLAGS) $(LDFLAGS) -o $@ +module_volume_restore_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_volume_restore_la_OBJECTS = \ + modules/module_volume_restore_la-module-volume-restore.lo +module_volume_restore_la_OBJECTS = \ + $(am_module_volume_restore_la_OBJECTS) +module_volume_restore_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_volume_restore_la_CFLAGS) $(CFLAGS) \ + $(module_volume_restore_la_LDFLAGS) $(LDFLAGS) -o $@ +module_waveout_la_DEPENDENCIES = $(am__DEPENDENCIES_3) +am_module_waveout_la_OBJECTS = \ + modules/module_waveout_la-module-waveout.lo +module_waveout_la_OBJECTS = $(am_module_waveout_la_OBJECTS) +module_waveout_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_waveout_la_CFLAGS) $(CFLAGS) \ + $(module_waveout_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_WAVEOUT_TRUE@am_module_waveout_la_rpath = -rpath \ +@HAVE_WAVEOUT_TRUE@ $(modlibexecdir) +module_x11_bell_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) +am_module_x11_bell_la_OBJECTS = \ + modules/x11/module_x11_bell_la-module-x11-bell.lo +module_x11_bell_la_OBJECTS = $(am_module_x11_bell_la_OBJECTS) +module_x11_bell_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_x11_bell_la_CFLAGS) $(CFLAGS) \ + $(module_x11_bell_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_X11_TRUE@am_module_x11_bell_la_rpath = -rpath $(modlibexecdir) +module_x11_cork_request_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) +am_module_x11_cork_request_la_OBJECTS = modules/x11/module_x11_cork_request_la-module-x11-cork-request.lo +module_x11_cork_request_la_OBJECTS = \ + $(am_module_x11_cork_request_la_OBJECTS) +module_x11_cork_request_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_x11_cork_request_la_CFLAGS) $(CFLAGS) \ + $(module_x11_cork_request_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_X11_TRUE@am_module_x11_cork_request_la_rpath = -rpath \ +@HAVE_X11_TRUE@ $(modlibexecdir) +module_x11_publish_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + libprotocol-native.la $(am__DEPENDENCIES_1) +am_module_x11_publish_la_OBJECTS = \ + modules/x11/module_x11_publish_la-module-x11-publish.lo +module_x11_publish_la_OBJECTS = $(am_module_x11_publish_la_OBJECTS) +module_x11_publish_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_x11_publish_la_CFLAGS) $(CFLAGS) \ + $(module_x11_publish_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_X11_TRUE@am_module_x11_publish_la_rpath = -rpath \ +@HAVE_X11_TRUE@ $(modlibexecdir) +module_x11_xsmp_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) +am_module_x11_xsmp_la_OBJECTS = \ + modules/x11/module_x11_xsmp_la-module-x11-xsmp.lo +module_x11_xsmp_la_OBJECTS = $(am_module_x11_xsmp_la_OBJECTS) +module_x11_xsmp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_x11_xsmp_la_CFLAGS) $(CFLAGS) \ + $(module_x11_xsmp_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_X11_TRUE@am_module_x11_xsmp_la_rpath = -rpath $(modlibexecdir) +module_zeroconf_discover_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) libavahi-wrap.la +am_module_zeroconf_discover_la_OBJECTS = modules/module_zeroconf_discover_la-module-zeroconf-discover.lo +module_zeroconf_discover_la_OBJECTS = \ + $(am_module_zeroconf_discover_la_OBJECTS) +module_zeroconf_discover_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_zeroconf_discover_la_CFLAGS) $(CFLAGS) \ + $(module_zeroconf_discover_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_AVAHI_TRUE@am_module_zeroconf_discover_la_rpath = -rpath \ +@HAVE_AVAHI_TRUE@ $(modlibexecdir) +module_zeroconf_publish_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) libavahi-wrap.la \ + libprotocol-native.la +am_module_zeroconf_publish_la_OBJECTS = \ + modules/module_zeroconf_publish_la-module-zeroconf-publish.lo +module_zeroconf_publish_la_OBJECTS = \ + $(am_module_zeroconf_publish_la_OBJECTS) +module_zeroconf_publish_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(module_zeroconf_publish_la_CFLAGS) $(CFLAGS) \ + $(module_zeroconf_publish_la_LDFLAGS) $(LDFLAGS) -o $@ +@HAVE_AVAHI_TRUE@am_module_zeroconf_publish_la_rpath = -rpath \ +@HAVE_AVAHI_TRUE@ $(modlibexecdir) +am_alsa_mixer_path_test_OBJECTS = \ + tests/alsa_mixer_path_test-alsa-mixer-path-test.$(OBJEXT) +alsa_mixer_path_test_OBJECTS = $(am_alsa_mixer_path_test_OBJECTS) +alsa_mixer_path_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la libalsa-util.la +alsa_mixer_path_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(alsa_mixer_path_test_CFLAGS) $(CFLAGS) \ + $(alsa_mixer_path_test_LDFLAGS) $(LDFLAGS) -o $@ +am_alsa_time_test_OBJECTS = \ + tests/alsa_time_test-alsa-time-test.$(OBJEXT) +alsa_time_test_OBJECTS = $(am_alsa_time_test_OBJECTS) +alsa_time_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) +alsa_time_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(alsa_time_test_CFLAGS) $(CFLAGS) $(alsa_time_test_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_asyncmsgq_test_OBJECTS = \ + tests/asyncmsgq_test-asyncmsgq-test.$(OBJEXT) +asyncmsgq_test_OBJECTS = $(am_asyncmsgq_test_OBJECTS) +asyncmsgq_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +asyncmsgq_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(asyncmsgq_test_CFLAGS) $(CFLAGS) $(asyncmsgq_test_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_asyncq_test_OBJECTS = tests/asyncq_test-asyncq-test.$(OBJEXT) +asyncq_test_OBJECTS = $(am_asyncq_test_OBJECTS) +asyncq_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +asyncq_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(asyncq_test_CFLAGS) \ + $(CFLAGS) $(asyncq_test_LDFLAGS) $(LDFLAGS) -o $@ +am_atomic_test_OBJECTS = tests/atomic_test-atomic-test.$(OBJEXT) +atomic_test_OBJECTS = $(am_atomic_test_OBJECTS) +atomic_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecommon-@PA_MAJORMINOR@.la libpulse.la +atomic_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(atomic_test_CFLAGS) \ + $(CFLAGS) $(atomic_test_LDFLAGS) $(LDFLAGS) -o $@ +am_channelmap_test_OBJECTS = \ + tests/channelmap_test-channelmap-test.$(OBJEXT) +channelmap_test_OBJECTS = $(am_channelmap_test_OBJECTS) +channelmap_test_DEPENDENCIES = $(am__DEPENDENCIES_2) libpulse.la +channelmap_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(channelmap_test_CFLAGS) $(CFLAGS) $(channelmap_test_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_close_test_OBJECTS = tests/close_test-close-test.$(OBJEXT) +close_test_OBJECTS = $(am_close_test_OBJECTS) +close_test_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +close_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(close_test_CFLAGS) \ + $(CFLAGS) $(close_test_LDFLAGS) $(LDFLAGS) -o $@ +am_connect_stress_OBJECTS = \ + tests/connect_stress-connect-stress.$(OBJEXT) +connect_stress_OBJECTS = $(am_connect_stress_OBJECTS) +connect_stress_DEPENDENCIES = $(am__DEPENDENCIES_2) libpulse.la +connect_stress_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(connect_stress_CFLAGS) $(CFLAGS) $(connect_stress_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_core_util_test_OBJECTS = \ + tests/core_util_test-core-util-test.$(OBJEXT) +core_util_test_OBJECTS = $(am_core_util_test_OBJECTS) +core_util_test_DEPENDENCIES = $(am__DEPENDENCIES_2) libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +core_util_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(core_util_test_CFLAGS) $(CFLAGS) $(core_util_test_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_cpu_mix_test_OBJECTS = tests/cpu_mix_test-cpu-mix-test.$(OBJEXT) +cpu_mix_test_OBJECTS = $(am_cpu_mix_test_OBJECTS) +cpu_mix_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +cpu_mix_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(cpu_mix_test_CFLAGS) \ + $(CFLAGS) $(cpu_mix_test_LDFLAGS) $(LDFLAGS) -o $@ +am_cpu_remap_test_OBJECTS = \ + tests/cpu_remap_test-cpu-remap-test.$(OBJEXT) +cpu_remap_test_OBJECTS = $(am_cpu_remap_test_OBJECTS) +cpu_remap_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +cpu_remap_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(cpu_remap_test_CFLAGS) $(CFLAGS) $(cpu_remap_test_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_cpu_sconv_test_OBJECTS = \ + tests/cpu_sconv_test-cpu-sconv-test.$(OBJEXT) +cpu_sconv_test_OBJECTS = $(am_cpu_sconv_test_OBJECTS) +cpu_sconv_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +cpu_sconv_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(cpu_sconv_test_CFLAGS) $(CFLAGS) $(cpu_sconv_test_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_cpu_volume_test_OBJECTS = \ + tests/cpu_volume_test-cpu-volume-test.$(OBJEXT) +cpu_volume_test_OBJECTS = $(am_cpu_volume_test_OBJECTS) +cpu_volume_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +cpu_volume_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(cpu_volume_test_CFLAGS) $(CFLAGS) $(cpu_volume_test_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_cpulimit_test_OBJECTS = \ + tests/cpulimit_test-cpulimit-test.$(OBJEXT) \ + daemon/cpulimit_test-cpulimit.$(OBJEXT) +cpulimit_test_OBJECTS = $(am_cpulimit_test_OBJECTS) +cpulimit_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +cpulimit_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(cpulimit_test_CFLAGS) \ + $(CFLAGS) $(cpulimit_test_LDFLAGS) $(LDFLAGS) -o $@ +am_cpulimit_test2_OBJECTS = \ + tests/cpulimit_test2-cpulimit-test.$(OBJEXT) \ + daemon/cpulimit_test2-cpulimit.$(OBJEXT) +cpulimit_test2_OBJECTS = $(am_cpulimit_test2_OBJECTS) +cpulimit_test2_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +cpulimit_test2_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(cpulimit_test2_CFLAGS) $(CFLAGS) $(cpulimit_test2_LDFLAGS) \ + $(LDFLAGS) -o $@ +am__echo_cancel_test_SOURCES_DIST = \ + modules/echo-cancel/module-echo-cancel.c \ + modules/echo-cancel/null.c modules/echo-cancel/echo-cancel.h \ + modules/echo-cancel/adrian-aec.c \ + modules/echo-cancel/adrian-aec.h modules/echo-cancel/adrian.c \ + modules/echo-cancel/adrian.h modules/echo-cancel/speex.c +@HAVE_ADRIAN_EC_TRUE@am__objects_27 = modules/echo-cancel/echo_cancel_test-adrian-aec.$(OBJEXT) \ +@HAVE_ADRIAN_EC_TRUE@ modules/echo-cancel/echo_cancel_test-adrian.$(OBJEXT) +@HAVE_SPEEX_TRUE@am__objects_28 = modules/echo-cancel/echo_cancel_test-speex.$(OBJEXT) +am__objects_29 = modules/echo-cancel/echo_cancel_test-module-echo-cancel.$(OBJEXT) \ + modules/echo-cancel/echo_cancel_test-null.$(OBJEXT) \ + $(am__objects_27) $(am__objects_28) +am_echo_cancel_test_OBJECTS = $(am__objects_29) +@HAVE_ADRIAN_EC_TRUE@@HAVE_ORC_TRUE@am__objects_30 = modules/echo-cancel/echo_cancel_test-adrian-aec-orc-gen.$(OBJEXT) +nodist_echo_cancel_test_OBJECTS = $(am__objects_30) +echo_cancel_test_OBJECTS = $(am_echo_cancel_test_OBJECTS) \ + $(nodist_echo_cancel_test_OBJECTS) +am__DEPENDENCIES_15 = $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_14) \ + $(am__DEPENDENCIES_10) $(am__append_144) +echo_cancel_test_DEPENDENCIES = $(am__DEPENDENCIES_15) +echo_cancel_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(echo_cancel_test_CFLAGS) $(CFLAGS) \ + $(echo_cancel_test_LDFLAGS) $(LDFLAGS) -o $@ +am_extended_test_OBJECTS = \ + tests/extended_test-extended-test.$(OBJEXT) +extended_test_OBJECTS = $(am_extended_test_OBJECTS) +extended_test_DEPENDENCIES = $(am__DEPENDENCIES_2) libpulse.la +extended_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(extended_test_CFLAGS) \ + $(CFLAGS) $(extended_test_LDFLAGS) $(LDFLAGS) -o $@ +am_flist_test_OBJECTS = tests/flist_test-flist-test.$(OBJEXT) +flist_test_OBJECTS = $(am_flist_test_OBJECTS) +flist_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +flist_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(flist_test_CFLAGS) \ + $(CFLAGS) $(flist_test_LDFLAGS) $(LDFLAGS) -o $@ +am_format_test_OBJECTS = tests/format_test-format-test.$(OBJEXT) +format_test_OBJECTS = $(am_format_test_OBJECTS) +format_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +format_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(format_test_CFLAGS) \ + $(CFLAGS) $(format_test_LDFLAGS) $(LDFLAGS) -o $@ +am_gconf_helper_OBJECTS = \ + modules/gconf/gconf_helper-gconf-helper.$(OBJEXT) +gconf_helper_OBJECTS = $(am_gconf_helper_OBJECTS) +gconf_helper_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la \ + libpulsecommon-@PA_MAJORMINOR@.la libpulse.la \ + $(am__DEPENDENCIES_1) +gconf_helper_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(gconf_helper_CFLAGS) \ + $(CFLAGS) $(gconf_helper_LDFLAGS) $(LDFLAGS) -o $@ +am_get_binary_name_test_OBJECTS = \ + tests/get_binary_name_test-get-binary-name-test.$(OBJEXT) +get_binary_name_test_OBJECTS = $(am_get_binary_name_test_OBJECTS) +get_binary_name_test_DEPENDENCIES = $(am__DEPENDENCIES_2) libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +get_binary_name_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(get_binary_name_test_CFLAGS) $(CFLAGS) \ + $(get_binary_name_test_LDFLAGS) $(LDFLAGS) -o $@ +am_gsettings_helper_OBJECTS = \ + modules/gsettings/gsettings_helper-gsettings-helper.$(OBJEXT) +gsettings_helper_OBJECTS = $(am_gsettings_helper_OBJECTS) +gsettings_helper_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la \ + libpulsecommon-@PA_MAJORMINOR@.la libpulse.la \ + $(am__DEPENDENCIES_1) +gsettings_helper_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(gsettings_helper_CFLAGS) $(CFLAGS) \ + $(gsettings_helper_LDFLAGS) $(LDFLAGS) -o $@ +am_gtk_test_OBJECTS = tests/gtk_test-gtk-test.$(OBJEXT) +gtk_test_OBJECTS = $(am_gtk_test_OBJECTS) +gtk_test_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ + libpulse-mainloop-glib.la libpulse.la +gtk_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(gtk_test_CFLAGS) \ + $(CFLAGS) $(gtk_test_LDFLAGS) $(LDFLAGS) -o $@ +am_hashmap_test_OBJECTS = tests/hashmap_test-hashmap-test.$(OBJEXT) +hashmap_test_OBJECTS = $(am_hashmap_test_OBJECTS) +hashmap_test_DEPENDENCIES = $(am__DEPENDENCIES_2) libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +hashmap_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(hashmap_test_CFLAGS) \ + $(CFLAGS) $(hashmap_test_LDFLAGS) $(LDFLAGS) -o $@ +am_hook_list_test_OBJECTS = \ + tests/hook_list_test-hook-list-test.$(OBJEXT) +hook_list_test_OBJECTS = $(am_hook_list_test_OBJECTS) +hook_list_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +hook_list_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(hook_list_test_CFLAGS) $(CFLAGS) $(hook_list_test_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_interpol_test_OBJECTS = \ + tests/interpol_test-interpol-test.$(OBJEXT) +interpol_test_OBJECTS = $(am_interpol_test_OBJECTS) +interpol_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +interpol_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(interpol_test_CFLAGS) \ + $(CFLAGS) $(interpol_test_LDFLAGS) $(LDFLAGS) -o $@ +am_ipacl_test_OBJECTS = tests/ipacl_test-ipacl-test.$(OBJEXT) +ipacl_test_OBJECTS = $(am_ipacl_test_OBJECTS) +ipacl_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +ipacl_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(ipacl_test_CFLAGS) \ + $(CFLAGS) $(ipacl_test_LDFLAGS) $(LDFLAGS) -o $@ +am_json_test_OBJECTS = tests/json_test-json-test.$(OBJEXT) +json_test_OBJECTS = $(am_json_test_OBJECTS) +json_test_DEPENDENCIES = $(am__DEPENDENCIES_2) libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +json_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(json_test_CFLAGS) \ + $(CFLAGS) $(json_test_LDFLAGS) $(LDFLAGS) -o $@ +am_lfe_filter_test_OBJECTS = \ + tests/lfe_filter_test-lfe-filter-test.$(OBJEXT) +lfe_filter_test_OBJECTS = $(am_lfe_filter_test_OBJECTS) +lfe_filter_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +lfe_filter_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(lfe_filter_test_CFLAGS) $(CFLAGS) $(lfe_filter_test_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_lo_latency_test_OBJECTS = \ + tests/lo_latency_test-lo-latency-test.$(OBJEXT) +lo_latency_test_OBJECTS = $(am_lo_latency_test_OBJECTS) +lo_latency_test_DEPENDENCIES = $(am__DEPENDENCIES_2) libpulse.la \ + liblo-test-util.la +lo_latency_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(lo_latency_test_CFLAGS) $(CFLAGS) $(lo_latency_test_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_lock_autospawn_test_OBJECTS = \ + tests/lock_autospawn_test-lock-autospawn-test.$(OBJEXT) +lock_autospawn_test_OBJECTS = $(am_lock_autospawn_test_OBJECTS) +lock_autospawn_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +lock_autospawn_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(lock_autospawn_test_CFLAGS) $(CFLAGS) \ + $(lock_autospawn_test_LDFLAGS) $(LDFLAGS) -o $@ +am_mainloop_test_OBJECTS = \ + tests/mainloop_test-mainloop-test.$(OBJEXT) +mainloop_test_OBJECTS = $(am_mainloop_test_OBJECTS) +mainloop_test_DEPENDENCIES = $(am__DEPENDENCIES_2) libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +mainloop_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(mainloop_test_CFLAGS) \ + $(CFLAGS) $(mainloop_test_LDFLAGS) $(LDFLAGS) -o $@ +am__objects_31 = tests/mainloop_test_glib-mainloop-test.$(OBJEXT) +am_mainloop_test_glib_OBJECTS = $(am__objects_31) +mainloop_test_glib_OBJECTS = $(am_mainloop_test_glib_OBJECTS) +am__DEPENDENCIES_16 = $(am__DEPENDENCIES_2) libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +mainloop_test_glib_DEPENDENCIES = $(am__DEPENDENCIES_16) \ + $(am__DEPENDENCIES_1) libpulse-mainloop-glib.la +mainloop_test_glib_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(mainloop_test_glib_CFLAGS) $(CFLAGS) \ + $(mainloop_test_glib_LDFLAGS) $(LDFLAGS) -o $@ +am_mcalign_test_OBJECTS = tests/mcalign_test-mcalign-test.$(OBJEXT) +mcalign_test_OBJECTS = $(am_mcalign_test_OBJECTS) +mcalign_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) libpulsecore-@PA_MAJORMINOR@.la \ + libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +mcalign_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(mcalign_test_CFLAGS) \ + $(CFLAGS) $(mcalign_test_LDFLAGS) $(LDFLAGS) -o $@ +am_memblock_test_OBJECTS = \ + tests/memblock_test-memblock-test.$(OBJEXT) +memblock_test_OBJECTS = $(am_memblock_test_OBJECTS) +memblock_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +memblock_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(memblock_test_CFLAGS) \ + $(CFLAGS) $(memblock_test_LDFLAGS) $(LDFLAGS) -o $@ +am_memblockq_test_OBJECTS = \ + tests/memblockq_test-memblockq-test.$(OBJEXT) +memblockq_test_OBJECTS = $(am_memblockq_test_OBJECTS) +memblockq_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) libpulsecore-@PA_MAJORMINOR@.la \ + libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +memblockq_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(memblockq_test_CFLAGS) $(CFLAGS) $(memblockq_test_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_mix_test_OBJECTS = tests/mix_test-mix-test.$(OBJEXT) +mix_test_OBJECTS = $(am_mix_test_OBJECTS) +mix_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +mix_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(mix_test_CFLAGS) \ + $(CFLAGS) $(mix_test_LDFLAGS) $(LDFLAGS) -o $@ +am_mult_s16_test_OBJECTS = \ + tests/mult_s16_test-mult-s16-test.$(OBJEXT) +mult_s16_test_OBJECTS = $(am_mult_s16_test_OBJECTS) +mult_s16_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +mult_s16_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(mult_s16_test_CFLAGS) \ + $(CFLAGS) $(mult_s16_test_LDFLAGS) $(LDFLAGS) -o $@ +am_once_test_OBJECTS = tests/once_test-once-test.$(OBJEXT) +once_test_OBJECTS = $(am_once_test_OBJECTS) +once_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +once_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(once_test_CFLAGS) \ + $(CFLAGS) $(once_test_LDFLAGS) $(LDFLAGS) -o $@ +am_pacat_OBJECTS = utils/pacat-pacat.$(OBJEXT) +pacat_OBJECTS = $(am_pacat_OBJECTS) +pacat_DEPENDENCIES = $(am__DEPENDENCIES_2) libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la $(am__DEPENDENCIES_1) +pacat_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(pacat_CFLAGS) $(CFLAGS) \ + $(pacat_LDFLAGS) $(LDFLAGS) -o $@ +am_pacat_simple_OBJECTS = tests/pacat_simple-pacat-simple.$(OBJEXT) +pacat_simple_OBJECTS = $(am_pacat_simple_OBJECTS) +pacat_simple_DEPENDENCIES = $(am__DEPENDENCIES_2) libpulse.la \ + libpulse-simple.la +pacat_simple_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(pacat_simple_CFLAGS) \ + $(CFLAGS) $(pacat_simple_LDFLAGS) $(LDFLAGS) -o $@ +am_pacmd_OBJECTS = utils/pacmd-pacmd.$(OBJEXT) +pacmd_OBJECTS = $(am_pacmd_OBJECTS) +pacmd_DEPENDENCIES = $(am__DEPENDENCIES_2) libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +pacmd_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(pacmd_CFLAGS) $(CFLAGS) \ + $(pacmd_LDFLAGS) $(LDFLAGS) -o $@ +am_pactl_OBJECTS = utils/pactl-pactl.$(OBJEXT) +pactl_OBJECTS = $(am_pactl_OBJECTS) +pactl_DEPENDENCIES = $(am__DEPENDENCIES_2) libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la $(am__DEPENDENCIES_1) +pactl_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(pactl_CFLAGS) $(CFLAGS) \ + $(pactl_LDFLAGS) $(LDFLAGS) -o $@ +am_parec_simple_OBJECTS = tests/parec_simple-parec-simple.$(OBJEXT) +parec_simple_OBJECTS = $(am_parec_simple_OBJECTS) +parec_simple_DEPENDENCIES = $(am__DEPENDENCIES_2) libpulse.la \ + libpulse-simple.la +parec_simple_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(parec_simple_CFLAGS) \ + $(CFLAGS) $(parec_simple_LDFLAGS) $(LDFLAGS) -o $@ +am_passthrough_test_OBJECTS = \ + tests/passthrough_test-passthrough-test.$(OBJEXT) +passthrough_test_OBJECTS = $(am_passthrough_test_OBJECTS) +passthrough_test_DEPENDENCIES = $(am__DEPENDENCIES_2) libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +passthrough_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(passthrough_test_CFLAGS) $(CFLAGS) \ + $(passthrough_test_LDFLAGS) $(LDFLAGS) -o $@ +am_pasuspender_OBJECTS = utils/pasuspender-pasuspender.$(OBJEXT) +pasuspender_OBJECTS = $(am_pasuspender_OBJECTS) +pasuspender_DEPENDENCIES = $(am__DEPENDENCIES_2) libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +pasuspender_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(pasuspender_CFLAGS) \ + $(CFLAGS) $(pasuspender_LDFLAGS) $(LDFLAGS) -o $@ +am_pax11publish_OBJECTS = utils/pax11publish-pax11publish.$(OBJEXT) +pax11publish_OBJECTS = $(am_pax11publish_OBJECTS) +pax11publish_DEPENDENCIES = $(am__DEPENDENCIES_2) libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la $(am__DEPENDENCIES_1) +pax11publish_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(pax11publish_CFLAGS) \ + $(CFLAGS) $(pax11publish_LDFLAGS) $(LDFLAGS) -o $@ +am_proplist_test_OBJECTS = \ + tests/proplist_test-proplist-test.$(OBJEXT) +proplist_test_OBJECTS = $(am_proplist_test_OBJECTS) +proplist_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +proplist_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(proplist_test_CFLAGS) \ + $(CFLAGS) $(proplist_test_LDFLAGS) $(LDFLAGS) -o $@ +am__pulseaudio_SOURCES_DIST = daemon/caps.c daemon/caps.h \ + daemon/cmdline.c daemon/cmdline.h daemon/cpulimit.c \ + daemon/cpulimit.h daemon/daemon-conf.c daemon/daemon-conf.h \ + daemon/dumpmodules.c daemon/dumpmodules.h \ + daemon/ltdl-bind-now.c daemon/ltdl-bind-now.h daemon/main.c \ + daemon/server-lookup.c daemon/server-lookup.h +@HAVE_DBUS_TRUE@am__objects_32 = \ +@HAVE_DBUS_TRUE@ daemon/pulseaudio-server-lookup.$(OBJEXT) +am_pulseaudio_OBJECTS = daemon/pulseaudio-caps.$(OBJEXT) \ + daemon/pulseaudio-cmdline.$(OBJEXT) \ + daemon/pulseaudio-cpulimit.$(OBJEXT) \ + daemon/pulseaudio-daemon-conf.$(OBJEXT) \ + daemon/pulseaudio-dumpmodules.$(OBJEXT) \ + daemon/pulseaudio-ltdl-bind-now.$(OBJEXT) \ + daemon/pulseaudio-main.$(OBJEXT) $(am__objects_32) +pulseaudio_OBJECTS = $(am_pulseaudio_OBJECTS) +pulseaudio_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(pulseaudio_CFLAGS) \ + $(CFLAGS) $(pulseaudio_LDFLAGS) $(LDFLAGS) -o $@ +am_queue_test_OBJECTS = tests/queue_test-queue-test.$(OBJEXT) +queue_test_OBJECTS = $(am_queue_test_OBJECTS) +queue_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +queue_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(queue_test_CFLAGS) \ + $(CFLAGS) $(queue_test_LDFLAGS) $(LDFLAGS) -o $@ +am_remix_test_OBJECTS = tests/remix_test-remix-test.$(OBJEXT) +remix_test_OBJECTS = $(am_remix_test_OBJECTS) +remix_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +remix_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(remix_test_CFLAGS) \ + $(CFLAGS) $(remix_test_LDFLAGS) $(LDFLAGS) -o $@ +am_resampler_test_OBJECTS = \ + tests/resampler_test-resampler-test.$(OBJEXT) +resampler_test_OBJECTS = $(am_resampler_test_OBJECTS) +resampler_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +resampler_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(resampler_test_CFLAGS) $(CFLAGS) $(resampler_test_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_rtpoll_test_OBJECTS = tests/rtpoll_test-rtpoll-test.$(OBJEXT) +rtpoll_test_OBJECTS = $(am_rtpoll_test_OBJECTS) +rtpoll_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +rtpoll_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(rtpoll_test_CFLAGS) \ + $(CFLAGS) $(rtpoll_test_LDFLAGS) $(LDFLAGS) -o $@ +am_rtstutter_OBJECTS = tests/rtstutter-rtstutter.$(OBJEXT) +rtstutter_OBJECTS = $(am_rtstutter_OBJECTS) +rtstutter_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +rtstutter_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(rtstutter_CFLAGS) \ + $(CFLAGS) $(rtstutter_LDFLAGS) $(LDFLAGS) -o $@ +am_sig2str_test_OBJECTS = tests/sig2str_test-sig2str-test.$(OBJEXT) +sig2str_test_OBJECTS = $(am_sig2str_test_OBJECTS) +sig2str_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +sig2str_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(sig2str_test_CFLAGS) \ + $(CFLAGS) $(sig2str_test_LDFLAGS) $(LDFLAGS) -o $@ +am_sigbus_test_OBJECTS = tests/sigbus_test-sigbus-test.$(OBJEXT) +sigbus_test_OBJECTS = $(am_sigbus_test_OBJECTS) +sigbus_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +sigbus_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(sigbus_test_CFLAGS) \ + $(CFLAGS) $(sigbus_test_LDFLAGS) $(LDFLAGS) -o $@ +am_smoother_test_OBJECTS = \ + tests/smoother_test-smoother-test.$(OBJEXT) +smoother_test_OBJECTS = $(am_smoother_test_OBJECTS) +smoother_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +smoother_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(smoother_test_CFLAGS) \ + $(CFLAGS) $(smoother_test_LDFLAGS) $(LDFLAGS) -o $@ +am_srbchannel_test_OBJECTS = \ + tests/srbchannel_test-srbchannel-test.$(OBJEXT) +srbchannel_test_OBJECTS = $(am_srbchannel_test_OBJECTS) +srbchannel_test_DEPENDENCIES = $(am__DEPENDENCIES_2) libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +srbchannel_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(srbchannel_test_CFLAGS) $(CFLAGS) $(srbchannel_test_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_stripnul_OBJECTS = tests/stripnul-stripnul.$(OBJEXT) +stripnul_OBJECTS = $(am_stripnul_OBJECTS) +stripnul_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +stripnul_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(stripnul_CFLAGS) \ + $(CFLAGS) $(stripnul_LDFLAGS) $(LDFLAGS) -o $@ +am_strlist_test_OBJECTS = tests/strlist_test-strlist-test.$(OBJEXT) +strlist_test_OBJECTS = $(am_strlist_test_OBJECTS) +strlist_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) libpulsecore-@PA_MAJORMINOR@.la \ + libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +strlist_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(strlist_test_CFLAGS) \ + $(CFLAGS) $(strlist_test_LDFLAGS) $(LDFLAGS) -o $@ +am_sync_playback_OBJECTS = \ + tests/sync_playback-sync-playback.$(OBJEXT) +sync_playback_OBJECTS = $(am_sync_playback_OBJECTS) +sync_playback_DEPENDENCIES = $(am__DEPENDENCIES_2) libpulse.la +sync_playback_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(sync_playback_CFLAGS) \ + $(CFLAGS) $(sync_playback_LDFLAGS) $(LDFLAGS) -o $@ +am_thread_mainloop_test_OBJECTS = \ + tests/thread_mainloop_test-thread-mainloop-test.$(OBJEXT) +thread_mainloop_test_OBJECTS = $(am_thread_mainloop_test_OBJECTS) +thread_mainloop_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +thread_mainloop_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(thread_mainloop_test_CFLAGS) $(CFLAGS) \ + $(thread_mainloop_test_LDFLAGS) $(LDFLAGS) -o $@ +am_thread_test_OBJECTS = tests/thread_test-thread-test.$(OBJEXT) +thread_test_OBJECTS = $(am_thread_test_OBJECTS) +thread_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +thread_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(thread_test_CFLAGS) \ + $(CFLAGS) $(thread_test_LDFLAGS) $(LDFLAGS) -o $@ +am_usergroup_test_OBJECTS = \ + tests/usergroup_test-usergroup-test.$(OBJEXT) +usergroup_test_OBJECTS = $(am_usergroup_test_OBJECTS) +usergroup_test_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + libpulsecore-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +usergroup_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(usergroup_test_CFLAGS) $(CFLAGS) $(usergroup_test_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_utf8_test_OBJECTS = tests/utf8_test-utf8-test.$(OBJEXT) +utf8_test_OBJECTS = $(am_utf8_test_OBJECTS) +utf8_test_DEPENDENCIES = $(am__DEPENDENCIES_2) libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +utf8_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(utf8_test_CFLAGS) \ + $(CFLAGS) $(utf8_test_LDFLAGS) $(LDFLAGS) -o $@ +am_volume_test_OBJECTS = tests/volume_test-volume-test.$(OBJEXT) +volume_test_OBJECTS = $(am_volume_test_OBJECTS) +volume_test_DEPENDENCIES = $(am__DEPENDENCIES_2) libpulse.la \ + libpulsecommon-@PA_MAJORMINOR@.la +volume_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(volume_test_CFLAGS) \ + $(CFLAGS) $(volume_test_LDFLAGS) $(LDFLAGS) -o $@ +SCRIPTS = $(bin_SCRIPTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = daemon/$(DEPDIR)/cpulimit_test-cpulimit.Po \ + daemon/$(DEPDIR)/cpulimit_test2-cpulimit.Po \ + daemon/$(DEPDIR)/pulseaudio-caps.Po \ + daemon/$(DEPDIR)/pulseaudio-cmdline.Po \ + daemon/$(DEPDIR)/pulseaudio-cpulimit.Po \ + daemon/$(DEPDIR)/pulseaudio-daemon-conf.Po \ + daemon/$(DEPDIR)/pulseaudio-dumpmodules.Po \ + daemon/$(DEPDIR)/pulseaudio-ltdl-bind-now.Po \ + daemon/$(DEPDIR)/pulseaudio-main.Po \ + daemon/$(DEPDIR)/pulseaudio-server-lookup.Po \ + modules/$(DEPDIR)/libalsa_util_la-reserve-monitor.Plo \ + modules/$(DEPDIR)/libalsa_util_la-reserve-wrap.Plo \ + modules/$(DEPDIR)/libalsa_util_la-reserve.Plo \ + modules/$(DEPDIR)/libalsa_util_la-udev-util.Plo \ + modules/$(DEPDIR)/module_allow_passthrough_la-module-allow-passthrough.Plo \ + modules/$(DEPDIR)/module_always_sink_la-module-always-sink.Plo \ + modules/$(DEPDIR)/module_always_source_la-module-always-source.Plo \ + modules/$(DEPDIR)/module_augment_properties_la-module-augment-properties.Plo \ + modules/$(DEPDIR)/module_card_restore_la-module-card-restore.Plo \ + modules/$(DEPDIR)/module_cli_la-module-cli.Plo \ + modules/$(DEPDIR)/module_cli_protocol_tcp_la-module-protocol-stub.Plo \ + modules/$(DEPDIR)/module_cli_protocol_unix_la-module-protocol-stub.Plo \ + modules/$(DEPDIR)/module_combine_la-module-combine.Plo \ + modules/$(DEPDIR)/module_combine_sink_la-module-combine-sink.Plo \ + modules/$(DEPDIR)/module_console_kit_la-module-console-kit.Plo \ + modules/$(DEPDIR)/module_default_device_restore_la-module-default-device-restore.Plo \ + modules/$(DEPDIR)/module_detect_la-module-detect.Plo \ + modules/$(DEPDIR)/module_device_manager_la-module-device-manager.Plo \ + modules/$(DEPDIR)/module_device_restore_la-module-device-restore.Plo \ + modules/$(DEPDIR)/module_equalizer_sink_la-module-equalizer-sink.Plo \ + modules/$(DEPDIR)/module_esound_compat_spawnfd_la-module-esound-compat-spawnfd.Plo \ + modules/$(DEPDIR)/module_esound_compat_spawnpid_la-module-esound-compat-spawnpid.Plo \ + modules/$(DEPDIR)/module_esound_protocol_tcp_la-module-protocol-stub.Plo \ + modules/$(DEPDIR)/module_esound_protocol_unix_la-module-protocol-stub.Plo \ + modules/$(DEPDIR)/module_esound_sink_la-module-esound-sink.Plo \ + modules/$(DEPDIR)/module_filter_apply_la-module-filter-apply.Plo \ + modules/$(DEPDIR)/module_filter_heuristics_la-module-filter-heuristics.Plo \ + modules/$(DEPDIR)/module_gconf_la-stdin-util.Plo \ + modules/$(DEPDIR)/module_gsettings_la-stdin-util.Plo \ + modules/$(DEPDIR)/module_hal_detect_la-module-hal-detect-compat.Plo \ + modules/$(DEPDIR)/module_http_protocol_tcp_la-module-protocol-stub.Plo \ + modules/$(DEPDIR)/module_http_protocol_unix_la-module-protocol-stub.Plo \ + modules/$(DEPDIR)/module_intended_roles_la-module-intended-roles.Plo \ + modules/$(DEPDIR)/module_ladspa_sink_la-module-ladspa-sink.Plo \ + modules/$(DEPDIR)/module_lirc_la-module-lirc.Plo \ + modules/$(DEPDIR)/module_loopback_la-module-loopback.Plo \ + modules/$(DEPDIR)/module_match_la-module-match.Plo \ + modules/$(DEPDIR)/module_mmkbd_evdev_la-module-mmkbd-evdev.Plo \ + modules/$(DEPDIR)/module_native_protocol_fd_la-module-native-protocol-fd.Plo \ + modules/$(DEPDIR)/module_native_protocol_tcp_la-module-protocol-stub.Plo \ + modules/$(DEPDIR)/module_native_protocol_unix_la-module-protocol-stub.Plo \ + modules/$(DEPDIR)/module_null_sink_la-module-null-sink.Plo \ + modules/$(DEPDIR)/module_null_source_la-module-null-source.Plo \ + modules/$(DEPDIR)/module_pipe_sink_la-module-pipe-sink.Plo \ + modules/$(DEPDIR)/module_pipe_source_la-module-pipe-source.Plo \ + modules/$(DEPDIR)/module_position_event_sounds_la-module-position-event-sounds.Plo \ + modules/$(DEPDIR)/module_remap_sink_la-module-remap-sink.Plo \ + modules/$(DEPDIR)/module_remap_source_la-module-remap-source.Plo \ + modules/$(DEPDIR)/module_rescue_streams_la-module-rescue-streams.Plo \ + modules/$(DEPDIR)/module_role_cork_la-module-role-cork.Plo \ + modules/$(DEPDIR)/module_role_cork_la-stream-interaction.Plo \ + modules/$(DEPDIR)/module_role_ducking_la-module-role-ducking.Plo \ + modules/$(DEPDIR)/module_role_ducking_la-stream-interaction.Plo \ + modules/$(DEPDIR)/module_rygel_media_server_la-module-rygel-media-server.Plo \ + modules/$(DEPDIR)/module_simple_protocol_tcp_la-module-protocol-stub.Plo \ + modules/$(DEPDIR)/module_simple_protocol_unix_la-module-protocol-stub.Plo \ + modules/$(DEPDIR)/module_sine_la-module-sine.Plo \ + modules/$(DEPDIR)/module_sine_source_la-module-sine-source.Plo \ + modules/$(DEPDIR)/module_solaris_la-module-solaris.Plo \ + modules/$(DEPDIR)/module_stream_restore_la-module-stream-restore.Plo \ + modules/$(DEPDIR)/module_suspend_on_idle_la-module-suspend-on-idle.Plo \ + modules/$(DEPDIR)/module_switch_on_connect_la-module-switch-on-connect.Plo \ + modules/$(DEPDIR)/module_switch_on_port_available_la-module-switch-on-port-available.Plo \ + modules/$(DEPDIR)/module_systemd_login_la-module-systemd-login.Plo \ + modules/$(DEPDIR)/module_tunnel_sink_la-module-tunnel.Plo \ + modules/$(DEPDIR)/module_tunnel_sink_new_la-module-tunnel-sink-new.Plo \ + modules/$(DEPDIR)/module_tunnel_source_la-module-tunnel.Plo \ + modules/$(DEPDIR)/module_tunnel_source_new_la-module-tunnel-source-new.Plo \ + modules/$(DEPDIR)/module_udev_detect_la-module-udev-detect.Plo \ + modules/$(DEPDIR)/module_virtual_sink_la-module-virtual-sink.Plo \ + modules/$(DEPDIR)/module_virtual_source_la-module-virtual-source.Plo \ + modules/$(DEPDIR)/module_virtual_surround_sink_la-module-virtual-surround-sink.Plo \ + modules/$(DEPDIR)/module_volume_restore_la-module-volume-restore.Plo \ + modules/$(DEPDIR)/module_waveout_la-module-waveout.Plo \ + modules/$(DEPDIR)/module_zeroconf_discover_la-module-zeroconf-discover.Plo \ + modules/$(DEPDIR)/module_zeroconf_publish_la-module-zeroconf-publish.Plo \ + modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-mixer.Plo \ + modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-sink.Plo \ + modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-source.Plo \ + modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-ucm.Plo \ + modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-util.Plo \ + modules/alsa/$(DEPDIR)/module_alsa_card_la-module-alsa-card.Plo \ + modules/alsa/$(DEPDIR)/module_alsa_sink_la-module-alsa-sink.Plo \ + modules/alsa/$(DEPDIR)/module_alsa_source_la-module-alsa-source.Plo \ + modules/bluetooth/$(DEPDIR)/libbluez5_util_la-a2dp-codec-sbc.Plo \ + modules/bluetooth/$(DEPDIR)/libbluez5_util_la-a2dp-codec-util.Plo \ + modules/bluetooth/$(DEPDIR)/libbluez5_util_la-backend-native.Plo \ + modules/bluetooth/$(DEPDIR)/libbluez5_util_la-backend-ofono.Plo \ + modules/bluetooth/$(DEPDIR)/libbluez5_util_la-bluez5-util.Plo \ + modules/bluetooth/$(DEPDIR)/module_bluetooth_discover_la-module-bluetooth-discover.Plo \ + modules/bluetooth/$(DEPDIR)/module_bluetooth_policy_la-module-bluetooth-policy.Plo \ + modules/bluetooth/$(DEPDIR)/module_bluez5_device_la-module-bluez5-device.Plo \ + modules/bluetooth/$(DEPDIR)/module_bluez5_discover_la-module-bluez5-discover.Plo \ + modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-card-profile.Plo \ + modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-card.Plo \ + modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-client.Plo \ + modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-core.Plo \ + modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-device-port.Plo \ + modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-device.Plo \ + modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-memstats.Plo \ + modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-module.Plo \ + modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-sample.Plo \ + modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-stream.Plo \ + modules/dbus/$(DEPDIR)/module_dbus_protocol_la-module-dbus-protocol.Plo \ + modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian-aec-orc-gen.Po \ + modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian-aec.Po \ + modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian.Po \ + modules/echo-cancel/$(DEPDIR)/echo_cancel_test-module-echo-cancel.Po \ + modules/echo-cancel/$(DEPDIR)/echo_cancel_test-null.Po \ + modules/echo-cancel/$(DEPDIR)/echo_cancel_test-speex.Po \ + modules/echo-cancel/$(DEPDIR)/libwebrtc_util_la-webrtc.Plo \ + modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-adrian-aec-orc-gen.Plo \ + modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-adrian-aec.Plo \ + modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-adrian.Plo \ + modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-module-echo-cancel.Plo \ + modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-null.Plo \ + modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-speex.Plo \ + modules/gconf/$(DEPDIR)/gconf_helper-gconf-helper.Po \ + modules/gconf/$(DEPDIR)/module_gconf_la-module-gconf.Plo \ + modules/gsettings/$(DEPDIR)/gsettings_helper-gsettings-helper.Po \ + modules/gsettings/$(DEPDIR)/module_gsettings_la-module-gsettings.Plo \ + modules/jack/$(DEPDIR)/module_jack_sink_la-module-jack-sink.Plo \ + modules/jack/$(DEPDIR)/module_jack_source_la-module-jack-source.Plo \ + modules/jack/$(DEPDIR)/module_jackdbus_detect_la-module-jackdbus-detect.Plo \ + modules/macosx/$(DEPDIR)/module_bonjour_publish_la-module-bonjour-publish.Plo \ + modules/macosx/$(DEPDIR)/module_coreaudio_detect_la-module-coreaudio-detect.Plo \ + modules/macosx/$(DEPDIR)/module_coreaudio_device_la-module-coreaudio-device.Plo \ + modules/oss/$(DEPDIR)/module_oss_la-module-oss.Plo \ + modules/oss/$(DEPDIR)/oss-util.Plo \ + modules/raop/$(DEPDIR)/libraop_la-raop-client.Plo \ + modules/raop/$(DEPDIR)/libraop_la-raop-crypto.Plo \ + modules/raop/$(DEPDIR)/libraop_la-raop-packet-buffer.Plo \ + modules/raop/$(DEPDIR)/libraop_la-raop-sink.Plo \ + modules/raop/$(DEPDIR)/libraop_la-raop-util.Plo \ + modules/raop/$(DEPDIR)/module_raop_discover_la-module-raop-discover.Plo \ + modules/raop/$(DEPDIR)/module_raop_sink_la-module-raop-sink.Plo \ + modules/rtp/$(DEPDIR)/librtp_la-headerlist.Plo \ + modules/rtp/$(DEPDIR)/librtp_la-rtp-common.Plo \ + modules/rtp/$(DEPDIR)/librtp_la-rtp-gstreamer.Plo \ + modules/rtp/$(DEPDIR)/librtp_la-rtp-native.Plo \ + modules/rtp/$(DEPDIR)/librtp_la-rtsp_client.Plo \ + modules/rtp/$(DEPDIR)/librtp_la-sap.Plo \ + modules/rtp/$(DEPDIR)/librtp_la-sdp.Plo \ + modules/rtp/$(DEPDIR)/module_rtp_recv_la-module-rtp-recv.Plo \ + modules/rtp/$(DEPDIR)/module_rtp_send_la-module-rtp-send.Plo \ + modules/x11/$(DEPDIR)/module_x11_bell_la-module-x11-bell.Plo \ + modules/x11/$(DEPDIR)/module_x11_cork_request_la-module-x11-cork-request.Plo \ + modules/x11/$(DEPDIR)/module_x11_publish_la-module-x11-publish.Plo \ + modules/x11/$(DEPDIR)/module_x11_xsmp_la-module-x11-xsmp.Plo \ + pulse/$(DEPDIR)/libpulse_la-channelmap.Plo \ + pulse/$(DEPDIR)/libpulse_la-context.Plo \ + pulse/$(DEPDIR)/libpulse_la-direction.Plo \ + pulse/$(DEPDIR)/libpulse_la-error.Plo \ + pulse/$(DEPDIR)/libpulse_la-ext-device-manager.Plo \ + pulse/$(DEPDIR)/libpulse_la-ext-device-restore.Plo \ + pulse/$(DEPDIR)/libpulse_la-ext-stream-restore.Plo \ + pulse/$(DEPDIR)/libpulse_la-format.Plo \ + pulse/$(DEPDIR)/libpulse_la-introspect.Plo \ + pulse/$(DEPDIR)/libpulse_la-mainloop-api.Plo \ + pulse/$(DEPDIR)/libpulse_la-mainloop-signal.Plo \ + pulse/$(DEPDIR)/libpulse_la-mainloop.Plo \ + pulse/$(DEPDIR)/libpulse_la-operation.Plo \ + pulse/$(DEPDIR)/libpulse_la-proplist.Plo \ + pulse/$(DEPDIR)/libpulse_la-rtclock.Plo \ + pulse/$(DEPDIR)/libpulse_la-sample.Plo \ + pulse/$(DEPDIR)/libpulse_la-scache.Plo \ + pulse/$(DEPDIR)/libpulse_la-stream.Plo \ + pulse/$(DEPDIR)/libpulse_la-subscribe.Plo \ + pulse/$(DEPDIR)/libpulse_la-thread-mainloop.Plo \ + pulse/$(DEPDIR)/libpulse_la-timeval.Plo \ + pulse/$(DEPDIR)/libpulse_la-utf8.Plo \ + pulse/$(DEPDIR)/libpulse_la-util.Plo \ + pulse/$(DEPDIR)/libpulse_la-volume.Plo \ + pulse/$(DEPDIR)/libpulse_la-xmalloc.Plo \ + pulse/$(DEPDIR)/libpulse_mainloop_glib_la-glib-mainloop.Plo \ + pulse/$(DEPDIR)/libpulse_simple_la-simple.Plo \ + pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-channelmap.Plo \ + pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-client-conf-x11.Plo \ + pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-client-conf.Plo \ + pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-fork-detect.Plo \ + pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-format.Plo \ + pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-json.Plo \ + pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-proplist.Plo \ + pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-rtclock.Plo \ + pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-sample.Plo \ + pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-timeval.Plo \ + pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-utf8.Plo \ + pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-util.Plo \ + pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-volume.Plo \ + pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-xmalloc.Plo \ + pulsecore/$(DEPDIR)/cli.Plo \ + pulsecore/$(DEPDIR)/libavahi_wrap_la-avahi-wrap.Plo \ + pulsecore/$(DEPDIR)/libprotocol_native_la-protocol-native.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-arpa-inet.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-aupdate.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-authkey.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-bitset.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-conf-parser.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-error.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-format.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-rtclock.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-util.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-dbus-util.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-dllmain.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-dynarray.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-fdsem.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-flist.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-g711.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-hashmap.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-i18n.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-idxset.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-iochannel.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-ioline.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-ipacl.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-lock-autospawn.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-log.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-mcalign.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memblock.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memblockq.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memchunk.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memtrap.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-mutex-posix.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-mutex-win32.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-native-common.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-once.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-packet.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-parseaddr.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pdispatch.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pid.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pipe.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-poll-posix.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-poll-win32.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-proplist-util.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pstream-util.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pstream.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-queue.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-random.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-ratelimit.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-rtkit.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-sample-util.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-osx.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-posix.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-win32.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-shm.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-sndfile-util.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-socket-client.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-socket-server.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-socket-util.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-srbchannel.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-strbuf.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-strlist.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-tagstruct.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-thread-posix.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-thread-win32.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-time-smoother.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-tokenizer.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-usergroup.Plo \ + pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-x11prop.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-asyncmsgq.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-asyncq.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-auth-cookie.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-card.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cli-command.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cli-text.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-client.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-core-scache.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-core-subscribe.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-core.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu-arm.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu-orc.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu-x86.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database-gdbm.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database-simple.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database-tdb.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-dbus-shared.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-device-port.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-hook-list.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-ltdl-helper.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-message-handler.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-mix.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-modargs.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-modinfo.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-module.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-msgobject.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-namereg.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-object.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-play-memblockq.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-play-memchunk.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-protocol-dbus.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-remap.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-remap_mmx.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-remap_sse.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-resampler.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-rtpoll.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16be.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16le.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv_sse.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-shared.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sink-input.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sink.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sioman.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sound-file-stream.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sound-file.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-source-output.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-source.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-start-child.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-stream-util.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume-orc-gen.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_arm.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_c.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_mmx.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_orc.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_sse.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-thread-mq.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-x11wrap.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_mix_neon_la-mix_neon.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_remap_neon_la-remap_neon.Plo \ + pulsecore/$(DEPDIR)/libpulsecore_sconv_neon_la-sconv_neon.Plo \ + pulsecore/$(DEPDIR)/mime-type.Plo \ + pulsecore/$(DEPDIR)/protocol-cli.Plo \ + pulsecore/$(DEPDIR)/protocol-esound.Plo \ + pulsecore/$(DEPDIR)/protocol-http.Plo \ + pulsecore/$(DEPDIR)/protocol-simple.Plo \ + pulsecore/ffmpeg/$(DEPDIR)/libpulsecore_foreign_la-resample2.Plo \ + pulsecore/filter/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-biquad.Plo \ + pulsecore/filter/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-crossover.Plo \ + pulsecore/filter/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-lfe-filter.Plo \ + pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-ffmpeg.Plo \ + pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-libsamplerate.Plo \ + pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-peaks.Plo \ + pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-soxr.Plo \ + pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-speex.Plo \ + pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-trivial.Plo \ + tests/$(DEPDIR)/alsa_mixer_path_test-alsa-mixer-path-test.Po \ + tests/$(DEPDIR)/alsa_time_test-alsa-time-test.Po \ + tests/$(DEPDIR)/asyncmsgq_test-asyncmsgq-test.Po \ + tests/$(DEPDIR)/asyncq_test-asyncq-test.Po \ + tests/$(DEPDIR)/atomic_test-atomic-test.Po \ + tests/$(DEPDIR)/channelmap_test-channelmap-test.Po \ + tests/$(DEPDIR)/close_test-close-test.Po \ + tests/$(DEPDIR)/connect_stress-connect-stress.Po \ + tests/$(DEPDIR)/core_util_test-core-util-test.Po \ + tests/$(DEPDIR)/cpu_mix_test-cpu-mix-test.Po \ + tests/$(DEPDIR)/cpu_remap_test-cpu-remap-test.Po \ + tests/$(DEPDIR)/cpu_sconv_test-cpu-sconv-test.Po \ + tests/$(DEPDIR)/cpu_volume_test-cpu-volume-test.Po \ + tests/$(DEPDIR)/cpulimit_test-cpulimit-test.Po \ + tests/$(DEPDIR)/cpulimit_test2-cpulimit-test.Po \ + tests/$(DEPDIR)/extended_test-extended-test.Po \ + tests/$(DEPDIR)/flist_test-flist-test.Po \ + tests/$(DEPDIR)/format_test-format-test.Po \ + tests/$(DEPDIR)/get_binary_name_test-get-binary-name-test.Po \ + tests/$(DEPDIR)/gtk_test-gtk-test.Po \ + tests/$(DEPDIR)/hashmap_test-hashmap-test.Po \ + tests/$(DEPDIR)/hook_list_test-hook-list-test.Po \ + tests/$(DEPDIR)/interpol_test-interpol-test.Po \ + tests/$(DEPDIR)/ipacl_test-ipacl-test.Po \ + tests/$(DEPDIR)/json_test-json-test.Po \ + tests/$(DEPDIR)/lfe_filter_test-lfe-filter-test.Po \ + tests/$(DEPDIR)/lo-test-util.Plo \ + tests/$(DEPDIR)/lo_latency_test-lo-latency-test.Po \ + tests/$(DEPDIR)/lock_autospawn_test-lock-autospawn-test.Po \ + tests/$(DEPDIR)/mainloop_test-mainloop-test.Po \ + tests/$(DEPDIR)/mainloop_test_glib-mainloop-test.Po \ + tests/$(DEPDIR)/mcalign_test-mcalign-test.Po \ + tests/$(DEPDIR)/memblock_test-memblock-test.Po \ + tests/$(DEPDIR)/memblockq_test-memblockq-test.Po \ + tests/$(DEPDIR)/mix_test-mix-test.Po \ + tests/$(DEPDIR)/mult_s16_test-mult-s16-test.Po \ + tests/$(DEPDIR)/once_test-once-test.Po \ + tests/$(DEPDIR)/pacat_simple-pacat-simple.Po \ + tests/$(DEPDIR)/parec_simple-parec-simple.Po \ + tests/$(DEPDIR)/passthrough_test-passthrough-test.Po \ + tests/$(DEPDIR)/proplist_test-proplist-test.Po \ + tests/$(DEPDIR)/queue_test-queue-test.Po \ + tests/$(DEPDIR)/remix_test-remix-test.Po \ + tests/$(DEPDIR)/resampler_test-resampler-test.Po \ + tests/$(DEPDIR)/rtpoll_test-rtpoll-test.Po \ + tests/$(DEPDIR)/rtstutter-rtstutter.Po \ + tests/$(DEPDIR)/sig2str_test-sig2str-test.Po \ + tests/$(DEPDIR)/sigbus_test-sigbus-test.Po \ + tests/$(DEPDIR)/smoother_test-smoother-test.Po \ + tests/$(DEPDIR)/srbchannel_test-srbchannel-test.Po \ + tests/$(DEPDIR)/stripnul-stripnul.Po \ + tests/$(DEPDIR)/strlist_test-strlist-test.Po \ + tests/$(DEPDIR)/sync_playback-sync-playback.Po \ + tests/$(DEPDIR)/thread_mainloop_test-thread-mainloop-test.Po \ + tests/$(DEPDIR)/thread_test-thread-test.Po \ + tests/$(DEPDIR)/usergroup_test-usergroup-test.Po \ + tests/$(DEPDIR)/utf8_test-utf8-test.Po \ + tests/$(DEPDIR)/volume_test-volume-test.Po \ + utils/$(DEPDIR)/libpulsedsp_la-padsp.Plo \ + utils/$(DEPDIR)/pacat-pacat.Po utils/$(DEPDIR)/pacmd-pacmd.Po \ + utils/$(DEPDIR)/pactl-pactl.Po \ + utils/$(DEPDIR)/pasuspender-pasuspender.Po \ + utils/$(DEPDIR)/pax11publish-pax11publish.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(libalsa_util_la_SOURCES) $(libavahi_wrap_la_SOURCES) \ + $(libbluez5_util_la_SOURCES) $(libcli_la_SOURCES) \ + $(liblo_test_util_la_SOURCES) $(liboss_util_la_SOURCES) \ + $(libprotocol_cli_la_SOURCES) $(libprotocol_esound_la_SOURCES) \ + $(libprotocol_http_la_SOURCES) \ + $(libprotocol_native_la_SOURCES) \ + $(libprotocol_simple_la_SOURCES) \ + $(libpulse_mainloop_glib_la_SOURCES) \ + $(libpulse_simple_la_SOURCES) $(libpulse_la_SOURCES) \ + $(libpulsecommon_@PA_MAJORMINOR@_la_SOURCES) \ + $(libpulsecore_@PA_MAJORMINOR@_la_SOURCES) \ + $(nodist_libpulsecore_@PA_MAJORMINOR@_la_SOURCES) \ + $(libpulsecore_foreign_la_SOURCES) \ + $(libpulsecore_mix_neon_la_SOURCES) \ + $(libpulsecore_remap_neon_la_SOURCES) \ + $(libpulsecore_sconv_neon_la_SOURCES) \ + $(libpulsedsp_la_SOURCES) $(libraop_la_SOURCES) \ + $(librtp_la_SOURCES) $(libwebrtc_util_la_SOURCES) \ + $(module_allow_passthrough_la_SOURCES) \ + $(module_alsa_card_la_SOURCES) $(module_alsa_sink_la_SOURCES) \ + $(module_alsa_source_la_SOURCES) \ + $(module_always_sink_la_SOURCES) \ + $(module_always_source_la_SOURCES) \ + $(module_augment_properties_la_SOURCES) \ + $(module_bluetooth_discover_la_SOURCES) \ + $(module_bluetooth_policy_la_SOURCES) \ + $(module_bluez5_device_la_SOURCES) \ + $(module_bluez5_discover_la_SOURCES) \ + $(module_bonjour_publish_la_SOURCES) \ + $(module_card_restore_la_SOURCES) \ + $(module_cli_protocol_tcp_la_SOURCES) \ + $(module_cli_protocol_unix_la_SOURCES) \ + $(module_cli_la_SOURCES) $(module_combine_sink_la_SOURCES) \ + $(module_combine_la_SOURCES) $(module_console_kit_la_SOURCES) \ + $(module_coreaudio_detect_la_SOURCES) \ + $(module_coreaudio_device_la_SOURCES) \ + $(module_dbus_protocol_la_SOURCES) \ + $(module_default_device_restore_la_SOURCES) \ + $(module_detect_la_SOURCES) \ + $(module_device_manager_la_SOURCES) \ + $(module_device_restore_la_SOURCES) \ + $(module_echo_cancel_la_SOURCES) \ + $(nodist_module_echo_cancel_la_SOURCES) \ + $(module_equalizer_sink_la_SOURCES) \ + $(module_esound_compat_spawnfd_la_SOURCES) \ + $(module_esound_compat_spawnpid_la_SOURCES) \ + $(module_esound_protocol_tcp_la_SOURCES) \ + $(module_esound_protocol_unix_la_SOURCES) \ + $(module_esound_sink_la_SOURCES) \ + $(module_filter_apply_la_SOURCES) \ + $(module_filter_heuristics_la_SOURCES) \ + $(module_gconf_la_SOURCES) $(module_gsettings_la_SOURCES) \ + $(module_hal_detect_la_SOURCES) \ + $(module_http_protocol_tcp_la_SOURCES) \ + $(module_http_protocol_unix_la_SOURCES) \ + $(module_intended_roles_la_SOURCES) \ + $(module_jack_sink_la_SOURCES) \ + $(module_jack_source_la_SOURCES) \ + $(module_jackdbus_detect_la_SOURCES) \ + $(module_ladspa_sink_la_SOURCES) $(module_lirc_la_SOURCES) \ + $(module_loopback_la_SOURCES) $(module_match_la_SOURCES) \ + $(module_mmkbd_evdev_la_SOURCES) \ + $(module_native_protocol_fd_la_SOURCES) \ + $(module_native_protocol_tcp_la_SOURCES) \ + $(module_native_protocol_unix_la_SOURCES) \ + $(module_null_sink_la_SOURCES) \ + $(module_null_source_la_SOURCES) $(module_oss_la_SOURCES) \ + $(module_pipe_sink_la_SOURCES) \ + $(module_pipe_source_la_SOURCES) \ + $(module_position_event_sounds_la_SOURCES) \ + $(module_raop_discover_la_SOURCES) \ + $(module_raop_sink_la_SOURCES) $(module_remap_sink_la_SOURCES) \ + $(module_remap_source_la_SOURCES) \ + $(module_rescue_streams_la_SOURCES) \ + $(module_role_cork_la_SOURCES) \ + $(module_role_ducking_la_SOURCES) \ + $(module_rtp_recv_la_SOURCES) $(module_rtp_send_la_SOURCES) \ + $(module_rygel_media_server_la_SOURCES) \ + $(module_simple_protocol_tcp_la_SOURCES) \ + $(module_simple_protocol_unix_la_SOURCES) \ + $(module_sine_source_la_SOURCES) $(module_sine_la_SOURCES) \ + $(module_solaris_la_SOURCES) \ + $(module_stream_restore_la_SOURCES) \ + $(module_suspend_on_idle_la_SOURCES) \ + $(module_switch_on_connect_la_SOURCES) \ + $(module_switch_on_port_available_la_SOURCES) \ + $(module_systemd_login_la_SOURCES) \ + $(module_tunnel_sink_new_la_SOURCES) \ + $(module_tunnel_sink_la_SOURCES) \ + $(module_tunnel_source_new_la_SOURCES) \ + $(module_tunnel_source_la_SOURCES) \ + $(module_udev_detect_la_SOURCES) \ + $(module_virtual_sink_la_SOURCES) \ + $(module_virtual_source_la_SOURCES) \ + $(module_virtual_surround_sink_la_SOURCES) \ + $(module_volume_restore_la_SOURCES) \ + $(module_waveout_la_SOURCES) $(module_x11_bell_la_SOURCES) \ + $(module_x11_cork_request_la_SOURCES) \ + $(module_x11_publish_la_SOURCES) $(module_x11_xsmp_la_SOURCES) \ + $(module_zeroconf_discover_la_SOURCES) \ + $(module_zeroconf_publish_la_SOURCES) \ + $(alsa_mixer_path_test_SOURCES) $(alsa_time_test_SOURCES) \ + $(asyncmsgq_test_SOURCES) $(asyncq_test_SOURCES) \ + $(atomic_test_SOURCES) $(channelmap_test_SOURCES) \ + $(close_test_SOURCES) $(connect_stress_SOURCES) \ + $(core_util_test_SOURCES) $(cpu_mix_test_SOURCES) \ + $(cpu_remap_test_SOURCES) $(cpu_sconv_test_SOURCES) \ + $(cpu_volume_test_SOURCES) $(cpulimit_test_SOURCES) \ + $(cpulimit_test2_SOURCES) $(echo_cancel_test_SOURCES) \ + $(nodist_echo_cancel_test_SOURCES) $(extended_test_SOURCES) \ + $(flist_test_SOURCES) $(format_test_SOURCES) \ + $(gconf_helper_SOURCES) $(get_binary_name_test_SOURCES) \ + $(gsettings_helper_SOURCES) $(gtk_test_SOURCES) \ + $(hashmap_test_SOURCES) $(hook_list_test_SOURCES) \ + $(interpol_test_SOURCES) $(ipacl_test_SOURCES) \ + $(json_test_SOURCES) $(lfe_filter_test_SOURCES) \ + $(lo_latency_test_SOURCES) $(lock_autospawn_test_SOURCES) \ + $(mainloop_test_SOURCES) $(mainloop_test_glib_SOURCES) \ + $(mcalign_test_SOURCES) $(memblock_test_SOURCES) \ + $(memblockq_test_SOURCES) $(mix_test_SOURCES) \ + $(mult_s16_test_SOURCES) $(once_test_SOURCES) $(pacat_SOURCES) \ + $(pacat_simple_SOURCES) $(pacmd_SOURCES) $(pactl_SOURCES) \ + $(parec_simple_SOURCES) $(passthrough_test_SOURCES) \ + $(pasuspender_SOURCES) $(pax11publish_SOURCES) \ + $(proplist_test_SOURCES) $(pulseaudio_SOURCES) \ + $(queue_test_SOURCES) $(remix_test_SOURCES) \ + $(resampler_test_SOURCES) $(rtpoll_test_SOURCES) \ + $(rtstutter_SOURCES) $(sig2str_test_SOURCES) \ + $(sigbus_test_SOURCES) $(smoother_test_SOURCES) \ + $(srbchannel_test_SOURCES) $(stripnul_SOURCES) \ + $(strlist_test_SOURCES) $(sync_playback_SOURCES) \ + $(thread_mainloop_test_SOURCES) $(thread_test_SOURCES) \ + $(usergroup_test_SOURCES) $(utf8_test_SOURCES) \ + $(volume_test_SOURCES) +DIST_SOURCES = $(am__libalsa_util_la_SOURCES_DIST) \ + $(libavahi_wrap_la_SOURCES) \ + $(am__libbluez5_util_la_SOURCES_DIST) $(libcli_la_SOURCES) \ + $(liblo_test_util_la_SOURCES) $(liboss_util_la_SOURCES) \ + $(libprotocol_cli_la_SOURCES) \ + $(am__libprotocol_esound_la_SOURCES_DIST) \ + $(libprotocol_http_la_SOURCES) \ + $(libprotocol_native_la_SOURCES) \ + $(libprotocol_simple_la_SOURCES) \ + $(libpulse_mainloop_glib_la_SOURCES) \ + $(libpulse_simple_la_SOURCES) $(libpulse_la_SOURCES) \ + $(am__libpulsecommon_@PA_MAJORMINOR@_la_SOURCES_DIST) \ + $(am__libpulsecore_@PA_MAJORMINOR@_la_SOURCES_DIST) \ + $(libpulsecore_foreign_la_SOURCES) \ + $(am__libpulsecore_mix_neon_la_SOURCES_DIST) \ + $(am__libpulsecore_remap_neon_la_SOURCES_DIST) \ + $(am__libpulsecore_sconv_neon_la_SOURCES_DIST) \ + $(libpulsedsp_la_SOURCES) $(libraop_la_SOURCES) \ + $(am__librtp_la_SOURCES_DIST) \ + $(am__libwebrtc_util_la_SOURCES_DIST) \ + $(module_allow_passthrough_la_SOURCES) \ + $(module_alsa_card_la_SOURCES) $(module_alsa_sink_la_SOURCES) \ + $(module_alsa_source_la_SOURCES) \ + $(module_always_sink_la_SOURCES) \ + $(module_always_source_la_SOURCES) \ + $(module_augment_properties_la_SOURCES) \ + $(module_bluetooth_discover_la_SOURCES) \ + $(module_bluetooth_policy_la_SOURCES) \ + $(module_bluez5_device_la_SOURCES) \ + $(module_bluez5_discover_la_SOURCES) \ + $(module_bonjour_publish_la_SOURCES) \ + $(module_card_restore_la_SOURCES) \ + $(module_cli_protocol_tcp_la_SOURCES) \ + $(module_cli_protocol_unix_la_SOURCES) \ + $(module_cli_la_SOURCES) $(module_combine_sink_la_SOURCES) \ + $(module_combine_la_SOURCES) $(module_console_kit_la_SOURCES) \ + $(module_coreaudio_detect_la_SOURCES) \ + $(module_coreaudio_device_la_SOURCES) \ + $(module_dbus_protocol_la_SOURCES) \ + $(module_default_device_restore_la_SOURCES) \ + $(module_detect_la_SOURCES) \ + $(module_device_manager_la_SOURCES) \ + $(module_device_restore_la_SOURCES) \ + $(am__module_echo_cancel_la_SOURCES_DIST) \ + $(module_equalizer_sink_la_SOURCES) \ + $(am__module_esound_compat_spawnfd_la_SOURCES_DIST) \ + $(am__module_esound_compat_spawnpid_la_SOURCES_DIST) \ + $(am__module_esound_protocol_tcp_la_SOURCES_DIST) \ + $(am__module_esound_protocol_unix_la_SOURCES_DIST) \ + $(am__module_esound_sink_la_SOURCES_DIST) \ + $(module_filter_apply_la_SOURCES) \ + $(module_filter_heuristics_la_SOURCES) \ + $(module_gconf_la_SOURCES) $(module_gsettings_la_SOURCES) \ + $(module_hal_detect_la_SOURCES) \ + $(module_http_protocol_tcp_la_SOURCES) \ + $(module_http_protocol_unix_la_SOURCES) \ + $(module_intended_roles_la_SOURCES) \ + $(module_jack_sink_la_SOURCES) \ + $(module_jack_source_la_SOURCES) \ + $(module_jackdbus_detect_la_SOURCES) \ + $(module_ladspa_sink_la_SOURCES) $(module_lirc_la_SOURCES) \ + $(module_loopback_la_SOURCES) $(module_match_la_SOURCES) \ + $(module_mmkbd_evdev_la_SOURCES) \ + $(module_native_protocol_fd_la_SOURCES) \ + $(module_native_protocol_tcp_la_SOURCES) \ + $(module_native_protocol_unix_la_SOURCES) \ + $(module_null_sink_la_SOURCES) \ + $(module_null_source_la_SOURCES) $(module_oss_la_SOURCES) \ + $(module_pipe_sink_la_SOURCES) \ + $(module_pipe_source_la_SOURCES) \ + $(module_position_event_sounds_la_SOURCES) \ + $(module_raop_discover_la_SOURCES) \ + $(module_raop_sink_la_SOURCES) $(module_remap_sink_la_SOURCES) \ + $(module_remap_source_la_SOURCES) \ + $(module_rescue_streams_la_SOURCES) \ + $(module_role_cork_la_SOURCES) \ + $(module_role_ducking_la_SOURCES) \ + $(module_rtp_recv_la_SOURCES) $(module_rtp_send_la_SOURCES) \ + $(module_rygel_media_server_la_SOURCES) \ + $(module_simple_protocol_tcp_la_SOURCES) \ + $(module_simple_protocol_unix_la_SOURCES) \ + $(module_sine_source_la_SOURCES) $(module_sine_la_SOURCES) \ + $(module_solaris_la_SOURCES) \ + $(module_stream_restore_la_SOURCES) \ + $(module_suspend_on_idle_la_SOURCES) \ + $(module_switch_on_connect_la_SOURCES) \ + $(module_switch_on_port_available_la_SOURCES) \ + $(module_systemd_login_la_SOURCES) \ + $(module_tunnel_sink_new_la_SOURCES) \ + $(module_tunnel_sink_la_SOURCES) \ + $(module_tunnel_source_new_la_SOURCES) \ + $(module_tunnel_source_la_SOURCES) \ + $(module_udev_detect_la_SOURCES) \ + $(module_virtual_sink_la_SOURCES) \ + $(module_virtual_source_la_SOURCES) \ + $(module_virtual_surround_sink_la_SOURCES) \ + $(module_volume_restore_la_SOURCES) \ + $(module_waveout_la_SOURCES) $(module_x11_bell_la_SOURCES) \ + $(module_x11_cork_request_la_SOURCES) \ + $(module_x11_publish_la_SOURCES) $(module_x11_xsmp_la_SOURCES) \ + $(module_zeroconf_discover_la_SOURCES) \ + $(module_zeroconf_publish_la_SOURCES) \ + $(alsa_mixer_path_test_SOURCES) $(alsa_time_test_SOURCES) \ + $(asyncmsgq_test_SOURCES) $(asyncq_test_SOURCES) \ + $(atomic_test_SOURCES) $(channelmap_test_SOURCES) \ + $(close_test_SOURCES) $(connect_stress_SOURCES) \ + $(core_util_test_SOURCES) $(cpu_mix_test_SOURCES) \ + $(cpu_remap_test_SOURCES) $(cpu_sconv_test_SOURCES) \ + $(cpu_volume_test_SOURCES) $(cpulimit_test_SOURCES) \ + $(cpulimit_test2_SOURCES) $(am__echo_cancel_test_SOURCES_DIST) \ + $(extended_test_SOURCES) $(flist_test_SOURCES) \ + $(format_test_SOURCES) $(gconf_helper_SOURCES) \ + $(get_binary_name_test_SOURCES) $(gsettings_helper_SOURCES) \ + $(gtk_test_SOURCES) $(hashmap_test_SOURCES) \ + $(hook_list_test_SOURCES) $(interpol_test_SOURCES) \ + $(ipacl_test_SOURCES) $(json_test_SOURCES) \ + $(lfe_filter_test_SOURCES) $(lo_latency_test_SOURCES) \ + $(lock_autospawn_test_SOURCES) $(mainloop_test_SOURCES) \ + $(mainloop_test_glib_SOURCES) $(mcalign_test_SOURCES) \ + $(memblock_test_SOURCES) $(memblockq_test_SOURCES) \ + $(mix_test_SOURCES) $(mult_s16_test_SOURCES) \ + $(once_test_SOURCES) $(pacat_SOURCES) $(pacat_simple_SOURCES) \ + $(pacmd_SOURCES) $(pactl_SOURCES) $(parec_simple_SOURCES) \ + $(passthrough_test_SOURCES) $(pasuspender_SOURCES) \ + $(pax11publish_SOURCES) $(proplist_test_SOURCES) \ + $(am__pulseaudio_SOURCES_DIST) $(queue_test_SOURCES) \ + $(remix_test_SOURCES) $(resampler_test_SOURCES) \ + $(rtpoll_test_SOURCES) $(rtstutter_SOURCES) \ + $(sig2str_test_SOURCES) $(sigbus_test_SOURCES) \ + $(smoother_test_SOURCES) $(srbchannel_test_SOURCES) \ + $(stripnul_SOURCES) $(strlist_test_SOURCES) \ + $(sync_playback_SOURCES) $(thread_mainloop_test_SOURCES) \ + $(thread_test_SOURCES) $(usergroup_test_SOURCES) \ + $(utf8_test_SOURCES) $(volume_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__dist_alsapaths_DATA_DIST = \ + modules/alsa/mixer/paths/analog-input-aux.conf \ + modules/alsa/mixer/paths/analog-input.conf \ + modules/alsa/mixer/paths/analog-input.conf.common \ + modules/alsa/mixer/paths/analog-input-fm.conf \ + modules/alsa/mixer/paths/analog-input-linein.conf \ + modules/alsa/mixer/paths/analog-input-mic.conf \ + modules/alsa/mixer/paths/analog-input-dock-mic.conf \ + modules/alsa/mixer/paths/analog-input-front-mic.conf \ + modules/alsa/mixer/paths/analog-input-headphone-mic.conf \ + modules/alsa/mixer/paths/analog-input-headset-mic.conf \ + modules/alsa/mixer/paths/analog-input-internal-mic.conf \ + modules/alsa/mixer/paths/analog-input-internal-mic-always.conf \ + modules/alsa/mixer/paths/analog-input-rear-mic.conf \ + modules/alsa/mixer/paths/analog-input-mic.conf.common \ + modules/alsa/mixer/paths/analog-input-mic-line.conf \ + modules/alsa/mixer/paths/analog-input-tvtuner.conf \ + modules/alsa/mixer/paths/analog-input-video.conf \ + modules/alsa/mixer/paths/analog-output.conf \ + modules/alsa/mixer/paths/analog-output-speaker.conf \ + modules/alsa/mixer/paths/analog-output-speaker-always.conf \ + modules/alsa/mixer/paths/analog-output.conf.common \ + modules/alsa/mixer/paths/analog-output-headphones.conf \ + modules/alsa/mixer/paths/analog-output-headphones-2.conf \ + modules/alsa/mixer/paths/analog-output-lineout.conf \ + modules/alsa/mixer/paths/analog-output-mono.conf \ + modules/alsa/mixer/paths/iec958-stereo-input.conf \ + modules/alsa/mixer/paths/iec958-stereo-output.conf \ + modules/alsa/mixer/paths/hdmi-output-0.conf \ + modules/alsa/mixer/paths/hdmi-output-1.conf \ + modules/alsa/mixer/paths/hdmi-output-2.conf \ + modules/alsa/mixer/paths/hdmi-output-3.conf \ + modules/alsa/mixer/paths/hdmi-output-4.conf \ + modules/alsa/mixer/paths/hdmi-output-5.conf \ + modules/alsa/mixer/paths/hdmi-output-6.conf \ + modules/alsa/mixer/paths/hdmi-output-7.conf \ + modules/alsa/mixer/paths/steelseries-arctis-output-chat-common.conf \ + modules/alsa/mixer/paths/steelseries-arctis-output-game-common.conf \ + modules/alsa/mixer/paths/usb-gaming-headset-input.conf \ + modules/alsa/mixer/paths/usb-gaming-headset-output-mono.conf \ + modules/alsa/mixer/paths/usb-gaming-headset-output-stereo.conf +am__dist_alsaprofilesets_DATA_DIST = \ + modules/alsa/mixer/profile-sets/default.conf \ + modules/alsa/mixer/profile-sets/force-speaker.conf \ + modules/alsa/mixer/profile-sets/force-speaker-and-int-mic.conf \ + modules/alsa/mixer/profile-sets/audigy.conf \ + modules/alsa/mixer/profile-sets/maudio-fasttrack-pro.conf \ + modules/alsa/mixer/profile-sets/native-instruments-audio4dj.conf \ + modules/alsa/mixer/profile-sets/native-instruments-audio8dj.conf \ + modules/alsa/mixer/profile-sets/native-instruments-traktor-audio2.conf \ + modules/alsa/mixer/profile-sets/native-instruments-traktor-audio6.conf \ + modules/alsa/mixer/profile-sets/native-instruments-traktor-audio10.conf \ + modules/alsa/mixer/profile-sets/native-instruments-traktorkontrol-s4.conf \ + modules/alsa/mixer/profile-sets/native-instruments-korecontroller.conf \ + modules/alsa/mixer/profile-sets/kinect-audio.conf \ + modules/alsa/mixer/profile-sets/sb-omni-surround-5.1.conf \ + modules/alsa/mixer/profile-sets/steelseries-arctis-common-usb-audio.conf \ + modules/alsa/mixer/profile-sets/usb-gaming-headset.conf \ + modules/alsa/mixer/profile-sets/dell-dock-tb16-usb-audio.conf \ + modules/alsa/mixer/profile-sets/cmedia-high-speed-true-hdaudio.conf +am__dist_udevrules_DATA_DIST = modules/alsa/90-pulseaudio.rules +DATA = $(dbuspolicy_DATA) $(dist_alsapaths_DATA) \ + $(dist_alsaprofilesets_DATA) $(dist_udevrules_DATA) \ + $(gsettingsdataconvert_DATA) $(pulseconf_DATA) \ + $(systemduserunit_DATA) $(xdgautostart_DATA) +am__pulseinclude_HEADERS_DIST = pulse/cdecl.h pulse/channelmap.h \ + pulse/context.h pulse/def.h pulse/direction.h pulse/error.h \ + pulse/ext-device-manager.h pulse/ext-device-restore.h \ + pulse/ext-stream-restore.h pulse/format.h pulse/gccmacro.h \ + pulse/introspect.h pulse/mainloop-api.h \ + pulse/mainloop-signal.h pulse/mainloop.h pulse/operation.h \ + pulse/proplist.h pulse/pulseaudio.h pulse/rtclock.h \ + pulse/sample.h pulse/scache.h pulse/simple.h pulse/stream.h \ + pulse/subscribe.h pulse/thread-mainloop.h pulse/timeval.h \ + pulse/utf8.h pulse/util.h pulse/version.h pulse/volume.h \ + pulse/xmalloc.h pulse/glib-mainloop.h +HEADERS = $(pulseinclude_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/build-aux/depcomp \ + $(top_srcdir)/build-aux/test-driver $(top_srcdir)/orc.mak \ + $(top_srcdir)/src/daemon/daemon.conf.in \ + $(top_srcdir)/src/daemon/default.pa.in \ + $(top_srcdir)/src/daemon/esdcompat.in \ + $(top_srcdir)/src/daemon/start-pulseaudio-x11.in \ + $(top_srcdir)/src/daemon/system.pa.in \ + $(top_srcdir)/src/daemon/systemd/user/pulseaudio.service.in \ + $(top_srcdir)/src/pulse/client.conf.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +ASOUNDLIB_CFLAGS = @ASOUNDLIB_CFLAGS@ +ASOUNDLIB_LIBS = @ASOUNDLIB_LIBS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AVAHI_CFLAGS = @AVAHI_CFLAGS@ +AVAHI_LIBS = @AVAHI_LIBS@ +AWK = @AWK@ +BLUEZ_CFLAGS = @BLUEZ_CFLAGS@ +BLUEZ_LIBS = @BLUEZ_LIBS@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DBUS_CFLAGS = @DBUS_CFLAGS@ +DBUS_LIBS = @DBUS_LIBS@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOXYGEN_OUTPUT_DIRECTORY = @DOXYGEN_OUTPUT_DIRECTORY@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FFTW_CFLAGS = @FFTW_CFLAGS@ +FFTW_LIBS = @FFTW_LIBS@ +FGREP = @FGREP@ +GCONF_CFLAGS = @GCONF_CFLAGS@ +GCONF_LIBS = @GCONF_LIBS@ +GCOV_CFLAGS = @GCOV_CFLAGS@ +GCOV_LIBS = @GCOV_LIBS@ +GDBM_CFLAGS = @GDBM_CFLAGS@ +GDBM_LIBS = @GDBM_LIBS@ +GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@ +GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ +GLIB20_CFLAGS = @GLIB20_CFLAGS@ +GLIB20_LIBS = @GLIB20_LIBS@ +GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@ +GMSGFMT = @GMSGFMT@ +GMSGFMT_015 = @GMSGFMT_015@ +GREP = @GREP@ +GSETTINGS_CFLAGS = @GSETTINGS_CFLAGS@ +GSETTINGS_DISABLE_SCHEMAS_COMPILE = @GSETTINGS_DISABLE_SCHEMAS_COMPILE@ +GSETTINGS_LIBS = @GSETTINGS_LIBS@ +GSTREAMER_CFLAGS = @GSTREAMER_CFLAGS@ +GSTREAMER_LIBS = @GSTREAMER_LIBS@ +GTK30_CFLAGS = @GTK30_CFLAGS@ +GTK30_LIBS = @GTK30_LIBS@ +HAVE_AF_UNIX = @HAVE_AF_UNIX@ +HAVE_ALSA = @HAVE_ALSA@ +HAVE_AVAHI = @HAVE_AVAHI@ +HAVE_BLUEZ = @HAVE_BLUEZ@ +HAVE_BLUEZ_5 = @HAVE_BLUEZ_5@ +HAVE_BLUEZ_5_NATIVE_HEADSET = @HAVE_BLUEZ_5_NATIVE_HEADSET@ +HAVE_BLUEZ_5_OFONO_HEADSET = @HAVE_BLUEZ_5_OFONO_HEADSET@ +HAVE_COREAUDIO = @HAVE_COREAUDIO@ +HAVE_CXX11 = @HAVE_CXX11@ +HAVE_DBUS = @HAVE_DBUS@ +HAVE_GCONF = @HAVE_GCONF@ +HAVE_GLIB20 = @HAVE_GLIB20@ +HAVE_GSETTINGS = @HAVE_GSETTINGS@ +HAVE_MEMFD = @HAVE_MEMFD@ +HAVE_MKFIFO = @HAVE_MKFIFO@ +HAVE_NEON = @HAVE_NEON@ +HAVE_OSS_OUTPUT = @HAVE_OSS_OUTPUT@ +HAVE_RUNNING_FROM_BUILD_TREE = @HAVE_RUNNING_FROM_BUILD_TREE@ +HAVE_SYSTEMD_DAEMON = @HAVE_SYSTEMD_DAEMON@ +HAVE_SYSTEMD_JOURNAL = @HAVE_SYSTEMD_JOURNAL@ +HAVE_SYSTEMD_LOGIN = @HAVE_SYSTEMD_LOGIN@ +HAVE_SYS_RESOURCE_H = @HAVE_SYS_RESOURCE_H@ +HAVE_UDEV = @HAVE_UDEV@ +HAVE_WAVEOUT = @HAVE_WAVEOUT@ +HAVE_X11 = @HAVE_X11@ +IMMEDIATE_LDFLAGS = @IMMEDIATE_LDFLAGS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ +JACK_CFLAGS = @JACK_CFLAGS@ +JACK_LIBS = @JACK_LIBS@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBASYNCNS_CFLAGS = @LIBASYNCNS_CFLAGS@ +LIBASYNCNS_LIBS = @LIBASYNCNS_LIBS@ +LIBCHECK_CFLAGS = @LIBCHECK_CFLAGS@ +LIBCHECK_LIBS = @LIBCHECK_LIBS@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBLTDL = @LIBLTDL@ +LIBOBJS = @LIBOBJS@ +LIBPULSE_MAINLOOP_GLIB_VERSION_INFO = @LIBPULSE_MAINLOOP_GLIB_VERSION_INFO@ +LIBPULSE_SIMPLE_VERSION_INFO = @LIBPULSE_SIMPLE_VERSION_INFO@ +LIBPULSE_VERSION_INFO = @LIBPULSE_VERSION_INFO@ +LIBS = @LIBS@ +LIBSAMPLERATE_CFLAGS = @LIBSAMPLERATE_CFLAGS@ +LIBSAMPLERATE_LIBS = @LIBSAMPLERATE_LIBS@ +LIBSNDFILE_CFLAGS = @LIBSNDFILE_CFLAGS@ +LIBSNDFILE_LIBS = @LIBSNDFILE_LIBS@ +LIBSOXR_CFLAGS = @LIBSOXR_CFLAGS@ +LIBSOXR_LIBS = @LIBSOXR_LIBS@ +LIBSPEEX_CFLAGS = @LIBSPEEX_CFLAGS@ +LIBSPEEX_LIBS = @LIBSPEEX_LIBS@ +LIBTOOL = @LIBTOOL@ +LIBWRAP_LIBS = @LIBWRAP_LIBS@ +LIPO = @LIPO@ +LIRC_CFLAGS = @LIRC_CFLAGS@ +LIRC_LIBS = @LIRC_LIBS@ +LN_S = @LN_S@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +M4 = @M4@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MSGFMT = @MSGFMT@ +MSGFMT_015 = @MSGFMT_015@ +MSGMERGE = @MSGMERGE@ +NEON_CFLAGS = @NEON_CFLAGS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NODELETE_LDFLAGS = @NODELETE_LDFLAGS@ +NOUNDEFINED_LDFLAGS = @NOUNDEFINED_LDFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OPENSSL_CFLAGS = @OPENSSL_CFLAGS@ +OPENSSL_LIBS = @OPENSSL_LIBS@ +ORCC = @ORCC@ +ORCC_FLAGS = @ORCC_FLAGS@ +ORC_CFLAGS = @ORC_CFLAGS@ +ORC_LIBS = @ORC_LIBS@ +OS_IS_WIN32 = @OS_IS_WIN32@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PACTL_BINARY = @PACTL_BINARY@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PA_ACCESS_GROUP = @PA_ACCESS_GROUP@ +PA_API_VERSION = @PA_API_VERSION@ +PA_BINARY = @PA_BINARY@ +PA_DEFAULT_CONFIG_DIR = @PA_DEFAULT_CONFIG_DIR@ +PA_DLSEARCHPATH = @PA_DLSEARCHPATH@ +PA_INCDIR = @PA_INCDIR@ +PA_LIBDIR = @PA_LIBDIR@ +PA_MACHINE_ID = @PA_MACHINE_ID@ +PA_MACHINE_ID_FALLBACK = @PA_MACHINE_ID_FALLBACK@ +PA_MAJOR = @PA_MAJOR@ +PA_MAJORMINOR = @PA_MAJORMINOR@ +PA_MINOR = @PA_MINOR@ +PA_PROTOCOL_VERSION = @PA_PROTOCOL_VERSION@ +PA_SOEXT = @PA_SOEXT@ +PA_SYSTEM_CONFIG_PATH = @PA_SYSTEM_CONFIG_PATH@ +PA_SYSTEM_GROUP = @PA_SYSTEM_GROUP@ +PA_SYSTEM_RUNTIME_PATH = @PA_SYSTEM_RUNTIME_PATH@ +PA_SYSTEM_STATE_PATH = @PA_SYSTEM_STATE_PATH@ +PA_SYSTEM_USER = @PA_SYSTEM_USER@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +POSUB = @POSUB@ +PREOPEN_MODS = @PREOPEN_MODS@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +PULSEDSP_LOCATION = @PULSEDSP_LOCATION@ +RANLIB = @RANLIB@ +SBC_CFLAGS = @SBC_CFLAGS@ +SBC_LIBS = @SBC_LIBS@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STOW = @STOW@ +STRIP = @STRIP@ +SYSTEMDDAEMON_CFLAGS = @SYSTEMDDAEMON_CFLAGS@ +SYSTEMDDAEMON_LIBS = @SYSTEMDDAEMON_LIBS@ +SYSTEMDJOURNAL_CFLAGS = @SYSTEMDJOURNAL_CFLAGS@ +SYSTEMDJOURNAL_LIBS = @SYSTEMDJOURNAL_LIBS@ +SYSTEMDLOGIN_CFLAGS = @SYSTEMDLOGIN_CFLAGS@ +SYSTEMDLOGIN_LIBS = @SYSTEMDLOGIN_LIBS@ +SYSTEMD_CFLAGS = @SYSTEMD_CFLAGS@ +SYSTEMD_LIBS = @SYSTEMD_LIBS@ +TDB_CFLAGS = @TDB_CFLAGS@ +TDB_LIBS = @TDB_LIBS@ +UDEV_CFLAGS = @UDEV_CFLAGS@ +UDEV_LIBS = @UDEV_LIBS@ +USE_NLS = @USE_NLS@ +VERSION = @VERSION@ +VERSIONING_LDFLAGS = @VERSIONING_LDFLAGS@ +WEBRTC_CFLAGS = @WEBRTC_CFLAGS@ +WEBRTC_LIBS = @WEBRTC_LIBS@ +X11_CFLAGS = @X11_CFLAGS@ +X11_LIBS = @X11_LIBS@ +XGETTEXT = @XGETTEXT@ +XGETTEXT_015 = @XGETTEXT_015@ +XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +alsadatadir = @alsadatadir@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +ax_pthread_config = @ax_pthread_config@ +bashcompletiondir = @bashcompletiondir@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gsettingsschemadir = @gsettingsschemadir@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +modlibexecdir = @modlibexecdir@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pulseconfdir = @pulseconfdir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +systemduserunitdir = @systemduserunitdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +udevrulesdir = @udevrulesdir@ +zshcompletiondir = @zshcompletiondir@ +pulseincludedir = $(includedir)/pulse +pulsecoreincludedir = $(includedir)/pulsecore +pulselibexecdir = $(libexecdir)/pulse +@HAVE_X11_TRUE@xdgautostartdir = $(sysconfdir)/xdg/autostart +@HAVE_ALSA_TRUE@alsaprofilesetsdir = $(alsadatadir)/profile-sets +@HAVE_ALSA_TRUE@alsapathsdir = $(alsadatadir)/paths +@HAVE_DBUS_TRUE@dbuspolicydir = $(sysconfdir)/dbus-1/system.d +@HAVE_GSETTINGS_TRUE@gsettingsdataconvertdir = $(datadir)/GConf/gsettings + +################################### +# Compiler/linker flags # +################################### +AM_CPPFLAGS = \ + -I$(top_srcdir)/src \ + -I$(top_srcdir)/src/modules \ + -I$(top_builddir)/src/modules \ + -DPA_ALSA_PATHS_DIR=\"$(alsapathsdir)\" \ + -DPA_ALSA_PROFILE_SETS_DIR=\"$(alsaprofilesetsdir)\" \ + -DPA_SRCDIR=\"$(abs_srcdir)\" \ + -DPA_BUILDDIR=\"$(abs_builddir)\" \ + -DPULSE_LOCALEDIR=\"$(localedir)\" + +AM_CFLAGS = -std=gnu11 $(PTHREAD_CFLAGS) $(am__append_1) +AM_CXXFLAGS = -std=c++11 $(PTHREAD_CFLAGS) $(am__append_2) +SERVER_CFLAGS = -D__INCLUDED_FROM_PULSE_AUDIO +AM_LIBADD = $(PTHREAD_LIBS) $(INTLLIBS) +AM_LDADD = $(PTHREAD_LIBS) $(INTLLIBS) +AM_LDFLAGS = $(am__append_3) $(am__append_4) $(am__append_5) +# Should only be applied to libraries. +AM_LIBLDFLAGS = $(NODELETE_LDFLAGS) +@STATIC_BINS_TRUE@BINLDFLAGS = -static +@OS_IS_WIN32_TRUE@WINSOCK_LIBS = -lwsock32 -lws2_32 -lwininet +FOREIGN_CFLAGS = -w +MODULE_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -module -disable-static -avoid-version $(NOUNDEFINED_LDFLAGS) +MODULE_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINOR@.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la + +################################### +# Extra files # +################################### +EXTRA_DIST = pulse/client.conf.in pulse/version.h.in \ + pulsecore/filter/LICENSE.WEBKIT daemon/daemon.conf.in \ + daemon/default.pa.in daemon/system.pa.in depmod.py \ + daemon/esdcompat.in daemon/start-pulseaudio-x11.in \ + daemon/systemd/user/pulseaudio.service.in \ + daemon/systemd/user/pulseaudio.socket utils/padsp.in \ + utils/qpaeq utils/pa-info daemon/pulseaudio.desktop.in \ + map-file daemon/pulseaudio-system.conf \ + modules/echo-cancel/adrian-license.txt \ + modules/gsettings/org.freedesktop.pulseaudio.gschema.xml \ + modules/gsettings/pulseaudio.convert $(addsuffix \ + .orc,$(ORC_SOURCE)) +pulseconf_DATA = \ + default.pa \ + system.pa \ + daemon.conf \ + client.conf + +@HAVE_DBUS_TRUE@dbuspolicy_DATA = \ +@HAVE_DBUS_TRUE@ daemon/pulseaudio-system.conf + +@HAVE_X11_TRUE@xdgautostart_in_files = \ +@HAVE_X11_TRUE@ daemon/pulseaudio.desktop.in + +@HAVE_X11_TRUE@xdgautostart_DATA = $(xdgautostart_in_files:.desktop.in=.desktop) + +################################### +# Includes # +################################### +BUILT_SOURCES = $(am__append_6) + +################################### +# Some minor stuff # +################################### +CLEANFILES = $(am__append_7) $(am__append_51) \ + daemon/pulseaudio.desktop +@HAVE_ORC_TRUE@ORC_BUILT_SOURCE = $(addsuffix -orc-gen.c,$(ORC_SOURCE)) +@HAVE_ORC_TRUE@ORC_BUILT_HEADER = $(addsuffix -orc-gen.h,$(ORC_SOURCE)) +@HAVE_ORC_TRUE@orcc_v_gen = $(orcc_v_gen_$(V)) +@HAVE_ORC_TRUE@orcc_v_gen_ = $(orcc_v_gen_$(AM_DEFAULT_VERBOSITY)) +@HAVE_ORC_TRUE@orcc_v_gen_0 = @echo " ORCC $@"; +@HAVE_ORC_TRUE@cp_v_gen = $(cp_v_gen_$(V)) +@HAVE_ORC_TRUE@cp_v_gen_ = $(cp_v_gen_$(AM_DEFAULT_VERBOSITY)) +@HAVE_ORC_TRUE@cp_v_gen_0 = @echo " CP $@"; +ORC_SOURCE = pulsecore/svolume $(am__append_137) +pulseaudio_SOURCES = daemon/caps.c daemon/caps.h daemon/cmdline.c \ + daemon/cmdline.h daemon/cpulimit.c daemon/cpulimit.h \ + daemon/daemon-conf.c daemon/daemon-conf.h daemon/dumpmodules.c \ + daemon/dumpmodules.h daemon/ltdl-bind-now.c \ + daemon/ltdl-bind-now.h daemon/main.c $(am__append_9) +pulseaudio_CFLAGS = $(AM_CFLAGS) $(CAP_CFLAGS) $(am__append_8) \ + $(am__append_11) +pulseaudio_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la \ + libpulsecommon-@PA_MAJORMINOR@.la libpulse.la $(LIBLTDL) \ + $(CAP_LIBS) $(am__append_10) +# This is needed because automake doesn't properly expand the foreach below +pulseaudio_DEPENDENCIES = libpulsecore-@PA_MAJORMINOR@.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la $(PREOPEN_LIBS) +@PREOPEN_MODS_FALSE@PREOPEN_LIBS = $(modlibexec_LTLIBRARIES) +@PREOPEN_MODS_TRUE@PREOPEN_LIBS = $(PREOPEN_MODS) +@FORCE_PREOPEN_FALSE@pulseaudio_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) \ +@FORCE_PREOPEN_FALSE@ $(IMMEDIATE_LDFLAGS) -ffast-math -dlopen \ +@FORCE_PREOPEN_FALSE@ force $(foreach f,$(PREOPEN_LIBS),-dlopen \ +@FORCE_PREOPEN_FALSE@ $(f)) $(am__append_12) +@FORCE_PREOPEN_TRUE@pulseaudio_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) \ +@FORCE_PREOPEN_TRUE@ $(IMMEDIATE_LDFLAGS) -ffast-math \ +@FORCE_PREOPEN_TRUE@ -dlpreopen force $(foreach \ +@FORCE_PREOPEN_TRUE@ f,$(PREOPEN_LIBS),-dlpreopen $(f)) \ +@FORCE_PREOPEN_TRUE@ $(am__append_12) + +################################### +# Utility programs # +################################### +bin_SCRIPTS = utils/pa-info $(am__append_13) $(am__append_17) \ + $(am__append_50) $(am__append_122) +pacat_SOURCES = utils/pacat.c +pacat_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la $(LIBSNDFILE_LIBS) +pacat_CFLAGS = $(AM_CFLAGS) $(LIBSNDFILE_CFLAGS) +pacat_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) +pactl_SOURCES = utils/pactl.c +pactl_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la $(LIBSNDFILE_LIBS) +pactl_CFLAGS = $(AM_CFLAGS) $(LIBSNDFILE_CFLAGS) +pactl_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) +pasuspender_SOURCES = utils/pasuspender.c +pasuspender_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +pasuspender_CFLAGS = $(AM_CFLAGS) +pasuspender_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) +pacmd_SOURCES = utils/pacmd.c +pacmd_CFLAGS = $(AM_CFLAGS) +pacmd_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +pacmd_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) +pax11publish_SOURCES = utils/pax11publish.c +pax11publish_CFLAGS = $(AM_CFLAGS) $(X11_CFLAGS) +pax11publish_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la $(X11_LIBS) +pax11publish_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) +@HAVE_SYSTEMD_DAEMON_TRUE@systemduserunit_DATA = \ +@HAVE_SYSTEMD_DAEMON_TRUE@ pulseaudio.service \ +@HAVE_SYSTEMD_DAEMON_TRUE@ daemon/systemd/user/pulseaudio.socket + + +################################### +# Test programs # +################################### + +# We split the foreign code off to not be annoyed by warnings we don't care about +noinst_LTLIBRARIES = liblo-test-util.la $(am__append_52) \ + libpulsecore-foreign.la +TESTS_default = asyncmsgq-test asyncq-test channelmap-test close-test \ + core-util-test cpu-mix-test cpu-remap-test cpu-sconv-test \ + cpu-volume-test format-test get-binary-name-test hashmap-test \ + hook-list-test json-test lfe-filter-test lock-autospawn-test \ + mainloop-test memblock-test memblockq-test mix-test \ + mult-s16-test proplist-test queue-test resampler-test \ + rtpoll-test smoother-test strlist-test thread-mainloop-test \ + thread-test utf8-test volume-test $(am__append_18) \ + $(am__append_20) $(am__append_21) $(am__append_23) \ + $(am__append_26) +TESTS_norun = ipacl-test mcalign-test pacat-simple parec-simple \ + flist-test remix-test rtstutter sig2str-test stripnul \ + echo-cancel-test lo-latency-test $(am__append_19) \ + $(am__append_22) $(am__append_24) $(am__append_25) + +# These tests need a running pulseaudio daemon +TESTS_daemon = \ + extended-test \ + passthrough-test \ + sync-playback + + +# These tests need a running daemon and take a while to complete +TESTS_daemon_long = \ + connect-stress \ + interpol-test + +@HAVE_TESTS_FALSE@TESTS_ENVIRONMENT = +@HAVE_TESTS_TRUE@TESTS_ENVIRONMENT = MAKE_CHECK=1 +core_util_test_SOURCES = tests/core-util-test.c +core_util_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +core_util_test_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +core_util_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +hashmap_test_SOURCES = tests/hashmap-test.c +hashmap_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +hashmap_test_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +hashmap_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +mainloop_test_SOURCES = tests/mainloop-test.c +mainloop_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +mainloop_test_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +mainloop_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +thread_mainloop_test_SOURCES = tests/thread-mainloop-test.c +thread_mainloop_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +thread_mainloop_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +thread_mainloop_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +utf8_test_SOURCES = tests/utf8-test.c +utf8_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +utf8_test_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +utf8_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +format_test_SOURCES = tests/format-test.c +format_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +format_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +format_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +json_test_SOURCES = tests/json-test.c +json_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +json_test_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +json_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +srbchannel_test_SOURCES = tests/srbchannel-test.c +srbchannel_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +srbchannel_test_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +srbchannel_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +atomic_test_SOURCES = tests/atomic-test.c +atomic_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +atomic_test_LDADD = $(AM_LDADD) libpulsecommon-@PA_MAJORMINOR@.la libpulse.la +atomic_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +get_binary_name_test_SOURCES = tests/get-binary-name-test.c +get_binary_name_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +get_binary_name_test_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +get_binary_name_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +ipacl_test_SOURCES = tests/ipacl-test.c +ipacl_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +ipacl_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +ipacl_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +hook_list_test_SOURCES = tests/hook-list-test.c +hook_list_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +hook_list_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +hook_list_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +memblock_test_SOURCES = tests/memblock-test.c +memblock_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +memblock_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +memblock_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +thread_test_SOURCES = tests/thread-test.c +thread_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +thread_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +thread_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +once_test_SOURCES = tests/once-test.c +once_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +once_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +once_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +flist_test_SOURCES = tests/flist-test.c +flist_test_CFLAGS = $(AM_CFLAGS) +flist_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +flist_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) +asyncq_test_SOURCES = tests/asyncq-test.c +asyncq_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +asyncq_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +asyncq_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +asyncmsgq_test_SOURCES = tests/asyncmsgq-test.c +asyncmsgq_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +asyncmsgq_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +asyncmsgq_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +queue_test_SOURCES = tests/queue-test.c +queue_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +queue_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +queue_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +rtpoll_test_SOURCES = tests/rtpoll-test.c +rtpoll_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +rtpoll_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +rtpoll_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +mcalign_test_SOURCES = tests/mcalign-test.c +mcalign_test_CFLAGS = $(AM_CFLAGS) +mcalign_test_LDADD = $(AM_LDADD) $(WINSOCK_LIBS) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +mcalign_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) +pacat_simple_SOURCES = tests/pacat-simple.c +pacat_simple_LDADD = $(AM_LDADD) libpulse.la libpulse-simple.la +pacat_simple_CFLAGS = $(AM_CFLAGS) +pacat_simple_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) +parec_simple_SOURCES = tests/parec-simple.c +parec_simple_LDADD = $(AM_LDADD) libpulse.la libpulse-simple.la +parec_simple_CFLAGS = $(AM_CFLAGS) +parec_simple_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) +extended_test_SOURCES = tests/extended-test.c +extended_test_LDADD = $(AM_LDADD) libpulse.la +extended_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +extended_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +passthrough_test_SOURCES = tests/passthrough-test.c +passthrough_test_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +passthrough_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +passthrough_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +strlist_test_SOURCES = tests/strlist-test.c +strlist_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +strlist_test_LDADD = $(AM_LDADD) $(WINSOCK_LIBS) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +strlist_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +close_test_SOURCES = tests/close-test.c +close_test_CFLAGS = $(AM_CFLAGS) +close_test_LDADD = $(AM_LDADD) $(WINSOCK_LIBS) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +close_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) +volume_test_SOURCES = tests/volume-test.c +volume_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +volume_test_LDADD = $(AM_LDADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +volume_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +channelmap_test_SOURCES = tests/channelmap-test.c +channelmap_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +channelmap_test_LDADD = $(AM_LDADD) libpulse.la +channelmap_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +cpulimit_test_SOURCES = tests/cpulimit-test.c daemon/cpulimit.c daemon/cpulimit.h +cpulimit_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +cpulimit_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +cpulimit_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +cpulimit_test2_SOURCES = tests/cpulimit-test.c daemon/cpulimit.c daemon/cpulimit.h +cpulimit_test2_CFLAGS = $(AM_CFLAGS) -DTEST2 $(LIBCHECK_CFLAGS) +cpulimit_test2_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +cpulimit_test2_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +mainloop_test_glib_SOURCES = $(mainloop_test_SOURCES) +mainloop_test_glib_CFLAGS = $(mainloop_test_CFLAGS) $(LIBCHECK_CFLAGS) $(GLIB20_CFLAGS) -DGLIB_MAIN_LOOP +mainloop_test_glib_LDADD = $(mainloop_test_LDADD) $(GLIB20_LIBS) libpulse-mainloop-glib.la +mainloop_test_glib_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +memblockq_test_SOURCES = tests/memblockq-test.c +memblockq_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +memblockq_test_LDADD = $(AM_LDADD) $(WINSOCK_LIBS) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +memblockq_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +sync_playback_SOURCES = tests/sync-playback.c +sync_playback_LDADD = $(AM_LDADD) libpulse.la +sync_playback_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +sync_playback_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +interpol_test_SOURCES = tests/interpol-test.c +interpol_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +interpol_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +interpol_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +sig2str_test_SOURCES = tests/sig2str-test.c +sig2str_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +sig2str_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +sig2str_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +resampler_test_SOURCES = tests/resampler-test.c +resampler_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +resampler_test_CFLAGS = $(AM_CFLAGS) +resampler_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) +mix_test_SOURCES = tests/mix-test.c +mix_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +mix_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +mix_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +remix_test_SOURCES = tests/remix-test.c +remix_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +remix_test_CFLAGS = $(AM_CFLAGS) +remix_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) +smoother_test_SOURCES = tests/smoother-test.c +smoother_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +smoother_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +smoother_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +proplist_test_SOURCES = tests/proplist-test.c +proplist_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +proplist_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +proplist_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +cpu_mix_test_SOURCES = tests/cpu-mix-test.c tests/runtime-test-util.h +cpu_mix_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +cpu_mix_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +cpu_mix_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +cpu_remap_test_SOURCES = tests/cpu-remap-test.c tests/runtime-test-util.h +cpu_remap_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +cpu_remap_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +cpu_remap_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +cpu_sconv_test_SOURCES = tests/cpu-sconv-test.c tests/runtime-test-util.h +cpu_sconv_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +cpu_sconv_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +cpu_sconv_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +cpu_volume_test_SOURCES = tests/cpu-volume-test.c tests/runtime-test-util.h +cpu_volume_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +cpu_volume_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +cpu_volume_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +mult_s16_test_SOURCES = tests/mult-s16-test.c tests/runtime-test-util.h +mult_s16_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +mult_s16_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +mult_s16_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +lfe_filter_test_SOURCES = tests/lfe-filter-test.c +lfe_filter_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +lfe_filter_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +lfe_filter_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +rtstutter_SOURCES = tests/rtstutter.c +rtstutter_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +rtstutter_CFLAGS = $(AM_CFLAGS) +rtstutter_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) +stripnul_SOURCES = tests/stripnul.c +stripnul_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +stripnul_CFLAGS = $(AM_CFLAGS) +stripnul_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) +lock_autospawn_test_SOURCES = tests/lock-autospawn-test.c +lock_autospawn_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +lock_autospawn_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +lock_autospawn_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +sigbus_test_SOURCES = tests/sigbus-test.c +sigbus_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +sigbus_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +sigbus_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +gtk_test_SOURCES = tests/gtk-test.c +gtk_test_LDADD = $(AM_LDADD) $(GTK30_LIBS) libpulse-mainloop-glib.la libpulse.la +gtk_test_CFLAGS = $(AM_CFLAGS) $(GTK30_CFLAGS) +gtk_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) +alsa_time_test_SOURCES = tests/alsa-time-test.c +alsa_time_test_LDADD = $(AM_LDADD) $(ASOUNDLIB_LIBS) +alsa_time_test_CFLAGS = $(AM_CFLAGS) $(ASOUNDLIB_CFLAGS) +alsa_time_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) +alsa_mixer_path_test_SOURCES = tests/alsa-mixer-path-test.c +alsa_mixer_path_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) $(ASOUNDLIB_CFLAGS) +alsa_mixer_path_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la libalsa-util.la +alsa_mixer_path_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +usergroup_test_SOURCES = tests/usergroup-test.c +usergroup_test_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +usergroup_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +usergroup_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +connect_stress_SOURCES = tests/connect-stress.c +connect_stress_LDADD = $(AM_LDADD) libpulse.la +connect_stress_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +connect_stress_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) +echo_cancel_test_SOURCES = $(module_echo_cancel_la_SOURCES) +nodist_echo_cancel_test_SOURCES = $(nodist_module_echo_cancel_la_SOURCES) +echo_cancel_test_LDADD = $(module_echo_cancel_la_LIBADD) +echo_cancel_test_CFLAGS = $(module_echo_cancel_la_CFLAGS) -DECHO_CANCEL_TEST=1 +@HAVE_WEBRTC_TRUE@echo_cancel_test_CXXFLAGS = $(module_echo_cancel_la_CXXFLAGS) -DECHO_CANCEL_TEST=1 +echo_cancel_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) +liblo_test_util_la_SOURCES = tests/lo-test-util.h tests/lo-test-util.c +liblo_test_util_la_LIBADD = libpulsecore-@PA_MAJORMINOR@.la +liblo_test_util_la_LDFLAGS = -avoid-version +lo_latency_test_SOURCES = tests/lo-latency-test.c +lo_latency_test_LDADD = $(AM_LDADD) libpulse.la liblo-test-util.la +lo_latency_test_CFLAGS = $(AM_CFLAGS) $(LIBCHECK_CFLAGS) +lo_latency_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS) + +################################### +# Common library # +################################### +commonlibdir = $(pkglibdir) +commonlib_LTLIBRARIES = \ + libpulsecommon-@PA_MAJORMINOR@.la + + +# We duplicate files from pulse/ in this to allow as-needed linking. If we did +# not do this, in situations where code in libpulsecommon uses code in +# libpulse, we would then need to link libpulsecommon to libpulse (in addition +# to the existing libpulse being linked to libpulsecommon). Duplicating the +# code allows us to prevent this circular linking. +libpulsecommon_@PA_MAJORMINOR@_la_SOURCES = pulse/client-conf.c \ + pulse/client-conf.h pulse/fork-detect.c pulse/fork-detect.h \ + pulse/format.c pulse/format.h pulse/json.c pulse/json.h \ + pulse/xmalloc.c pulse/xmalloc.h pulse/proplist.c \ + pulse/proplist.h pulse/utf8.c pulse/utf8.h pulse/channelmap.c \ + pulse/channelmap.h pulse/sample.c pulse/sample.h pulse/util.c \ + pulse/util.h pulse/timeval.c pulse/timeval.h pulse/rtclock.c \ + pulse/rtclock.h pulse/volume.c pulse/volume.h \ + pulsecore/atomic.h pulsecore/authkey.c pulsecore/authkey.h \ + pulsecore/conf-parser.c pulsecore/conf-parser.h \ + pulsecore/core-error.c pulsecore/core-error.h \ + pulsecore/core-format.c pulsecore/core-format.h \ + pulsecore/core-rtclock.c pulsecore/core-rtclock.h \ + pulsecore/core-util.c pulsecore/core-util.h pulsecore/creds.h \ + pulsecore/dynarray.c pulsecore/dynarray.h \ + pulsecore/endianmacros.h pulsecore/fdsem.c pulsecore/fdsem.h \ + pulsecore/flist.c pulsecore/flist.h pulsecore/g711.c \ + pulsecore/g711.h pulsecore/hashmap.c pulsecore/hashmap.h \ + pulsecore/i18n.c pulsecore/i18n.h pulsecore/idxset.c \ + pulsecore/idxset.h pulsecore/arpa-inet.c pulsecore/arpa-inet.h \ + pulsecore/iochannel.c pulsecore/iochannel.h pulsecore/ioline.c \ + pulsecore/ioline.h pulsecore/ipacl.c pulsecore/ipacl.h \ + pulsecore/llist.h pulsecore/lock-autospawn.c \ + pulsecore/lock-autospawn.h pulsecore/log.c pulsecore/log.h \ + pulsecore/ratelimit.c pulsecore/ratelimit.h pulsecore/macro.h \ + pulsecore/mcalign.c pulsecore/mcalign.h pulsecore/memblock.c \ + pulsecore/memblock.h pulsecore/memblockq.c \ + pulsecore/memblockq.h pulsecore/memchunk.c \ + pulsecore/memchunk.h pulsecore/native-common.c \ + pulsecore/native-common.h pulsecore/once.c pulsecore/once.h \ + pulsecore/packet.c pulsecore/packet.h pulsecore/parseaddr.c \ + pulsecore/parseaddr.h pulsecore/pdispatch.c \ + pulsecore/pdispatch.h pulsecore/pid.c pulsecore/pid.h \ + pulsecore/pipe.c pulsecore/pipe.h pulsecore/memtrap.c \ + pulsecore/memtrap.h pulsecore/aupdate.c pulsecore/aupdate.h \ + pulsecore/proplist-util.c pulsecore/proplist-util.h \ + pulsecore/pstream-util.c pulsecore/pstream-util.h \ + pulsecore/pstream.c pulsecore/pstream.h pulsecore/queue.c \ + pulsecore/queue.h pulsecore/random.c pulsecore/random.h \ + pulsecore/refcnt.h pulsecore/srbchannel.c \ + pulsecore/srbchannel.h pulsecore/sample-util.c \ + pulsecore/sample-util.h pulsecore/mem.h pulsecore/shm.c \ + pulsecore/shm.h pulsecore/bitset.c pulsecore/bitset.h \ + pulsecore/socket-client.c pulsecore/socket-client.h \ + pulsecore/socket-server.c pulsecore/socket-server.h \ + pulsecore/socket-util.c pulsecore/socket-util.h \ + pulsecore/strbuf.c pulsecore/strbuf.h pulsecore/strlist.c \ + pulsecore/strlist.h pulsecore/tagstruct.c \ + pulsecore/tagstruct.h pulsecore/time-smoother.c \ + pulsecore/time-smoother.h pulsecore/tokenizer.c \ + pulsecore/tokenizer.h pulsecore/usergroup.c \ + pulsecore/usergroup.h pulsecore/sndfile-util.c \ + pulsecore/sndfile-util.h pulsecore/socket.h $(am__append_27) \ + $(am__append_28) $(am__append_29) $(am__append_30) \ + $(am__append_37) $(am__append_38) $(am__append_39) \ + $(am__append_42) $(am__append_43) + +# proplist-util.h uses these header files, but not the library itself! +libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS = $(AM_CFLAGS) \ + $(LIBSNDFILE_CFLAGS) $(am__append_31) $(am__append_33) \ + $(am__append_35) $(GLIB20_CFLAGS) $(GTK30_CFLAGS) \ + $(am__append_40) $(am__append_44) +libpulsecommon_@PA_MAJORMINOR@_la_LDFLAGS = $(AM_LDFLAGS) \ + $(AM_LIBLDFLAGS) -avoid-version $(am__append_32) \ + $(am__append_34) $(am__append_36) +libpulsecommon_@PA_MAJORMINOR@_la_LIBADD = $(AM_LIBADD) \ + $(LIBWRAP_LIBS) $(WINSOCK_LIBS) $(LTLIBICONV) \ + $(LIBSNDFILE_LIBS) $(am__append_41) $(am__append_45) + +################################### +# Client library # +################################### +pulseinclude_HEADERS = pulse/cdecl.h pulse/channelmap.h \ + pulse/context.h pulse/def.h pulse/direction.h pulse/error.h \ + pulse/ext-device-manager.h pulse/ext-device-restore.h \ + pulse/ext-stream-restore.h pulse/format.h pulse/gccmacro.h \ + pulse/introspect.h pulse/mainloop-api.h \ + pulse/mainloop-signal.h pulse/mainloop.h pulse/operation.h \ + pulse/proplist.h pulse/pulseaudio.h pulse/rtclock.h \ + pulse/sample.h pulse/scache.h pulse/simple.h pulse/stream.h \ + pulse/subscribe.h pulse/thread-mainloop.h pulse/timeval.h \ + pulse/utf8.h pulse/util.h pulse/version.h pulse/volume.h \ + pulse/xmalloc.h $(am__append_46) +lib_LTLIBRARIES = libpulse.la libpulse-simple.la $(am__append_47) + +# Public interface +libpulse_la_SOURCES = \ + pulse/cdecl.h \ + pulse/channelmap.c pulse/channelmap.h \ + pulse/context.c pulse/context.h \ + pulse/def.h \ + pulse/direction.c pulse/direction.h \ + pulse/error.c pulse/error.h \ + pulse/ext-device-manager.c pulse/ext-device-manager.h \ + pulse/ext-device-restore.c pulse/ext-device-restore.h \ + pulse/ext-stream-restore.c pulse/ext-stream-restore.h \ + pulse/format.c pulse/format.h \ + pulse/gccmacro.h \ + pulse/internal.h \ + pulse/introspect.c pulse/introspect.h \ + pulse/mainloop-api.c pulse/mainloop-api.h \ + pulse/mainloop-signal.c pulse/mainloop-signal.h \ + pulse/mainloop.c pulse/mainloop.h \ + pulse/operation.c pulse/operation.h \ + pulse/proplist.c pulse/proplist.h \ + pulse/pulseaudio.h \ + pulse/rtclock.c pulse/rtclock.h \ + pulse/sample.c pulse/sample.h \ + pulse/scache.c pulse/scache.h \ + pulse/stream.c pulse/stream.h \ + pulse/subscribe.c pulse/subscribe.h \ + pulse/thread-mainloop.c pulse/thread-mainloop.h \ + pulse/timeval.c pulse/timeval.h \ + pulse/utf8.c pulse/utf8.h \ + pulse/util.c pulse/util.h \ + pulse/volume.c pulse/volume.h \ + pulse/xmalloc.c pulse/xmalloc.h + +libpulse_la_CFLAGS = $(AM_CFLAGS) $(am__append_48) +libpulse_la_LIBADD = $(AM_LIBADD) $(WINSOCK_LIBS) $(LTLIBICONV) \ + libpulsecommon-@PA_MAJORMINOR@.la $(am__append_49) +libpulse_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_VERSION_INFO) +libpulse_simple_la_SOURCES = pulse/simple.c pulse/simple.h +libpulse_simple_la_CFLAGS = $(AM_CFLAGS) +libpulse_simple_la_LIBADD = $(AM_LIBADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +libpulse_simple_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_SIMPLE_VERSION_INFO) +libpulse_mainloop_glib_la_SOURCES = pulse/glib-mainloop.h pulse/glib-mainloop.c +libpulse_mainloop_glib_la_CFLAGS = $(AM_CFLAGS) $(GLIB20_CFLAGS) +libpulse_mainloop_glib_la_LIBADD = $(AM_LIBADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la $(GLIB20_LIBS) +libpulse_mainloop_glib_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_MAINLOOP_GLIB_VERSION_INFO) + +################################### +# OSS emulation # +################################### +@HAVE_OSS_WRAPPER_TRUE@padsplibdir = $(pkglibdir) +@HAVE_OSS_WRAPPER_TRUE@padsplib_LTLIBRARIES = libpulsedsp.la +@HAVE_OSS_WRAPPER_TRUE@edit = @SED@ \ +@HAVE_OSS_WRAPPER_TRUE@ -e 's|@PULSEDSP_LOCATION[@]|$(PULSEDSP_LOCATION)|g' + +libpulsedsp_la_SOURCES = utils/padsp.c +libpulsedsp_la_CFLAGS = $(AM_CFLAGS) +libpulsedsp_la_LIBADD = $(AM_LIBADD) libpulse.la libpulsecommon-@PA_MAJORMINOR@.la +libpulsedsp_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version -disable-static + +################################### +# Daemon core library # +################################### +pkglib_LTLIBRARIES = libpulsecore-@PA_MAJORMINOR@.la + +# Pure core stuff +libpulsecore_@PA_MAJORMINOR@_la_SOURCES = \ + pulsecore/filter/lfe-filter.c pulsecore/filter/lfe-filter.h \ + pulsecore/filter/biquad.c pulsecore/filter/biquad.h \ + pulsecore/filter/crossover.c pulsecore/filter/crossover.h \ + pulsecore/asyncmsgq.c pulsecore/asyncmsgq.h pulsecore/asyncq.c \ + pulsecore/asyncq.h pulsecore/auth-cookie.c \ + pulsecore/auth-cookie.h pulsecore/cli-command.c \ + pulsecore/cli-command.h pulsecore/cli-text.c \ + pulsecore/cli-text.h pulsecore/client.c pulsecore/client.h \ + pulsecore/typedefs.h pulsecore/card.c pulsecore/card.h \ + pulsecore/core-scache.c pulsecore/core-scache.h \ + pulsecore/core-subscribe.c pulsecore/core-subscribe.h \ + pulsecore/core.c pulsecore/core.h pulsecore/message-handler.c \ + pulsecore/message-handler.h pulsecore/hook-list.c \ + pulsecore/hook-list.h pulsecore/ltdl-helper.c \ + pulsecore/ltdl-helper.h pulsecore/modargs.c \ + pulsecore/modargs.h pulsecore/modinfo.c pulsecore/modinfo.h \ + pulsecore/module.c pulsecore/module.h pulsecore/msgobject.c \ + pulsecore/msgobject.h pulsecore/namereg.c pulsecore/namereg.h \ + pulsecore/object.c pulsecore/object.h \ + pulsecore/play-memblockq.c pulsecore/play-memblockq.h \ + pulsecore/play-memchunk.c pulsecore/play-memchunk.h \ + pulsecore/remap.c pulsecore/remap.h pulsecore/remap_mmx.c \ + pulsecore/remap_sse.c pulsecore/resampler.c \ + pulsecore/resampler.h pulsecore/resampler/ffmpeg.c \ + pulsecore/resampler/peaks.c pulsecore/resampler/trivial.c \ + pulsecore/rtpoll.c pulsecore/rtpoll.h pulsecore/stream-util.c \ + pulsecore/stream-util.h pulsecore/svolume_c.c \ + pulsecore/svolume_arm.c pulsecore/svolume_mmx.c \ + pulsecore/svolume_sse.c pulsecore/mix.c pulsecore/mix.h \ + pulsecore/cpu.c pulsecore/cpu.h pulsecore/cpu-arm.c \ + pulsecore/cpu-arm.h pulsecore/cpu-x86.c pulsecore/cpu-x86.h \ + pulsecore/cpu-orc.c pulsecore/cpu-orc.h \ + pulsecore/sconv-s16be.c pulsecore/sconv-s16be.h \ + pulsecore/sconv-s16le.c pulsecore/sconv-s16le.h \ + pulsecore/sconv_sse.c pulsecore/sconv.c pulsecore/sconv.h \ + pulsecore/shared.c pulsecore/shared.h pulsecore/sink-input.c \ + pulsecore/sink-input.h pulsecore/sink.c pulsecore/sink.h \ + pulsecore/device-port.c pulsecore/device-port.h \ + pulsecore/sioman.c pulsecore/sioman.h \ + pulsecore/sound-file-stream.c pulsecore/sound-file-stream.h \ + pulsecore/sound-file.c pulsecore/sound-file.h \ + pulsecore/source-output.c pulsecore/source-output.h \ + pulsecore/source.c pulsecore/source.h pulsecore/start-child.c \ + pulsecore/start-child.h pulsecore/thread-mq.c \ + pulsecore/thread-mq.h pulsecore/database.c \ + pulsecore/database.h $(am__append_54) $(am__append_57) \ + $(am__append_60) $(am__append_63) $(am__append_66) \ + $(am__append_69) $(am__append_70) $(am__append_73) \ + $(am__append_76) +libpulsecore_@PA_MAJORMINOR@_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) \ + $(LIBSNDFILE_CFLAGS) $(WINSOCK_CFLAGS) $(am__append_55) \ + $(am__append_58) $(am__append_61) $(am__append_64) \ + $(am__append_67) $(am__append_71) $(am__append_74) \ + $(am__append_77) +libpulsecore_@PA_MAJORMINOR@_la_LDFLAGS = $(AM_LDFLAGS) \ + $(AM_LIBLDFLAGS) -avoid-version $(am__append_59) +libpulsecore_@PA_MAJORMINOR@_la_LIBADD = $(AM_LIBADD) $(LIBLTDL) \ + $(LIBSNDFILE_LIBS) $(WINSOCK_LIBS) $(LTLIBICONV) \ + libpulsecommon-@PA_MAJORMINOR@.la libpulse.la \ + libpulsecore-foreign.la $(am__append_53) $(am__append_56) \ + $(am__append_62) $(am__append_65) $(am__append_68) \ + $(am__append_72) $(am__append_75) $(am__append_78) +@HAVE_NEON_TRUE@libpulsecore_sconv_neon_la_SOURCES = pulsecore/sconv_neon.c +@HAVE_NEON_TRUE@libpulsecore_sconv_neon_la_CFLAGS = $(AM_CFLAGS) $(NEON_CFLAGS) +@HAVE_NEON_TRUE@libpulsecore_mix_neon_la_SOURCES = pulsecore/mix_neon.c +@HAVE_NEON_TRUE@libpulsecore_mix_neon_la_CFLAGS = $(AM_CFLAGS) $(NEON_CFLAGS) +@HAVE_NEON_TRUE@libpulsecore_remap_neon_la_SOURCES = pulsecore/remap_neon.c +@HAVE_NEON_TRUE@libpulsecore_remap_neon_la_CFLAGS = $(AM_CFLAGS) $(NEON_CFLAGS) +@HAVE_ORC_TRUE@nodist_libpulsecore_@PA_MAJORMINOR@_la_SOURCES = pulsecore/svolume-orc-gen.c pulsecore/svolume-orc-gen.h +libpulsecore_foreign_la_SOURCES = \ + pulsecore/ffmpeg/resample2.c pulsecore/ffmpeg/avcodec.h pulsecore/ffmpeg/dsputil.h + +libpulsecore_foreign_la_CFLAGS = $(AM_CFLAGS) $(FOREIGN_CFLAGS) + +################################### +# Plug-in support libraries # +################################### + +### Warning! Due to an obscure bug in libtool/automake it is required +### that the libraries in modlibexec_LTLIBRARIES are specified in-order, +### i.e. libraries near the end of the list depend on libraries near +### the head, and not the other way! +modlibexec_LTLIBRARIES = libcli.la libprotocol-cli.la \ + libprotocol-simple.la libprotocol-http.la \ + libprotocol-native.la $(am__append_79) $(am__append_80) \ + $(am__append_81) $(am__append_82) $(am__append_89) \ + module-cli.la module-cli-protocol-tcp.la \ + module-simple-protocol-tcp.la module-null-sink.la \ + module-null-source.la module-sine-source.la module-detect.la \ + module-volume-restore.la module-device-manager.la \ + module-device-restore.la module-stream-restore.la \ + module-card-restore.la module-default-device-restore.la \ + module-always-sink.la module-always-source.la \ + module-rescue-streams.la module-intended-roles.la \ + module-suspend-on-idle.la module-echo-cancel.la \ + module-http-protocol-tcp.la module-sine.la \ + module-native-protocol-tcp.la module-native-protocol-fd.la \ + module-combine.la module-combine-sink.la module-remap-sink.la \ + module-remap-source.la module-ladspa-sink.la \ + module-tunnel-sink-new.la module-tunnel-source-new.la \ + module-tunnel-sink.la module-tunnel-source.la \ + module-position-event-sounds.la module-augment-properties.la \ + module-role-cork.la module-loopback.la module-virtual-sink.la \ + module-virtual-source.la module-virtual-surround-sink.la \ + module-switch-on-connect.la module-switch-on-port-available.la \ + module-filter-apply.la module-filter-heuristics.la \ + module-role-ducking.la module-allow-passthrough.la \ + $(am__append_90) $(am__append_91) $(am__append_92) \ + $(am__append_93) $(am__append_94) $(am__append_95) \ + $(am__append_96) $(am__append_97) $(am__append_98) \ + $(am__append_99) $(am__append_100) $(am__append_101) \ + $(am__append_102) $(am__append_103) $(am__append_104) \ + $(am__append_105) $(am__append_106) $(am__append_107) \ + $(am__append_108) $(am__append_110) $(am__append_112) \ + $(am__append_113) $(am__append_114) $(am__append_115) \ + $(am__append_116) $(am__append_117) $(am__append_118) \ + $(am__append_119) $(am__append_120) $(am__append_121) +libprotocol_simple_la_SOURCES = pulsecore/protocol-simple.c pulsecore/protocol-simple.h +libprotocol_simple_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version +libprotocol_simple_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINOR@.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la +libcli_la_SOURCES = pulsecore/cli.c pulsecore/cli.h +libcli_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version +libcli_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINOR@.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la +libprotocol_cli_la_SOURCES = pulsecore/protocol-cli.c pulsecore/protocol-cli.h +libprotocol_cli_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version +libprotocol_cli_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINOR@.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la libcli.la +libprotocol_http_la_SOURCES = pulsecore/protocol-http.c pulsecore/protocol-http.h pulsecore/mime-type.c pulsecore/mime-type.h +libprotocol_http_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version +libprotocol_http_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINOR@.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la +libprotocol_native_la_SOURCES = pulsecore/protocol-native.c pulsecore/protocol-native.h pulsecore/native-common.h +libprotocol_native_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) \ + $(am__append_83) +libprotocol_native_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version +libprotocol_native_la_LIBADD = $(AM_LIBADD) \ + libpulsecore-@PA_MAJORMINOR@.la \ + libpulsecommon-@PA_MAJORMINOR@.la libpulse.la $(am__append_84) +@HAVE_ESOUND_TRUE@libprotocol_esound_la_SOURCES = pulsecore/protocol-esound.c pulsecore/protocol-esound.h pulsecore/esound.h +@HAVE_ESOUND_TRUE@libprotocol_esound_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version +@HAVE_ESOUND_TRUE@libprotocol_esound_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINOR@.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la +librtp_la_SOURCES = modules/rtp/rtp-common.c modules/rtp/rtp.h \ + modules/rtp/sdp.c modules/rtp/sdp.h modules/rtp/sap.c \ + modules/rtp/sap.h modules/rtp/rtsp_client.c \ + modules/rtp/rtsp_client.h modules/rtp/headerlist.c \ + modules/rtp/headerlist.h $(am__append_85) $(am__append_88) +librtp_la_CFLAGS = $(AM_CFLAGS) $(am__append_86) +librtp_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version +librtp_la_LIBADD = $(AM_LIBADD) libpulsecore-@PA_MAJORMINOR@.la \ + libpulsecommon-@PA_MAJORMINOR@.la libpulse.la $(am__append_87) +libraop_la_SOURCES = \ + modules/raop/raop-util.c modules/raop/raop-util.h \ + modules/raop/raop-crypto.c modules/raop/raop-crypto.h \ + modules/raop/raop-packet-buffer.h modules/raop/raop-packet-buffer.c \ + modules/raop/raop-client.c modules/raop/raop-client.h \ + modules/raop/raop-sink.c modules/raop/raop-sink.h + +libraop_la_CFLAGS = $(AM_CFLAGS) $(OPENSSL_CFLAGS) -I$(top_srcdir)/src/modules/rtp +libraop_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version +libraop_la_LIBADD = $(AM_LIBADD) $(OPENSSL_LIBS) libpulsecore-@PA_MAJORMINOR@.la librtp.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la + +# Avahi +libavahi_wrap_la_SOURCES = pulsecore/avahi-wrap.c pulsecore/avahi-wrap.h +libavahi_wrap_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version +libavahi_wrap_la_CFLAGS = $(AM_CFLAGS) $(AVAHI_CFLAGS) +libavahi_wrap_la_LIBADD = $(AM_LIBADD) $(AVAHI_CFLAGS) libpulsecore-@PA_MAJORMINOR@.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la +@HAVE_ALSA_TRUE@dist_alsaprofilesets_DATA = \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/profile-sets/default.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/profile-sets/force-speaker.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/profile-sets/force-speaker-and-int-mic.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/profile-sets/audigy.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/profile-sets/maudio-fasttrack-pro.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/profile-sets/native-instruments-audio4dj.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/profile-sets/native-instruments-audio8dj.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/profile-sets/native-instruments-traktor-audio2.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/profile-sets/native-instruments-traktor-audio6.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/profile-sets/native-instruments-traktor-audio10.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/profile-sets/native-instruments-traktorkontrol-s4.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/profile-sets/native-instruments-korecontroller.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/profile-sets/kinect-audio.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/profile-sets/sb-omni-surround-5.1.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/profile-sets/steelseries-arctis-common-usb-audio.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/profile-sets/usb-gaming-headset.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/profile-sets/dell-dock-tb16-usb-audio.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/profile-sets/cmedia-high-speed-true-hdaudio.conf + +@HAVE_ALSA_TRUE@@HAVE_UDEV_TRUE@dist_udevrules_DATA = \ +@HAVE_ALSA_TRUE@@HAVE_UDEV_TRUE@ modules/alsa/90-pulseaudio.rules + +@HAVE_ALSA_TRUE@dist_alsapaths_DATA = \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-input-aux.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-input.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-input.conf.common \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-input-fm.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-input-linein.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-input-mic.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-input-dock-mic.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-input-front-mic.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-input-headphone-mic.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-input-headset-mic.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-input-internal-mic.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-input-internal-mic-always.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-input-rear-mic.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-input-mic.conf.common \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-input-mic-line.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-input-tvtuner.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-input-video.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-output.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-output-speaker.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-output-speaker-always.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-output.conf.common \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-output-headphones.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-output-headphones-2.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-output-lineout.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/analog-output-mono.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/iec958-stereo-input.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/iec958-stereo-output.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/hdmi-output-0.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/hdmi-output-1.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/hdmi-output-2.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/hdmi-output-3.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/hdmi-output-4.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/hdmi-output-5.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/hdmi-output-6.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/hdmi-output-7.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/steelseries-arctis-output-chat-common.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/steelseries-arctis-output-game-common.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/usb-gaming-headset-input.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/usb-gaming-headset-output-mono.conf \ +@HAVE_ALSA_TRUE@ modules/alsa/mixer/paths/usb-gaming-headset-output-stereo.conf + +@HAVE_GSETTINGS_TRUE@gsettingsdataconvert_DATA = \ +@HAVE_GSETTINGS_TRUE@ modules/gsettings/pulseaudio.convert + + +# Simple protocol +module_simple_protocol_tcp_la_SOURCES = modules/module-protocol-stub.c +module_simple_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_SIMPLE $(AM_CFLAGS) -DPA_MODULE_NAME=module_simple_protocol_tcp +module_simple_protocol_tcp_la_LDFLAGS = $(MODULE_LDFLAGS) +module_simple_protocol_tcp_la_LIBADD = $(MODULE_LIBADD) libprotocol-simple.la +module_simple_protocol_unix_la_SOURCES = modules/module-protocol-stub.c +module_simple_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_SIMPLE $(AM_CFLAGS) -DPA_MODULE_NAME=module_simple_protocol_unix +module_simple_protocol_unix_la_LDFLAGS = $(MODULE_LDFLAGS) +module_simple_protocol_unix_la_LIBADD = $(MODULE_LIBADD) libprotocol-simple.la + +# CLI protocol +module_cli_la_SOURCES = modules/module-cli.c +module_cli_la_LDFLAGS = $(MODULE_LDFLAGS) +module_cli_la_LIBADD = $(MODULE_LIBADD) libcli.la +module_cli_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_cli +module_cli_protocol_tcp_la_SOURCES = modules/module-protocol-stub.c +module_cli_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_CLI $(AM_CFLAGS) -DPA_MODULE_NAME=module_cli_protocol_tcp +module_cli_protocol_tcp_la_LDFLAGS = $(MODULE_LDFLAGS) +module_cli_protocol_tcp_la_LIBADD = $(MODULE_LIBADD) libprotocol-cli.la +module_cli_protocol_unix_la_SOURCES = modules/module-protocol-stub.c +module_cli_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_CLI $(AM_CFLAGS) -DPA_MODULE_NAME=module_cli_protocol_unix +module_cli_protocol_unix_la_LDFLAGS = $(MODULE_LDFLAGS) +module_cli_protocol_unix_la_LIBADD = $(MODULE_LIBADD) libprotocol-cli.la + +# HTTP protocol +module_http_protocol_tcp_la_SOURCES = modules/module-protocol-stub.c +module_http_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_HTTP $(AM_CFLAGS) -DPA_MODULE_NAME=module_http_protocol_tcp +module_http_protocol_tcp_la_LDFLAGS = $(MODULE_LDFLAGS) +module_http_protocol_tcp_la_LIBADD = $(MODULE_LIBADD) libprotocol-http.la +module_http_protocol_unix_la_SOURCES = modules/module-protocol-stub.c +module_http_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_HTTP $(AM_CFLAGS) -DPA_MODULE_NAME=module_http_protocol_unix +module_http_protocol_unix_la_LDFLAGS = $(MODULE_LDFLAGS) +module_http_protocol_unix_la_LIBADD = $(MODULE_LIBADD) libprotocol-http.la + +# D-Bus protocol +module_dbus_protocol_la_SOURCES = \ + modules/dbus/iface-card.c modules/dbus/iface-card.h \ + modules/dbus/iface-card-profile.c modules/dbus/iface-card-profile.h \ + modules/dbus/iface-client.c modules/dbus/iface-client.h \ + modules/dbus/iface-core.c modules/dbus/iface-core.h \ + modules/dbus/iface-device.c modules/dbus/iface-device.h \ + modules/dbus/iface-device-port.c modules/dbus/iface-device-port.h \ + modules/dbus/iface-memstats.c modules/dbus/iface-memstats.h \ + modules/dbus/iface-module.c modules/dbus/iface-module.h \ + modules/dbus/iface-sample.c modules/dbus/iface-sample.h \ + modules/dbus/iface-stream.c modules/dbus/iface-stream.h \ + modules/dbus/module-dbus-protocol.c + +module_dbus_protocol_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) -DPA_MODULE_NAME=module_dbus_protocol +module_dbus_protocol_la_LDFLAGS = $(MODULE_LDFLAGS) +module_dbus_protocol_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS) + +# Native protocol +module_native_protocol_tcp_la_SOURCES = modules/module-protocol-stub.c +module_native_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_NATIVE $(AM_CFLAGS) -DPA_MODULE_NAME=module_native_protocol_tcp +module_native_protocol_tcp_la_LDFLAGS = $(MODULE_LDFLAGS) +module_native_protocol_tcp_la_LIBADD = $(MODULE_LIBADD) libprotocol-native.la +module_native_protocol_unix_la_SOURCES = modules/module-protocol-stub.c +module_native_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_NATIVE $(AM_CFLAGS) -DPA_MODULE_NAME=module_native_protocol_unix +module_native_protocol_unix_la_LDFLAGS = $(MODULE_LDFLAGS) +module_native_protocol_unix_la_LIBADD = $(MODULE_LIBADD) libprotocol-native.la +module_native_protocol_fd_la_SOURCES = modules/module-native-protocol-fd.c +module_native_protocol_fd_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_native_protocol_fd +module_native_protocol_fd_la_LDFLAGS = $(MODULE_LDFLAGS) +module_native_protocol_fd_la_LIBADD = $(MODULE_LIBADD) libprotocol-native.la + +# EsounD protocol +@HAVE_ESOUND_TRUE@module_esound_protocol_tcp_la_SOURCES = modules/module-protocol-stub.c +@HAVE_ESOUND_TRUE@module_esound_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_ESOUND $(AM_CFLAGS) -DPA_MODULE_NAME=module_esound_protocol_tcp +@HAVE_ESOUND_TRUE@module_esound_protocol_tcp_la_LDFLAGS = $(MODULE_LDFLAGS) +@HAVE_ESOUND_TRUE@module_esound_protocol_tcp_la_LIBADD = $(MODULE_LIBADD) libprotocol-esound.la +@HAVE_ESOUND_TRUE@module_esound_protocol_unix_la_SOURCES = modules/module-protocol-stub.c +@HAVE_ESOUND_TRUE@module_esound_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_ESOUND $(AM_CFLAGS) -DPA_MODULE_NAME=module_esound_protocol_unix +@HAVE_ESOUND_TRUE@module_esound_protocol_unix_la_LDFLAGS = $(MODULE_LDFLAGS) +@HAVE_ESOUND_TRUE@module_esound_protocol_unix_la_LIBADD = $(MODULE_LIBADD) libprotocol-esound.la +@HAVE_ESOUND_TRUE@module_esound_compat_spawnfd_la_SOURCES = modules/module-esound-compat-spawnfd.c +@HAVE_ESOUND_TRUE@module_esound_compat_spawnfd_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_esound_compat_spawnfd +@HAVE_ESOUND_TRUE@module_esound_compat_spawnfd_la_LDFLAGS = $(MODULE_LDFLAGS) +@HAVE_ESOUND_TRUE@module_esound_compat_spawnfd_la_LIBADD = $(MODULE_LIBADD) +@HAVE_ESOUND_TRUE@module_esound_compat_spawnpid_la_SOURCES = modules/module-esound-compat-spawnpid.c +@HAVE_ESOUND_TRUE@module_esound_compat_spawnpid_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_esound_compat_spawnpid +@HAVE_ESOUND_TRUE@module_esound_compat_spawnpid_la_LDFLAGS = $(MODULE_LDFLAGS) +@HAVE_ESOUND_TRUE@module_esound_compat_spawnpid_la_LIBADD = $(MODULE_LIBADD) +@HAVE_ESOUND_TRUE@module_esound_sink_la_SOURCES = modules/module-esound-sink.c +@HAVE_ESOUND_TRUE@module_esound_sink_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_esound_sink +@HAVE_ESOUND_TRUE@module_esound_sink_la_LDFLAGS = $(MODULE_LDFLAGS) $(WINSOCK_LIBS) +@HAVE_ESOUND_TRUE@module_esound_sink_la_LIBADD = $(MODULE_LIBADD) + +# Pipes +module_pipe_sink_la_SOURCES = modules/module-pipe-sink.c +module_pipe_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_pipe_sink_la_LIBADD = $(MODULE_LIBADD) +module_pipe_sink_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_pipe_sink +module_pipe_source_la_SOURCES = modules/module-pipe-source.c +module_pipe_source_la_LDFLAGS = $(MODULE_LDFLAGS) +module_pipe_source_la_LIBADD = $(MODULE_LIBADD) +module_pipe_source_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_pipe_source + +# Fake sources/sinks +module_sine_la_SOURCES = modules/module-sine.c +module_sine_la_LDFLAGS = $(MODULE_LDFLAGS) +module_sine_la_LIBADD = $(MODULE_LIBADD) +module_sine_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_sine +module_null_sink_la_SOURCES = modules/module-null-sink.c +module_null_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_null_sink_la_LIBADD = $(MODULE_LIBADD) +module_null_sink_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_null_sink +module_null_source_la_SOURCES = modules/module-null-source.c +module_null_source_la_LDFLAGS = $(MODULE_LDFLAGS) +module_null_source_la_LIBADD = $(MODULE_LIBADD) +module_null_source_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_null_source +module_sine_source_la_SOURCES = modules/module-sine-source.c +module_sine_source_la_LDFLAGS = $(MODULE_LDFLAGS) +module_sine_source_la_LIBADD = $(MODULE_LIBADD) +module_sine_source_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_sine_source + +# Couplings +module_combine_la_SOURCES = modules/module-combine.c +module_combine_la_LDFLAGS = $(MODULE_LDFLAGS) +module_combine_la_LIBADD = $(MODULE_LIBADD) +module_combine_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_combine +module_combine_sink_la_SOURCES = modules/module-combine-sink.c +module_combine_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_combine_sink_la_LIBADD = $(MODULE_LIBADD) +module_combine_sink_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_combine_sink +module_switch_on_connect_la_SOURCES = modules/module-switch-on-connect.c +module_switch_on_connect_la_LDFLAGS = $(MODULE_LDFLAGS) +module_switch_on_connect_la_LIBADD = $(MODULE_LIBADD) +module_switch_on_connect_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_switch_on_connect +module_switch_on_port_available_la_SOURCES = modules/module-switch-on-port-available.c +module_switch_on_port_available_la_LDFLAGS = $(MODULE_LDFLAGS) +module_switch_on_port_available_la_LIBADD = $(MODULE_LIBADD) +module_switch_on_port_available_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_switch_on_port_available +module_filter_apply_la_SOURCES = modules/module-filter-apply.c +module_filter_apply_la_LDFLAGS = $(MODULE_LDFLAGS) +module_filter_apply_la_LIBADD = $(MODULE_LIBADD) +module_filter_apply_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_filter_apply +module_filter_heuristics_la_SOURCES = modules/module-filter-heuristics.c +module_filter_heuristics_la_LDFLAGS = $(MODULE_LDFLAGS) +module_filter_heuristics_la_LIBADD = $(MODULE_LIBADD) +module_filter_heuristics_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_filter_heuristics +module_remap_sink_la_SOURCES = modules/module-remap-sink.c +module_remap_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_remap_sink_la_LIBADD = $(MODULE_LIBADD) +module_remap_sink_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_remap_sink +module_remap_source_la_SOURCES = modules/module-remap-source.c +module_remap_source_la_LDFLAGS = $(MODULE_LDFLAGS) +module_remap_source_la_LIBADD = $(MODULE_LIBADD) +module_remap_source_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_remap_source +module_ladspa_sink_la_SOURCES = modules/module-ladspa-sink.c modules/ladspa.h +module_ladspa_sink_la_CFLAGS = -DLADSPA_PATH="$(libdir)/ladspa:/usr/local/lib/ladspa:/usr/lib/ladspa:/usr/local/lib64/ladspa:/usr/lib64/ladspa" \ + $(AM_CFLAGS) $(SERVER_CFLAGS) \ + -DPA_MODULE_NAME=module_ladspa_sink $(am__append_123) +module_ladspa_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_ladspa_sink_la_LIBADD = $(MODULE_LIBADD) $(LIBLTDL) \ + $(am__append_124) +module_equalizer_sink_la_SOURCES = modules/module-equalizer-sink.c +module_equalizer_sink_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) $(DBUS_CFLAGS) $(FFTW_CFLAGS) -DPA_MODULE_NAME=module_equalizer_sink +module_equalizer_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_equalizer_sink_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS) $(FFTW_LIBS) +module_match_la_SOURCES = modules/module-match.c +module_match_la_LDFLAGS = $(MODULE_LDFLAGS) +module_match_la_LIBADD = $(MODULE_LIBADD) +module_match_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_match +module_tunnel_sink_new_la_SOURCES = modules/module-tunnel-sink-new.c +module_tunnel_sink_new_la_LDFLAGS = $(MODULE_LDFLAGS) +module_tunnel_sink_new_la_LIBADD = $(MODULE_LIBADD) +module_tunnel_sink_new_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_tunnel_sink_new +module_tunnel_source_new_la_SOURCES = modules/module-tunnel-source-new.c +module_tunnel_source_new_la_LDFLAGS = $(MODULE_LDFLAGS) +module_tunnel_source_new_la_LIBADD = $(MODULE_LIBADD) +module_tunnel_source_new_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_tunnel_source_new +module_tunnel_sink_la_SOURCES = modules/module-tunnel.c +module_tunnel_sink_la_CFLAGS = -DTUNNEL_SINK=1 $(AM_CFLAGS) $(X11_CFLAGS) -DPA_MODULE_NAME=module_tunnel_sink +module_tunnel_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_tunnel_sink_la_LIBADD = $(MODULE_LIBADD) $(X11_LIBS) +module_tunnel_source_la_SOURCES = modules/module-tunnel.c +module_tunnel_source_la_LDFLAGS = $(MODULE_LDFLAGS) +module_tunnel_source_la_LIBADD = $(MODULE_LIBADD) $(X11_LIBS) +module_tunnel_source_la_CFLAGS = $(AM_CFLAGS) $(X11_CFLAGS) -DPA_MODULE_NAME=module_tunnel_source +module_loopback_la_SOURCES = modules/module-loopback.c +module_loopback_la_LDFLAGS = $(MODULE_LDFLAGS) +module_loopback_la_LIBADD = $(MODULE_LIBADD) +module_loopback_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_loopback +module_virtual_sink_la_SOURCES = modules/module-virtual-sink.c +module_virtual_sink_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) -DPA_MODULE_NAME=module_virtual_sink +module_virtual_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_virtual_sink_la_LIBADD = $(MODULE_LIBADD) +module_virtual_source_la_SOURCES = modules/module-virtual-source.c +module_virtual_source_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) -DPA_MODULE_NAME=module_virtual_source +module_virtual_source_la_LDFLAGS = $(MODULE_LDFLAGS) +module_virtual_source_la_LIBADD = $(MODULE_LIBADD) +module_virtual_surround_sink_la_SOURCES = modules/module-virtual-surround-sink.c +module_virtual_surround_sink_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) -DPA_MODULE_NAME=module_virtual_surround_sink +module_virtual_surround_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_virtual_surround_sink_la_LIBADD = $(MODULE_LIBADD) + +# X11 +module_x11_bell_la_SOURCES = modules/x11/module-x11-bell.c +module_x11_bell_la_CFLAGS = $(AM_CFLAGS) $(X11_CFLAGS) -DPA_MODULE_NAME=module_x11_bell +module_x11_bell_la_LDFLAGS = $(MODULE_LDFLAGS) +module_x11_bell_la_LIBADD = $(MODULE_LIBADD) $(X11_LIBS) +module_x11_publish_la_SOURCES = modules/x11/module-x11-publish.c +module_x11_publish_la_CFLAGS = $(AM_CFLAGS) $(X11_CFLAGS) -DPA_MODULE_NAME=module_x11_publish +module_x11_publish_la_LDFLAGS = $(MODULE_LDFLAGS) +module_x11_publish_la_LIBADD = $(MODULE_LIBADD) libprotocol-native.la $(X11_LIBS) +module_x11_xsmp_la_SOURCES = modules/x11/module-x11-xsmp.c +module_x11_xsmp_la_CFLAGS = $(AM_CFLAGS) $(X11_CFLAGS) -DPA_MODULE_NAME=module_x11_xsmp +module_x11_xsmp_la_LDFLAGS = $(MODULE_LDFLAGS) +module_x11_xsmp_la_LIBADD = $(MODULE_LIBADD) $(X11_LIBS) +module_x11_cork_request_la_SOURCES = modules/x11/module-x11-cork-request.c +module_x11_cork_request_la_CFLAGS = $(AM_CFLAGS) $(X11_CFLAGS) -DPA_MODULE_NAME=module_x11_cork_request +module_x11_cork_request_la_LDFLAGS = $(MODULE_LDFLAGS) +module_x11_cork_request_la_LIBADD = $(MODULE_LIBADD) $(X11_LIBS) + +# OSS +liboss_util_la_SOURCES = modules/oss/oss-util.c modules/oss/oss-util.h +liboss_util_la_LDFLAGS = -avoid-version +liboss_util_la_LIBADD = $(MODULE_LIBADD) +module_oss_la_SOURCES = modules/oss/module-oss.c +module_oss_la_LDFLAGS = $(MODULE_LDFLAGS) +module_oss_la_LIBADD = $(MODULE_LIBADD) liboss-util.la +module_oss_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_oss + +# COREAUDIO +module_coreaudio_detect_la_SOURCES = modules/macosx/module-coreaudio-detect.c +module_coreaudio_detect_la_LDFLAGS = $(MODULE_LDFLAGS) \ + -Wl,-framework -Wl,Cocoa -framework CoreAudio \ + -Wl,-framework -Wl,AudioUnit -framework AudioUnit + +module_coreaudio_detect_la_LIBADD = $(MODULE_LIBADD) +module_coreaudio_detect_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_coreaudio_detect +module_coreaudio_device_la_SOURCES = modules/macosx/module-coreaudio-device.c +module_coreaudio_device_la_LDFLAGS = $(MODULE_LDFLAGS) \ + -Wl,-framework -Wl,Cocoa -framework CoreAudio \ + -Wl,-framework -Wl,AudioUnit -framework AudioUnit + +module_coreaudio_device_la_LIBADD = $(MODULE_LIBADD) +module_coreaudio_device_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_coreaudio_device + +# ALSA +libalsa_util_la_SOURCES = modules/alsa/alsa-util.c \ + modules/alsa/alsa-util.h modules/alsa/alsa-ucm.c \ + modules/alsa/alsa-ucm.h modules/alsa/alsa-mixer.c \ + modules/alsa/alsa-mixer.h modules/alsa/alsa-sink.c \ + modules/alsa/alsa-sink.h modules/alsa/alsa-source.c \ + modules/alsa/alsa-source.h modules/reserve-wrap.c \ + modules/reserve-wrap.h $(am__append_125) $(am__append_128) +libalsa_util_la_LDFLAGS = -avoid-version +libalsa_util_la_LIBADD = $(MODULE_LIBADD) $(ASOUNDLIB_LIBS) \ + $(am__append_126) $(am__append_129) +libalsa_util_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) \ + $(ASOUNDLIB_CFLAGS) $(am__append_127) $(am__append_130) +module_alsa_sink_la_SOURCES = modules/alsa/module-alsa-sink.c +module_alsa_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_alsa_sink_la_LIBADD = $(MODULE_LIBADD) $(ASOUNDLIB_LIBS) libalsa-util.la +module_alsa_sink_la_CFLAGS = $(AM_CFLAGS) $(ASOUNDLIB_CFLAGS) -DPA_MODULE_NAME=module_alsa_sink +module_alsa_source_la_SOURCES = modules/alsa/module-alsa-source.c +module_alsa_source_la_LDFLAGS = $(MODULE_LDFLAGS) +module_alsa_source_la_LIBADD = $(MODULE_LIBADD) $(ASOUNDLIB_LIBS) libalsa-util.la +module_alsa_source_la_CFLAGS = $(AM_CFLAGS) $(ASOUNDLIB_CFLAGS) -DPA_MODULE_NAME=module_alsa_source +module_alsa_card_la_SOURCES = modules/alsa/module-alsa-card.c +module_alsa_card_la_LDFLAGS = $(MODULE_LDFLAGS) +module_alsa_card_la_LIBADD = $(MODULE_LIBADD) $(ASOUNDLIB_LIBS) libalsa-util.la +module_alsa_card_la_CFLAGS = $(AM_CFLAGS) $(ASOUNDLIB_CFLAGS) -DPA_MODULE_NAME=module_alsa_card + +# Solaris +module_solaris_la_SOURCES = modules/module-solaris.c +module_solaris_la_LDFLAGS = $(MODULE_LDFLAGS) +module_solaris_la_LIBADD = $(MODULE_LIBADD) +module_solaris_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_solaris + +# Avahi +module_zeroconf_publish_la_SOURCES = modules/module-zeroconf-publish.c +module_zeroconf_publish_la_LDFLAGS = $(MODULE_LDFLAGS) +module_zeroconf_publish_la_LIBADD = $(MODULE_LIBADD) $(AVAHI_LIBS) $(DBUS_LIBS) libavahi-wrap.la libprotocol-native.la +module_zeroconf_publish_la_CFLAGS = $(AM_CFLAGS) $(AVAHI_CFLAGS) $(DBUS_CFLAGS) -DPA_MODULE_NAME=module_zeroconf_publish +module_zeroconf_discover_la_SOURCES = modules/module-zeroconf-discover.c +module_zeroconf_discover_la_LDFLAGS = $(MODULE_LDFLAGS) +module_zeroconf_discover_la_LIBADD = $(MODULE_LIBADD) $(AVAHI_LIBS) libavahi-wrap.la +module_zeroconf_discover_la_CFLAGS = $(AM_CFLAGS) $(AVAHI_CFLAGS) -DPA_MODULE_NAME=module_zeroconf_discover + +# Bonjour +module_bonjour_publish_la_SOURCES = modules/macosx/module-bonjour-publish.c +module_bonjour_publish_la_LDFLAGS = $(MODULE_LDFLAGS) \ + -Wl,-framework -Wl,CoreFoundation -framework CoreFoundation + +module_bonjour_publish_la_LIBADD = $(MODULE_LIBADD) libprotocol-native.la +module_bonjour_publish_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_bonjour_publish + +# LIRC +module_lirc_la_SOURCES = modules/module-lirc.c +module_lirc_la_LDFLAGS = $(MODULE_LDFLAGS) +module_lirc_la_LIBADD = $(MODULE_LIBADD) $(LIRC_LIBS) +module_lirc_la_CFLAGS = $(AM_CFLAGS) $(LIRC_CFLAGS) -DPA_MODULE_NAME=module_lirc + +# Linux evdev +module_mmkbd_evdev_la_SOURCES = modules/module-mmkbd-evdev.c +module_mmkbd_evdev_la_LDFLAGS = $(MODULE_LDFLAGS) +module_mmkbd_evdev_la_LIBADD = $(MODULE_LIBADD) +module_mmkbd_evdev_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_mmkbd_evdev + +# Windows waveout +module_waveout_la_SOURCES = modules/module-waveout.c +module_waveout_la_LDFLAGS = $(MODULE_LDFLAGS) +module_waveout_la_LIBADD = $(MODULE_LIBADD) -lwinmm +module_waveout_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_waveout + +# Hardware autodetection module +module_detect_la_SOURCES = modules/module-detect.c +module_detect_la_LDFLAGS = $(MODULE_LDFLAGS) +module_detect_la_LIBADD = $(MODULE_LIBADD) +module_detect_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_detect + +# Volume restore module +module_volume_restore_la_SOURCES = modules/module-volume-restore.c +module_volume_restore_la_LDFLAGS = $(MODULE_LDFLAGS) +module_volume_restore_la_LIBADD = $(MODULE_LIBADD) +module_volume_restore_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_volume_restore + +# Position event sounds in space +module_position_event_sounds_la_SOURCES = modules/module-position-event-sounds.c +module_position_event_sounds_la_LDFLAGS = $(MODULE_LDFLAGS) +module_position_event_sounds_la_LIBADD = $(MODULE_LIBADD) +module_position_event_sounds_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_position_event_sounds + +# Ducking effect based on stream roles +module_role_ducking_la_SOURCES = modules/module-role-ducking.c \ + modules/stream-interaction.c modules/stream-interaction.h + +module_role_ducking_la_LDFLAGS = $(MODULE_LDFLAGS) +module_role_ducking_la_LIBADD = $(MODULE_LIBADD) +module_role_ducking_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_role_ducking + +# Augment properties from XDG .desktop files +module_augment_properties_la_SOURCES = modules/module-augment-properties.c +module_augment_properties_la_LDFLAGS = $(MODULE_LDFLAGS) +module_augment_properties_la_LIBADD = $(MODULE_LIBADD) +#module_augment_properties_la_CFLAGS = $(AM_CFLAGS) -DDESKTOPFILEDIR=\"$(datadir)/applications\" +module_augment_properties_la_CFLAGS = $(AM_CFLAGS) -DDESKTOPFILEDIR=\"/usr/share/applications\" -DPA_MODULE_NAME=module_augment_properties + +# Cork certain streams while others are active (e.g. cork music when phone streams appear) +module_role_cork_la_SOURCES = modules/module-role-cork.c \ + modules/stream-interaction.c modules/stream-interaction.h + +module_role_cork_la_LDFLAGS = $(MODULE_LDFLAGS) +module_role_cork_la_LIBADD = $(MODULE_LIBADD) +module_role_cork_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_role_cork + +# Device description restore module +module_device_manager_la_SOURCES = modules/module-device-manager.c +module_device_manager_la_LDFLAGS = $(MODULE_LDFLAGS) +module_device_manager_la_LIBADD = $(MODULE_LIBADD) libprotocol-native.la +module_device_manager_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_device_manager + +# Device volume/muted restore module +module_device_restore_la_SOURCES = modules/module-device-restore.c +module_device_restore_la_LDFLAGS = $(MODULE_LDFLAGS) +module_device_restore_la_LIBADD = $(MODULE_LIBADD) \ + libprotocol-native.la $(am__append_131) +module_device_restore_la_CFLAGS = $(AM_CFLAGS) \ + -DPA_MODULE_NAME=module_device_restore $(am__append_132) + +# Stream volume/muted/device restore module +module_stream_restore_la_SOURCES = modules/module-stream-restore.c +module_stream_restore_la_LDFLAGS = $(MODULE_LDFLAGS) +module_stream_restore_la_LIBADD = $(MODULE_LIBADD) \ + libprotocol-native.la $(am__append_133) +module_stream_restore_la_CFLAGS = $(AM_CFLAGS) \ + -DPA_MODULE_NAME=module_stream_restore $(am__append_134) + +# Card profile restore module +module_card_restore_la_SOURCES = modules/module-card-restore.c +module_card_restore_la_LDFLAGS = $(MODULE_LDFLAGS) +module_card_restore_la_LIBADD = $(MODULE_LIBADD) +module_card_restore_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_card_restore + +# Default sink/source restore module +module_default_device_restore_la_SOURCES = modules/module-default-device-restore.c +module_default_device_restore_la_LDFLAGS = $(MODULE_LDFLAGS) +module_default_device_restore_la_LIBADD = $(MODULE_LIBADD) +module_default_device_restore_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_default_device_restore + +# Always Sink module +module_always_sink_la_SOURCES = modules/module-always-sink.c +module_always_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_always_sink_la_LIBADD = $(MODULE_LIBADD) +module_always_sink_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_always_sink + +# Always Source module +module_always_source_la_SOURCES = modules/module-always-source.c +module_always_source_la_LDFLAGS = $(MODULE_LDFLAGS) +module_always_source_la_LIBADD = $(MODULE_LIBADD) +module_always_source_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_always_source + +# Rescue streams module +module_rescue_streams_la_SOURCES = modules/module-rescue-streams.c +module_rescue_streams_la_LDFLAGS = $(MODULE_LDFLAGS) +module_rescue_streams_la_LIBADD = $(MODULE_LIBADD) +module_rescue_streams_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_rescue_streams + +# Automatically move streams to devices that are intended for their roles +module_intended_roles_la_SOURCES = modules/module-intended-roles.c +module_intended_roles_la_LDFLAGS = $(MODULE_LDFLAGS) +module_intended_roles_la_LIBADD = $(MODULE_LIBADD) +module_intended_roles_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_intended_roles + +# Suspend-on-idle module +module_suspend_on_idle_la_SOURCES = modules/module-suspend-on-idle.c +module_suspend_on_idle_la_LDFLAGS = $(MODULE_LDFLAGS) +module_suspend_on_idle_la_LIBADD = $(MODULE_LIBADD) +module_suspend_on_idle_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_suspend_on_idle + +# echo-cancel module +module_echo_cancel_la_SOURCES = \ + modules/echo-cancel/module-echo-cancel.c \ + modules/echo-cancel/null.c modules/echo-cancel/echo-cancel.h \ + $(am__append_135) $(am__append_140) +module_echo_cancel_la_LDFLAGS = $(MODULE_LDFLAGS) +module_echo_cancel_la_LIBADD = $(MODULE_LIBADD) $(am__append_138) \ + $(am__append_142) $(am__append_144) +module_echo_cancel_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) \ + -DPA_MODULE_NAME=module_echo_cancel $(am__append_136) \ + $(am__append_139) $(am__append_141) $(am__append_143) +@HAVE_ADRIAN_EC_TRUE@@HAVE_ORC_TRUE@nodist_module_echo_cancel_la_SOURCES = \ +@HAVE_ADRIAN_EC_TRUE@@HAVE_ORC_TRUE@ modules/echo-cancel/adrian-aec-orc-gen.c \ +@HAVE_ADRIAN_EC_TRUE@@HAVE_ORC_TRUE@ modules/echo-cancel/adrian-aec-orc-gen.h + +# The webrtc code is split off into a helper library to avoid having automake +# link module-echo-cancel with C++ (which it does if there are any C++ deps, +# even conditional ones). +@HAVE_WEBRTC_TRUE@libwebrtc_util_la_SOURCES = modules/echo-cancel/webrtc.cc +@HAVE_WEBRTC_TRUE@libwebrtc_util_la_CXXFLAGS = $(AM_CXXFLAGS) $(SERVER_CFLAGS) $(WEBRTC_CFLAGS) -DHAVE_WEBRTC=1 +@HAVE_WEBRTC_TRUE@libwebrtc_util_la_LIBADD = libpulsecore-@PA_MAJORMINOR@.la $(WEBRTC_LIBS) +@HAVE_WEBRTC_TRUE@libwebrtc_util_la_LDFLAGS = -avoid-version + +# RTP modules +module_rtp_send_la_SOURCES = modules/rtp/module-rtp-send.c +module_rtp_send_la_LDFLAGS = $(MODULE_LDFLAGS) +module_rtp_send_la_LIBADD = $(MODULE_LIBADD) librtp.la +module_rtp_send_la_CFLAGS = $(AM_CFLAGS) $(GSTREAMER_CFLAGS) -DPA_MODULE_NAME=module_rtp_send +module_rtp_recv_la_SOURCES = modules/rtp/module-rtp-recv.c +module_rtp_recv_la_LDFLAGS = $(MODULE_LDFLAGS) +module_rtp_recv_la_LIBADD = $(MODULE_LIBADD) librtp.la +module_rtp_recv_la_CFLAGS = $(AM_CFLAGS) $(GSTREAMER_CFLAGS) -DPA_MODULE_NAME=module_rtp_recv + +# JACK +module_jackdbus_detect_la_SOURCES = modules/jack/module-jackdbus-detect.c +module_jackdbus_detect_la_LDFLAGS = $(MODULE_LDFLAGS) +module_jackdbus_detect_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS) $(JACK_LIBS) +module_jackdbus_detect_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) $(JACK_CFLAGS) -DPA_MODULE_NAME=module_jackdbus_detect +module_jack_sink_la_SOURCES = modules/jack/module-jack-sink.c +module_jack_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_jack_sink_la_LIBADD = $(MODULE_LIBADD) $(JACK_LIBS) +module_jack_sink_la_CFLAGS = $(AM_CFLAGS) $(JACK_CFLAGS) -DPA_MODULE_NAME=module_jack_sink +module_jack_source_la_SOURCES = modules/jack/module-jack-source.c +module_jack_source_la_LDFLAGS = $(MODULE_LDFLAGS) +module_jack_source_la_LIBADD = $(MODULE_LIBADD) $(JACK_LIBS) +module_jack_source_la_CFLAGS = $(AM_CFLAGS) $(JACK_CFLAGS) -DPA_MODULE_NAME=module_jack_source +module_hal_detect_la_SOURCES = modules/module-hal-detect-compat.c +module_hal_detect_la_LIBADD = $(MODULE_LIBADD) +module_hal_detect_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_hal_detect +module_hal_detect_la_LDFLAGS = $(MODULE_LDFLAGS) +module_udev_detect_la_SOURCES = modules/module-udev-detect.c +module_udev_detect_la_LDFLAGS = $(MODULE_LDFLAGS) +module_udev_detect_la_LIBADD = $(MODULE_LIBADD) $(UDEV_LIBS) +module_udev_detect_la_CFLAGS = $(AM_CFLAGS) $(UDEV_CFLAGS) -DPA_MODULE_NAME=module_udev_detect +module_console_kit_la_SOURCES = modules/module-console-kit.c +module_console_kit_la_LDFLAGS = $(MODULE_LDFLAGS) +module_console_kit_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS) +module_console_kit_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) -DPA_MODULE_NAME=module_console_kit +module_systemd_login_la_SOURCES = modules/module-systemd-login.c +module_systemd_login_la_LDFLAGS = $(MODULE_LDFLAGS) +module_systemd_login_la_LIBADD = $(MODULE_LIBADD) $(SYSTEMD_LIBS) $(SYSTEMDLOGIN_LIBS) +module_systemd_login_la_CFLAGS = $(AM_CFLAGS) $(SYSTEMD_CFLAGS) $(SYSTEMDLOGIN_CFLAGS) -DPA_MODULE_NAME=module_systemd_login + +# GConf support +module_gconf_la_SOURCES = \ + modules/stdin-util.c modules/stdin-util.h \ + modules/gconf/module-gconf.c + +module_gconf_la_LDFLAGS = $(MODULE_LDFLAGS) +module_gconf_la_LIBADD = $(MODULE_LIBADD) +module_gconf_la_CFLAGS = $(AM_CFLAGS) -DPA_GCONF_HELPER=\"$(pulselibexecdir)/gconf-helper\" -DPA_MODULE_NAME=module_gconf +gconf_helper_SOURCES = modules/gconf/gconf-helper.c +gconf_helper_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la $(GCONF_LIBS) +gconf_helper_CFLAGS = $(AM_CFLAGS) $(GCONF_CFLAGS) +gconf_helper_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) + +# GSettings support +module_gsettings_la_SOURCES = \ + modules/stdin-util.c modules/stdin-util.h \ + modules/gsettings/module-gsettings.c + +module_gsettings_la_LDFLAGS = $(MODULE_LDFLAGS) +module_gsettings_la_LIBADD = $(MODULE_LIBADD) +module_gsettings_la_CFLAGS = $(AM_CFLAGS) -DPA_GSETTINGS_HELPER=\"$(pulselibexecdir)/gsettings-helper\" -DPA_MODULE_NAME=module_gsettings +gsettings_helper_SOURCES = modules/gsettings/gsettings-helper.c +gsettings_helper_LDADD = $(AM_LDADD) libpulsecore-@PA_MAJORMINOR@.la libpulsecommon-@PA_MAJORMINOR@.la libpulse.la $(GSETTINGS_LIBS) +gsettings_helper_CFLAGS = $(AM_CFLAGS) $(GSETTINGS_CFLAGS) +gsettings_helper_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) +@HAVE_GSETTINGS_TRUE@gsettings_SCHEMAS = modules/gsettings/org.freedesktop.pulseaudio.gschema.xml + +# Bluetooth policy +module_bluetooth_policy_la_SOURCES = modules/bluetooth/module-bluetooth-policy.c +module_bluetooth_policy_la_LDFLAGS = $(MODULE_LDFLAGS) +module_bluetooth_policy_la_LIBADD = $(MODULE_LIBADD) +module_bluetooth_policy_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) -DPA_MODULE_NAME=module_bluetooth_policy + +# Bluetooth discover +module_bluetooth_discover_la_SOURCES = modules/bluetooth/module-bluetooth-discover.c +module_bluetooth_discover_la_LDFLAGS = $(MODULE_LDFLAGS) +module_bluetooth_discover_la_LIBADD = $(MODULE_LIBADD) +module_bluetooth_discover_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_bluetooth_discover + +# Bluetooth BlueZ 5 sink / source +libbluez5_util_la_SOURCES = modules/bluetooth/bluez5-util.c \ + modules/bluetooth/bluez5-util.h \ + modules/bluetooth/a2dp-codec-api.h \ + modules/bluetooth/a2dp-codec-util.c \ + modules/bluetooth/a2dp-codec-util.h \ + modules/bluetooth/a2dp-codecs.h modules/bluetooth/rtp.h \ + $(am__append_145) $(am__append_146) \ + modules/bluetooth/a2dp-codec-sbc.c +libbluez5_util_la_LDFLAGS = -avoid-version +libbluez5_util_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS) $(SBC_LIBS) +libbluez5_util_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) $(SBC_CFLAGS) +libbluez5_util_la_CPPFLAGS = $(AM_CPPFLAGS) +module_bluez5_discover_la_SOURCES = modules/bluetooth/module-bluez5-discover.c +module_bluez5_discover_la_LDFLAGS = $(MODULE_LDFLAGS) +module_bluez5_discover_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS) libbluez5-util.la +module_bluez5_discover_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) -DPA_MODULE_NAME=module_bluez5_discover +module_bluez5_device_la_SOURCES = modules/bluetooth/module-bluez5-device.c +module_bluez5_device_la_LDFLAGS = $(MODULE_LDFLAGS) +module_bluez5_device_la_LIBADD = $(MODULE_LIBADD) libbluez5-util.la +module_bluez5_device_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_bluez5_device + +# Apple Airtunes/RAOP +module_raop_sink_la_SOURCES = modules/raop/module-raop-sink.c +module_raop_sink_la_LDFLAGS = $(MODULE_LDFLAGS) +module_raop_sink_la_LIBADD = $(MODULE_LIBADD) librtp.la libraop.la +module_raop_sink_la_CFLAGS = $(AM_CFLAGS) -I$(top_srcdir)/src/modules/rtp -DPA_MODULE_NAME=module_raop_sink +module_raop_discover_la_SOURCES = modules/raop/module-raop-discover.c +module_raop_discover_la_LDFLAGS = $(MODULE_LDFLAGS) +module_raop_discover_la_LIBADD = $(MODULE_LIBADD) $(AVAHI_LIBS) libavahi-wrap.la +module_raop_discover_la_CFLAGS = $(AM_CFLAGS) $(AVAHI_CFLAGS) -DPA_MODULE_NAME=module_raop_discover + +# Rygel +module_rygel_media_server_la_SOURCES = modules/module-rygel-media-server.c +module_rygel_media_server_la_LDFLAGS = $(MODULE_LDFLAGS) +module_rygel_media_server_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS) libprotocol-http.la +module_rygel_media_server_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) -DPA_MODULE_NAME=module_rygel_media_server + +# Allow passthrough module +module_allow_passthrough_la_SOURCES = modules/module-allow-passthrough.c +module_allow_passthrough_la_LDFLAGS = $(MODULE_LDFLAGS) +module_allow_passthrough_la_LIBADD = $(MODULE_LIBADD) +module_allow_passthrough_la_CFLAGS = $(AM_CFLAGS) -DPA_MODULE_NAME=module_allow_passthrough +DISTCLEANFILES = esdcompat client.conf default.pa system.pa daemon.conf start-pulseaudio-x11 pulseaudio.service +@OS_IS_WIN32_FALSE@SYMLINK_PROGRAM = ln -sf +@OS_IS_WIN32_TRUE@SYMLINK_PROGRAM = cd $(DESTDIR)$(bindir) && cp + +# Force installation order of libraries. libtool relinks on install time, in +# which case libpulsecommon has to be installed before others, but the padsp +# preload library has to be done after the normal libraries (e.g. libpulse) +# ... +# Unfortunately automake behaviour means that rules without commands also +# override build-in rules, so it's not trivial to add dependencies. +# See http://debbugs.gnu.org/cgi/bugreport.cgi?bug=7328 for the workaround +# ... +# Isn't libtool/autotools fun! +installlibLTLIBRARIES = install-libLTLIBRARIES +installpkglibLTLIBRARIES = install-pkglibLTLIBRARIES +installmodlibexecLTLIBRARIES = install-modlibexecLTLIBRARIES +installpadsplibLTLIBRARIES = install-padsplibLTLIBRARIES +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .cc .lo .log .o .obj .test .test$(EXEEXT) .trs +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/orc.mak $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/orc.mak $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +esdcompat: $(top_builddir)/config.status $(top_srcdir)/src/daemon/esdcompat.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +start-pulseaudio-x11: $(top_builddir)/config.status $(top_srcdir)/src/daemon/start-pulseaudio-x11.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +client.conf: $(top_builddir)/config.status $(top_srcdir)/src/pulse/client.conf.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +daemon.conf: $(top_builddir)/config.status $(top_srcdir)/src/daemon/daemon.conf.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +default.pa: $(top_builddir)/config.status $(top_srcdir)/src/daemon/default.pa.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +system.pa: $(top_builddir)/config.status $(top_srcdir)/src/daemon/system.pa.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +pulseaudio.service: $(top_builddir)/config.status $(top_srcdir)/src/daemon/systemd/user/pulseaudio.service.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +clean-checkPROGRAMS: + @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +install-pulselibexecPROGRAMS: $(pulselibexec_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(pulselibexec_PROGRAMS)'; test -n "$(pulselibexecdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pulselibexecdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pulselibexecdir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + || test -f $$p1 \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(pulselibexecdir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(pulselibexecdir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-pulselibexecPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(pulselibexec_PROGRAMS)'; test -n "$(pulselibexecdir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(pulselibexecdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(pulselibexecdir)" && rm -f $$files + +clean-pulselibexecPROGRAMS: + @list='$(pulselibexec_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list + +install-commonlibLTLIBRARIES: $(commonlib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(commonlib_LTLIBRARIES)'; test -n "$(commonlibdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(commonlibdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(commonlibdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(commonlibdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(commonlibdir)"; \ + } + +uninstall-commonlibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(commonlib_LTLIBRARIES)'; test -n "$(commonlibdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(commonlibdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(commonlibdir)/$$f"; \ + done + +clean-commonlibLTLIBRARIES: + -test -z "$(commonlib_LTLIBRARIES)" || rm -f $(commonlib_LTLIBRARIES) + @list='$(commonlib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +install-modlibexecLTLIBRARIES: $(modlibexec_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(modlibexec_LTLIBRARIES)'; test -n "$(modlibexecdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(modlibexecdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(modlibexecdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(modlibexecdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(modlibexecdir)"; \ + } + +uninstall-modlibexecLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(modlibexec_LTLIBRARIES)'; test -n "$(modlibexecdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(modlibexecdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(modlibexecdir)/$$f"; \ + done + +clean-modlibexecLTLIBRARIES: + -test -z "$(modlibexec_LTLIBRARIES)" || rm -f $(modlibexec_LTLIBRARIES) + @list='$(modlibexec_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +install-padsplibLTLIBRARIES: $(padsplib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(padsplib_LTLIBRARIES)'; test -n "$(padsplibdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(padsplibdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(padsplibdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(padsplibdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(padsplibdir)"; \ + } + +uninstall-padsplibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(padsplib_LTLIBRARIES)'; test -n "$(padsplibdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(padsplibdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(padsplibdir)/$$f"; \ + done + +clean-padsplibLTLIBRARIES: + -test -z "$(padsplib_LTLIBRARIES)" || rm -f $(padsplib_LTLIBRARIES) + @list='$(padsplib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \ + } + +uninstall-pkglibLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \ + done + +clean-pkglibLTLIBRARIES: + -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES) + @list='$(pkglib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } +modules/alsa/$(am__dirstamp): + @$(MKDIR_P) modules/alsa + @: > modules/alsa/$(am__dirstamp) +modules/alsa/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) modules/alsa/$(DEPDIR) + @: > modules/alsa/$(DEPDIR)/$(am__dirstamp) +modules/alsa/libalsa_util_la-alsa-util.lo: \ + modules/alsa/$(am__dirstamp) \ + modules/alsa/$(DEPDIR)/$(am__dirstamp) +modules/alsa/libalsa_util_la-alsa-ucm.lo: \ + modules/alsa/$(am__dirstamp) \ + modules/alsa/$(DEPDIR)/$(am__dirstamp) +modules/alsa/libalsa_util_la-alsa-mixer.lo: \ + modules/alsa/$(am__dirstamp) \ + modules/alsa/$(DEPDIR)/$(am__dirstamp) +modules/alsa/libalsa_util_la-alsa-sink.lo: \ + modules/alsa/$(am__dirstamp) \ + modules/alsa/$(DEPDIR)/$(am__dirstamp) +modules/alsa/libalsa_util_la-alsa-source.lo: \ + modules/alsa/$(am__dirstamp) \ + modules/alsa/$(DEPDIR)/$(am__dirstamp) +modules/$(am__dirstamp): + @$(MKDIR_P) modules + @: > modules/$(am__dirstamp) +modules/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) modules/$(DEPDIR) + @: > modules/$(DEPDIR)/$(am__dirstamp) +modules/libalsa_util_la-reserve-wrap.lo: modules/$(am__dirstamp) \ + modules/$(DEPDIR)/$(am__dirstamp) +modules/libalsa_util_la-udev-util.lo: modules/$(am__dirstamp) \ + modules/$(DEPDIR)/$(am__dirstamp) +modules/libalsa_util_la-reserve.lo: modules/$(am__dirstamp) \ + modules/$(DEPDIR)/$(am__dirstamp) +modules/libalsa_util_la-reserve-monitor.lo: modules/$(am__dirstamp) \ + modules/$(DEPDIR)/$(am__dirstamp) + +libalsa-util.la: $(libalsa_util_la_OBJECTS) $(libalsa_util_la_DEPENDENCIES) $(EXTRA_libalsa_util_la_DEPENDENCIES) + $(AM_V_CCLD)$(libalsa_util_la_LINK) $(am_libalsa_util_la_rpath) $(libalsa_util_la_OBJECTS) $(libalsa_util_la_LIBADD) $(LIBS) +pulsecore/$(am__dirstamp): + @$(MKDIR_P) pulsecore + @: > pulsecore/$(am__dirstamp) +pulsecore/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) pulsecore/$(DEPDIR) + @: > pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libavahi_wrap_la-avahi-wrap.lo: pulsecore/$(am__dirstamp) \ + pulsecore/$(DEPDIR)/$(am__dirstamp) + +libavahi-wrap.la: $(libavahi_wrap_la_OBJECTS) $(libavahi_wrap_la_DEPENDENCIES) $(EXTRA_libavahi_wrap_la_DEPENDENCIES) + $(AM_V_CCLD)$(libavahi_wrap_la_LINK) $(am_libavahi_wrap_la_rpath) $(libavahi_wrap_la_OBJECTS) $(libavahi_wrap_la_LIBADD) $(LIBS) +modules/bluetooth/$(am__dirstamp): + @$(MKDIR_P) modules/bluetooth + @: > modules/bluetooth/$(am__dirstamp) +modules/bluetooth/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) modules/bluetooth/$(DEPDIR) + @: > modules/bluetooth/$(DEPDIR)/$(am__dirstamp) +modules/bluetooth/libbluez5_util_la-bluez5-util.lo: \ + modules/bluetooth/$(am__dirstamp) \ + modules/bluetooth/$(DEPDIR)/$(am__dirstamp) +modules/bluetooth/libbluez5_util_la-a2dp-codec-util.lo: \ + modules/bluetooth/$(am__dirstamp) \ + modules/bluetooth/$(DEPDIR)/$(am__dirstamp) +modules/bluetooth/libbluez5_util_la-backend-ofono.lo: \ + modules/bluetooth/$(am__dirstamp) \ + modules/bluetooth/$(DEPDIR)/$(am__dirstamp) +modules/bluetooth/libbluez5_util_la-backend-native.lo: \ + modules/bluetooth/$(am__dirstamp) \ + modules/bluetooth/$(DEPDIR)/$(am__dirstamp) +modules/bluetooth/libbluez5_util_la-a2dp-codec-sbc.lo: \ + modules/bluetooth/$(am__dirstamp) \ + modules/bluetooth/$(DEPDIR)/$(am__dirstamp) + +libbluez5-util.la: $(libbluez5_util_la_OBJECTS) $(libbluez5_util_la_DEPENDENCIES) $(EXTRA_libbluez5_util_la_DEPENDENCIES) + $(AM_V_CCLD)$(libbluez5_util_la_LINK) $(am_libbluez5_util_la_rpath) $(libbluez5_util_la_OBJECTS) $(libbluez5_util_la_LIBADD) $(LIBS) +pulsecore/cli.lo: pulsecore/$(am__dirstamp) \ + pulsecore/$(DEPDIR)/$(am__dirstamp) + +libcli.la: $(libcli_la_OBJECTS) $(libcli_la_DEPENDENCIES) $(EXTRA_libcli_la_DEPENDENCIES) + $(AM_V_CCLD)$(libcli_la_LINK) -rpath $(modlibexecdir) $(libcli_la_OBJECTS) $(libcli_la_LIBADD) $(LIBS) +tests/$(am__dirstamp): + @$(MKDIR_P) tests + @: > tests/$(am__dirstamp) +tests/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) tests/$(DEPDIR) + @: > tests/$(DEPDIR)/$(am__dirstamp) +tests/lo-test-util.lo: tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +liblo-test-util.la: $(liblo_test_util_la_OBJECTS) $(liblo_test_util_la_DEPENDENCIES) $(EXTRA_liblo_test_util_la_DEPENDENCIES) + $(AM_V_CCLD)$(liblo_test_util_la_LINK) $(liblo_test_util_la_OBJECTS) $(liblo_test_util_la_LIBADD) $(LIBS) +modules/oss/$(am__dirstamp): + @$(MKDIR_P) modules/oss + @: > modules/oss/$(am__dirstamp) +modules/oss/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) modules/oss/$(DEPDIR) + @: > modules/oss/$(DEPDIR)/$(am__dirstamp) +modules/oss/oss-util.lo: modules/oss/$(am__dirstamp) \ + modules/oss/$(DEPDIR)/$(am__dirstamp) + +liboss-util.la: $(liboss_util_la_OBJECTS) $(liboss_util_la_DEPENDENCIES) $(EXTRA_liboss_util_la_DEPENDENCIES) + $(AM_V_CCLD)$(liboss_util_la_LINK) $(am_liboss_util_la_rpath) $(liboss_util_la_OBJECTS) $(liboss_util_la_LIBADD) $(LIBS) +pulsecore/protocol-cli.lo: pulsecore/$(am__dirstamp) \ + pulsecore/$(DEPDIR)/$(am__dirstamp) + +libprotocol-cli.la: $(libprotocol_cli_la_OBJECTS) $(libprotocol_cli_la_DEPENDENCIES) $(EXTRA_libprotocol_cli_la_DEPENDENCIES) + $(AM_V_CCLD)$(libprotocol_cli_la_LINK) -rpath $(modlibexecdir) $(libprotocol_cli_la_OBJECTS) $(libprotocol_cli_la_LIBADD) $(LIBS) +pulsecore/protocol-esound.lo: pulsecore/$(am__dirstamp) \ + pulsecore/$(DEPDIR)/$(am__dirstamp) + +libprotocol-esound.la: $(libprotocol_esound_la_OBJECTS) $(libprotocol_esound_la_DEPENDENCIES) $(EXTRA_libprotocol_esound_la_DEPENDENCIES) + $(AM_V_CCLD)$(libprotocol_esound_la_LINK) $(am_libprotocol_esound_la_rpath) $(libprotocol_esound_la_OBJECTS) $(libprotocol_esound_la_LIBADD) $(LIBS) +pulsecore/protocol-http.lo: pulsecore/$(am__dirstamp) \ + pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/mime-type.lo: pulsecore/$(am__dirstamp) \ + pulsecore/$(DEPDIR)/$(am__dirstamp) + +libprotocol-http.la: $(libprotocol_http_la_OBJECTS) $(libprotocol_http_la_DEPENDENCIES) $(EXTRA_libprotocol_http_la_DEPENDENCIES) + $(AM_V_CCLD)$(libprotocol_http_la_LINK) -rpath $(modlibexecdir) $(libprotocol_http_la_OBJECTS) $(libprotocol_http_la_LIBADD) $(LIBS) +pulsecore/libprotocol_native_la-protocol-native.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) + +libprotocol-native.la: $(libprotocol_native_la_OBJECTS) $(libprotocol_native_la_DEPENDENCIES) $(EXTRA_libprotocol_native_la_DEPENDENCIES) + $(AM_V_CCLD)$(libprotocol_native_la_LINK) -rpath $(modlibexecdir) $(libprotocol_native_la_OBJECTS) $(libprotocol_native_la_LIBADD) $(LIBS) +pulsecore/protocol-simple.lo: pulsecore/$(am__dirstamp) \ + pulsecore/$(DEPDIR)/$(am__dirstamp) + +libprotocol-simple.la: $(libprotocol_simple_la_OBJECTS) $(libprotocol_simple_la_DEPENDENCIES) $(EXTRA_libprotocol_simple_la_DEPENDENCIES) + $(AM_V_CCLD)$(libprotocol_simple_la_LINK) -rpath $(modlibexecdir) $(libprotocol_simple_la_OBJECTS) $(libprotocol_simple_la_LIBADD) $(LIBS) +pulse/$(am__dirstamp): + @$(MKDIR_P) pulse + @: > pulse/$(am__dirstamp) +pulse/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) pulse/$(DEPDIR) + @: > pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_mainloop_glib_la-glib-mainloop.lo: \ + pulse/$(am__dirstamp) pulse/$(DEPDIR)/$(am__dirstamp) + +libpulse-mainloop-glib.la: $(libpulse_mainloop_glib_la_OBJECTS) $(libpulse_mainloop_glib_la_DEPENDENCIES) $(EXTRA_libpulse_mainloop_glib_la_DEPENDENCIES) + $(AM_V_CCLD)$(libpulse_mainloop_glib_la_LINK) $(am_libpulse_mainloop_glib_la_rpath) $(libpulse_mainloop_glib_la_OBJECTS) $(libpulse_mainloop_glib_la_LIBADD) $(LIBS) +pulse/libpulse_simple_la-simple.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) + +libpulse-simple.la: $(libpulse_simple_la_OBJECTS) $(libpulse_simple_la_DEPENDENCIES) $(EXTRA_libpulse_simple_la_DEPENDENCIES) + $(AM_V_CCLD)$(libpulse_simple_la_LINK) -rpath $(libdir) $(libpulse_simple_la_OBJECTS) $(libpulse_simple_la_LIBADD) $(LIBS) +pulse/libpulse_la-channelmap.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_la-context.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_la-direction.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_la-error.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_la-ext-device-manager.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_la-ext-device-restore.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_la-ext-stream-restore.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_la-format.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_la-introspect.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_la-mainloop-api.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_la-mainloop-signal.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_la-mainloop.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_la-operation.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_la-proplist.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_la-rtclock.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_la-sample.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_la-scache.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_la-stream.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_la-subscribe.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_la-thread-mainloop.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_la-timeval.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_la-utf8.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_la-util.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_la-volume.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulse_la-xmalloc.lo: pulse/$(am__dirstamp) \ + pulse/$(DEPDIR)/$(am__dirstamp) + +libpulse.la: $(libpulse_la_OBJECTS) $(libpulse_la_DEPENDENCIES) $(EXTRA_libpulse_la_DEPENDENCIES) + $(AM_V_CCLD)$(libpulse_la_LINK) -rpath $(libdir) $(libpulse_la_OBJECTS) $(libpulse_la_LIBADD) $(LIBS) +pulse/libpulsecommon_@PA_MAJORMINOR@_la-client-conf.lo: \ + pulse/$(am__dirstamp) pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulsecommon_@PA_MAJORMINOR@_la-fork-detect.lo: \ + pulse/$(am__dirstamp) pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulsecommon_@PA_MAJORMINOR@_la-format.lo: \ + pulse/$(am__dirstamp) pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulsecommon_@PA_MAJORMINOR@_la-json.lo: \ + pulse/$(am__dirstamp) pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulsecommon_@PA_MAJORMINOR@_la-xmalloc.lo: \ + pulse/$(am__dirstamp) pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulsecommon_@PA_MAJORMINOR@_la-proplist.lo: \ + pulse/$(am__dirstamp) pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulsecommon_@PA_MAJORMINOR@_la-utf8.lo: \ + pulse/$(am__dirstamp) pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulsecommon_@PA_MAJORMINOR@_la-channelmap.lo: \ + pulse/$(am__dirstamp) pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulsecommon_@PA_MAJORMINOR@_la-sample.lo: \ + pulse/$(am__dirstamp) pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulsecommon_@PA_MAJORMINOR@_la-util.lo: \ + pulse/$(am__dirstamp) pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulsecommon_@PA_MAJORMINOR@_la-timeval.lo: \ + pulse/$(am__dirstamp) pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulsecommon_@PA_MAJORMINOR@_la-rtclock.lo: \ + pulse/$(am__dirstamp) pulse/$(DEPDIR)/$(am__dirstamp) +pulse/libpulsecommon_@PA_MAJORMINOR@_la-volume.lo: \ + pulse/$(am__dirstamp) pulse/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-authkey.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-conf-parser.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-error.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-format.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-rtclock.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-util.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-dynarray.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-fdsem.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-flist.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-g711.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-hashmap.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-i18n.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-idxset.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-arpa-inet.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-iochannel.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-ioline.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-ipacl.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-lock-autospawn.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-log.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-ratelimit.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-mcalign.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memblock.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memblockq.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memchunk.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-native-common.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-once.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-packet.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-parseaddr.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pdispatch.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pid.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pipe.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memtrap.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-aupdate.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-proplist-util.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pstream-util.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pstream.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-queue.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-random.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-srbchannel.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-sample-util.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-shm.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-bitset.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-socket-client.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-socket-server.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-socket-util.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-strbuf.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-strlist.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-tagstruct.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-time-smoother.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-tokenizer.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-usergroup.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-sndfile-util.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-poll-win32.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-poll-posix.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulse/libpulsecommon_@PA_MAJORMINOR@_la-client-conf-x11.lo: \ + pulse/$(am__dirstamp) pulse/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-x11prop.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-mutex-win32.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-thread-win32.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-win32.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-mutex-posix.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-thread-posix.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-osx.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-posix.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-dllmain.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-dbus-util.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-rtkit.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) + +libpulsecommon-@PA_MAJORMINOR@.la: $(libpulsecommon_@PA_MAJORMINOR@_la_OBJECTS) $(libpulsecommon_@PA_MAJORMINOR@_la_DEPENDENCIES) $(EXTRA_libpulsecommon_@PA_MAJORMINOR@_la_DEPENDENCIES) + $(AM_V_CCLD)$(libpulsecommon_@PA_MAJORMINOR@_la_LINK) -rpath $(commonlibdir) $(libpulsecommon_@PA_MAJORMINOR@_la_OBJECTS) $(libpulsecommon_@PA_MAJORMINOR@_la_LIBADD) $(LIBS) +pulsecore/filter/$(am__dirstamp): + @$(MKDIR_P) pulsecore/filter + @: > pulsecore/filter/$(am__dirstamp) +pulsecore/filter/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) pulsecore/filter/$(DEPDIR) + @: > pulsecore/filter/$(DEPDIR)/$(am__dirstamp) +pulsecore/filter/libpulsecore_@PA_MAJORMINOR@_la-lfe-filter.lo: \ + pulsecore/filter/$(am__dirstamp) \ + pulsecore/filter/$(DEPDIR)/$(am__dirstamp) +pulsecore/filter/libpulsecore_@PA_MAJORMINOR@_la-biquad.lo: \ + pulsecore/filter/$(am__dirstamp) \ + pulsecore/filter/$(DEPDIR)/$(am__dirstamp) +pulsecore/filter/libpulsecore_@PA_MAJORMINOR@_la-crossover.lo: \ + pulsecore/filter/$(am__dirstamp) \ + pulsecore/filter/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-asyncmsgq.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-asyncq.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-auth-cookie.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cli-command.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cli-text.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-client.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-card.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-core-scache.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-core-subscribe.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-core.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-message-handler.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-hook-list.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-ltdl-helper.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-modargs.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-modinfo.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-module.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-msgobject.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-namereg.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-object.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-play-memblockq.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-play-memchunk.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-remap.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-remap_mmx.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-remap_sse.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-resampler.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/resampler/$(am__dirstamp): + @$(MKDIR_P) pulsecore/resampler + @: > pulsecore/resampler/$(am__dirstamp) +pulsecore/resampler/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) pulsecore/resampler/$(DEPDIR) + @: > pulsecore/resampler/$(DEPDIR)/$(am__dirstamp) +pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-ffmpeg.lo: \ + pulsecore/resampler/$(am__dirstamp) \ + pulsecore/resampler/$(DEPDIR)/$(am__dirstamp) +pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-peaks.lo: \ + pulsecore/resampler/$(am__dirstamp) \ + pulsecore/resampler/$(DEPDIR)/$(am__dirstamp) +pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-trivial.lo: \ + pulsecore/resampler/$(am__dirstamp) \ + pulsecore/resampler/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-rtpoll.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-stream-util.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_c.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_arm.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_mmx.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_sse.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-mix.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu-arm.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu-x86.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu-orc.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16be.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16le.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv_sse.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-shared.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sink-input.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sink.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-device-port.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sioman.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sound-file-stream.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sound-file.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-source-output.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-source.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-start-child.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-thread-mq.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_orc.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-x11wrap.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-dbus-shared.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-protocol-dbus.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database-gdbm.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database-tdb.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database-simple.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) +pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-speex.lo: \ + pulsecore/resampler/$(am__dirstamp) \ + pulsecore/resampler/$(DEPDIR)/$(am__dirstamp) +pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-soxr.lo: \ + pulsecore/resampler/$(am__dirstamp) \ + pulsecore/resampler/$(DEPDIR)/$(am__dirstamp) +pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-libsamplerate.lo: \ + pulsecore/resampler/$(am__dirstamp) \ + pulsecore/resampler/$(DEPDIR)/$(am__dirstamp) +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume-orc-gen.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) + +libpulsecore-@PA_MAJORMINOR@.la: $(libpulsecore_@PA_MAJORMINOR@_la_OBJECTS) $(libpulsecore_@PA_MAJORMINOR@_la_DEPENDENCIES) $(EXTRA_libpulsecore_@PA_MAJORMINOR@_la_DEPENDENCIES) + $(AM_V_CCLD)$(libpulsecore_@PA_MAJORMINOR@_la_LINK) -rpath $(pkglibdir) $(libpulsecore_@PA_MAJORMINOR@_la_OBJECTS) $(libpulsecore_@PA_MAJORMINOR@_la_LIBADD) $(LIBS) +pulsecore/ffmpeg/$(am__dirstamp): + @$(MKDIR_P) pulsecore/ffmpeg + @: > pulsecore/ffmpeg/$(am__dirstamp) +pulsecore/ffmpeg/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) pulsecore/ffmpeg/$(DEPDIR) + @: > pulsecore/ffmpeg/$(DEPDIR)/$(am__dirstamp) +pulsecore/ffmpeg/libpulsecore_foreign_la-resample2.lo: \ + pulsecore/ffmpeg/$(am__dirstamp) \ + pulsecore/ffmpeg/$(DEPDIR)/$(am__dirstamp) + +libpulsecore-foreign.la: $(libpulsecore_foreign_la_OBJECTS) $(libpulsecore_foreign_la_DEPENDENCIES) $(EXTRA_libpulsecore_foreign_la_DEPENDENCIES) + $(AM_V_CCLD)$(libpulsecore_foreign_la_LINK) $(libpulsecore_foreign_la_OBJECTS) $(libpulsecore_foreign_la_LIBADD) $(LIBS) +pulsecore/libpulsecore_mix_neon_la-mix_neon.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) + +libpulsecore_mix_neon.la: $(libpulsecore_mix_neon_la_OBJECTS) $(libpulsecore_mix_neon_la_DEPENDENCIES) $(EXTRA_libpulsecore_mix_neon_la_DEPENDENCIES) + $(AM_V_CCLD)$(libpulsecore_mix_neon_la_LINK) $(am_libpulsecore_mix_neon_la_rpath) $(libpulsecore_mix_neon_la_OBJECTS) $(libpulsecore_mix_neon_la_LIBADD) $(LIBS) +pulsecore/libpulsecore_remap_neon_la-remap_neon.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) + +libpulsecore_remap_neon.la: $(libpulsecore_remap_neon_la_OBJECTS) $(libpulsecore_remap_neon_la_DEPENDENCIES) $(EXTRA_libpulsecore_remap_neon_la_DEPENDENCIES) + $(AM_V_CCLD)$(libpulsecore_remap_neon_la_LINK) $(am_libpulsecore_remap_neon_la_rpath) $(libpulsecore_remap_neon_la_OBJECTS) $(libpulsecore_remap_neon_la_LIBADD) $(LIBS) +pulsecore/libpulsecore_sconv_neon_la-sconv_neon.lo: \ + pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp) + +libpulsecore_sconv_neon.la: $(libpulsecore_sconv_neon_la_OBJECTS) $(libpulsecore_sconv_neon_la_DEPENDENCIES) $(EXTRA_libpulsecore_sconv_neon_la_DEPENDENCIES) + $(AM_V_CCLD)$(libpulsecore_sconv_neon_la_LINK) $(am_libpulsecore_sconv_neon_la_rpath) $(libpulsecore_sconv_neon_la_OBJECTS) $(libpulsecore_sconv_neon_la_LIBADD) $(LIBS) +utils/$(am__dirstamp): + @$(MKDIR_P) utils + @: > utils/$(am__dirstamp) +utils/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) utils/$(DEPDIR) + @: > utils/$(DEPDIR)/$(am__dirstamp) +utils/libpulsedsp_la-padsp.lo: utils/$(am__dirstamp) \ + utils/$(DEPDIR)/$(am__dirstamp) + +libpulsedsp.la: $(libpulsedsp_la_OBJECTS) $(libpulsedsp_la_DEPENDENCIES) $(EXTRA_libpulsedsp_la_DEPENDENCIES) + $(AM_V_CCLD)$(libpulsedsp_la_LINK) $(am_libpulsedsp_la_rpath) $(libpulsedsp_la_OBJECTS) $(libpulsedsp_la_LIBADD) $(LIBS) +modules/raop/$(am__dirstamp): + @$(MKDIR_P) modules/raop + @: > modules/raop/$(am__dirstamp) +modules/raop/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) modules/raop/$(DEPDIR) + @: > modules/raop/$(DEPDIR)/$(am__dirstamp) +modules/raop/libraop_la-raop-util.lo: modules/raop/$(am__dirstamp) \ + modules/raop/$(DEPDIR)/$(am__dirstamp) +modules/raop/libraop_la-raop-crypto.lo: modules/raop/$(am__dirstamp) \ + modules/raop/$(DEPDIR)/$(am__dirstamp) +modules/raop/libraop_la-raop-packet-buffer.lo: \ + modules/raop/$(am__dirstamp) \ + modules/raop/$(DEPDIR)/$(am__dirstamp) +modules/raop/libraop_la-raop-client.lo: modules/raop/$(am__dirstamp) \ + modules/raop/$(DEPDIR)/$(am__dirstamp) +modules/raop/libraop_la-raop-sink.lo: modules/raop/$(am__dirstamp) \ + modules/raop/$(DEPDIR)/$(am__dirstamp) + +libraop.la: $(libraop_la_OBJECTS) $(libraop_la_DEPENDENCIES) $(EXTRA_libraop_la_DEPENDENCIES) + $(AM_V_CCLD)$(libraop_la_LINK) $(am_libraop_la_rpath) $(libraop_la_OBJECTS) $(libraop_la_LIBADD) $(LIBS) +modules/rtp/$(am__dirstamp): + @$(MKDIR_P) modules/rtp + @: > modules/rtp/$(am__dirstamp) +modules/rtp/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) modules/rtp/$(DEPDIR) + @: > modules/rtp/$(DEPDIR)/$(am__dirstamp) +modules/rtp/librtp_la-rtp-common.lo: modules/rtp/$(am__dirstamp) \ + modules/rtp/$(DEPDIR)/$(am__dirstamp) +modules/rtp/librtp_la-sdp.lo: modules/rtp/$(am__dirstamp) \ + modules/rtp/$(DEPDIR)/$(am__dirstamp) +modules/rtp/librtp_la-sap.lo: modules/rtp/$(am__dirstamp) \ + modules/rtp/$(DEPDIR)/$(am__dirstamp) +modules/rtp/librtp_la-rtsp_client.lo: modules/rtp/$(am__dirstamp) \ + modules/rtp/$(DEPDIR)/$(am__dirstamp) +modules/rtp/librtp_la-headerlist.lo: modules/rtp/$(am__dirstamp) \ + modules/rtp/$(DEPDIR)/$(am__dirstamp) +modules/rtp/librtp_la-rtp-gstreamer.lo: modules/rtp/$(am__dirstamp) \ + modules/rtp/$(DEPDIR)/$(am__dirstamp) +modules/rtp/librtp_la-rtp-native.lo: modules/rtp/$(am__dirstamp) \ + modules/rtp/$(DEPDIR)/$(am__dirstamp) + +librtp.la: $(librtp_la_OBJECTS) $(librtp_la_DEPENDENCIES) $(EXTRA_librtp_la_DEPENDENCIES) + $(AM_V_CCLD)$(librtp_la_LINK) $(am_librtp_la_rpath) $(librtp_la_OBJECTS) $(librtp_la_LIBADD) $(LIBS) +modules/echo-cancel/$(am__dirstamp): + @$(MKDIR_P) modules/echo-cancel + @: > modules/echo-cancel/$(am__dirstamp) +modules/echo-cancel/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) modules/echo-cancel/$(DEPDIR) + @: > modules/echo-cancel/$(DEPDIR)/$(am__dirstamp) +modules/echo-cancel/libwebrtc_util_la-webrtc.lo: \ + modules/echo-cancel/$(am__dirstamp) \ + modules/echo-cancel/$(DEPDIR)/$(am__dirstamp) + +libwebrtc-util.la: $(libwebrtc_util_la_OBJECTS) $(libwebrtc_util_la_DEPENDENCIES) $(EXTRA_libwebrtc_util_la_DEPENDENCIES) + $(AM_V_CXXLD)$(libwebrtc_util_la_LINK) $(am_libwebrtc_util_la_rpath) $(libwebrtc_util_la_OBJECTS) $(libwebrtc_util_la_LIBADD) $(LIBS) +modules/module_allow_passthrough_la-module-allow-passthrough.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-allow-passthrough.la: $(module_allow_passthrough_la_OBJECTS) $(module_allow_passthrough_la_DEPENDENCIES) $(EXTRA_module_allow_passthrough_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_allow_passthrough_la_LINK) -rpath $(modlibexecdir) $(module_allow_passthrough_la_OBJECTS) $(module_allow_passthrough_la_LIBADD) $(LIBS) +modules/alsa/module_alsa_card_la-module-alsa-card.lo: \ + modules/alsa/$(am__dirstamp) \ + modules/alsa/$(DEPDIR)/$(am__dirstamp) + +module-alsa-card.la: $(module_alsa_card_la_OBJECTS) $(module_alsa_card_la_DEPENDENCIES) $(EXTRA_module_alsa_card_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_alsa_card_la_LINK) $(am_module_alsa_card_la_rpath) $(module_alsa_card_la_OBJECTS) $(module_alsa_card_la_LIBADD) $(LIBS) +modules/alsa/module_alsa_sink_la-module-alsa-sink.lo: \ + modules/alsa/$(am__dirstamp) \ + modules/alsa/$(DEPDIR)/$(am__dirstamp) + +module-alsa-sink.la: $(module_alsa_sink_la_OBJECTS) $(module_alsa_sink_la_DEPENDENCIES) $(EXTRA_module_alsa_sink_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_alsa_sink_la_LINK) $(am_module_alsa_sink_la_rpath) $(module_alsa_sink_la_OBJECTS) $(module_alsa_sink_la_LIBADD) $(LIBS) +modules/alsa/module_alsa_source_la-module-alsa-source.lo: \ + modules/alsa/$(am__dirstamp) \ + modules/alsa/$(DEPDIR)/$(am__dirstamp) + +module-alsa-source.la: $(module_alsa_source_la_OBJECTS) $(module_alsa_source_la_DEPENDENCIES) $(EXTRA_module_alsa_source_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_alsa_source_la_LINK) $(am_module_alsa_source_la_rpath) $(module_alsa_source_la_OBJECTS) $(module_alsa_source_la_LIBADD) $(LIBS) +modules/module_always_sink_la-module-always-sink.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-always-sink.la: $(module_always_sink_la_OBJECTS) $(module_always_sink_la_DEPENDENCIES) $(EXTRA_module_always_sink_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_always_sink_la_LINK) -rpath $(modlibexecdir) $(module_always_sink_la_OBJECTS) $(module_always_sink_la_LIBADD) $(LIBS) +modules/module_always_source_la-module-always-source.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-always-source.la: $(module_always_source_la_OBJECTS) $(module_always_source_la_DEPENDENCIES) $(EXTRA_module_always_source_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_always_source_la_LINK) -rpath $(modlibexecdir) $(module_always_source_la_OBJECTS) $(module_always_source_la_LIBADD) $(LIBS) +modules/module_augment_properties_la-module-augment-properties.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-augment-properties.la: $(module_augment_properties_la_OBJECTS) $(module_augment_properties_la_DEPENDENCIES) $(EXTRA_module_augment_properties_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_augment_properties_la_LINK) -rpath $(modlibexecdir) $(module_augment_properties_la_OBJECTS) $(module_augment_properties_la_LIBADD) $(LIBS) +modules/bluetooth/module_bluetooth_discover_la-module-bluetooth-discover.lo: \ + modules/bluetooth/$(am__dirstamp) \ + modules/bluetooth/$(DEPDIR)/$(am__dirstamp) + +module-bluetooth-discover.la: $(module_bluetooth_discover_la_OBJECTS) $(module_bluetooth_discover_la_DEPENDENCIES) $(EXTRA_module_bluetooth_discover_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_bluetooth_discover_la_LINK) $(am_module_bluetooth_discover_la_rpath) $(module_bluetooth_discover_la_OBJECTS) $(module_bluetooth_discover_la_LIBADD) $(LIBS) +modules/bluetooth/module_bluetooth_policy_la-module-bluetooth-policy.lo: \ + modules/bluetooth/$(am__dirstamp) \ + modules/bluetooth/$(DEPDIR)/$(am__dirstamp) + +module-bluetooth-policy.la: $(module_bluetooth_policy_la_OBJECTS) $(module_bluetooth_policy_la_DEPENDENCIES) $(EXTRA_module_bluetooth_policy_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_bluetooth_policy_la_LINK) $(am_module_bluetooth_policy_la_rpath) $(module_bluetooth_policy_la_OBJECTS) $(module_bluetooth_policy_la_LIBADD) $(LIBS) +modules/bluetooth/module_bluez5_device_la-module-bluez5-device.lo: \ + modules/bluetooth/$(am__dirstamp) \ + modules/bluetooth/$(DEPDIR)/$(am__dirstamp) + +module-bluez5-device.la: $(module_bluez5_device_la_OBJECTS) $(module_bluez5_device_la_DEPENDENCIES) $(EXTRA_module_bluez5_device_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_bluez5_device_la_LINK) $(am_module_bluez5_device_la_rpath) $(module_bluez5_device_la_OBJECTS) $(module_bluez5_device_la_LIBADD) $(LIBS) +modules/bluetooth/module_bluez5_discover_la-module-bluez5-discover.lo: \ + modules/bluetooth/$(am__dirstamp) \ + modules/bluetooth/$(DEPDIR)/$(am__dirstamp) + +module-bluez5-discover.la: $(module_bluez5_discover_la_OBJECTS) $(module_bluez5_discover_la_DEPENDENCIES) $(EXTRA_module_bluez5_discover_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_bluez5_discover_la_LINK) $(am_module_bluez5_discover_la_rpath) $(module_bluez5_discover_la_OBJECTS) $(module_bluez5_discover_la_LIBADD) $(LIBS) +modules/macosx/$(am__dirstamp): + @$(MKDIR_P) modules/macosx + @: > modules/macosx/$(am__dirstamp) +modules/macosx/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) modules/macosx/$(DEPDIR) + @: > modules/macosx/$(DEPDIR)/$(am__dirstamp) +modules/macosx/module_bonjour_publish_la-module-bonjour-publish.lo: \ + modules/macosx/$(am__dirstamp) \ + modules/macosx/$(DEPDIR)/$(am__dirstamp) + +module-bonjour-publish.la: $(module_bonjour_publish_la_OBJECTS) $(module_bonjour_publish_la_DEPENDENCIES) $(EXTRA_module_bonjour_publish_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_bonjour_publish_la_LINK) $(am_module_bonjour_publish_la_rpath) $(module_bonjour_publish_la_OBJECTS) $(module_bonjour_publish_la_LIBADD) $(LIBS) +modules/module_card_restore_la-module-card-restore.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-card-restore.la: $(module_card_restore_la_OBJECTS) $(module_card_restore_la_DEPENDENCIES) $(EXTRA_module_card_restore_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_card_restore_la_LINK) -rpath $(modlibexecdir) $(module_card_restore_la_OBJECTS) $(module_card_restore_la_LIBADD) $(LIBS) +modules/module_cli_protocol_tcp_la-module-protocol-stub.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-cli-protocol-tcp.la: $(module_cli_protocol_tcp_la_OBJECTS) $(module_cli_protocol_tcp_la_DEPENDENCIES) $(EXTRA_module_cli_protocol_tcp_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_cli_protocol_tcp_la_LINK) -rpath $(modlibexecdir) $(module_cli_protocol_tcp_la_OBJECTS) $(module_cli_protocol_tcp_la_LIBADD) $(LIBS) +modules/module_cli_protocol_unix_la-module-protocol-stub.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-cli-protocol-unix.la: $(module_cli_protocol_unix_la_OBJECTS) $(module_cli_protocol_unix_la_DEPENDENCIES) $(EXTRA_module_cli_protocol_unix_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_cli_protocol_unix_la_LINK) $(am_module_cli_protocol_unix_la_rpath) $(module_cli_protocol_unix_la_OBJECTS) $(module_cli_protocol_unix_la_LIBADD) $(LIBS) +modules/module_cli_la-module-cli.lo: modules/$(am__dirstamp) \ + modules/$(DEPDIR)/$(am__dirstamp) + +module-cli.la: $(module_cli_la_OBJECTS) $(module_cli_la_DEPENDENCIES) $(EXTRA_module_cli_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_cli_la_LINK) -rpath $(modlibexecdir) $(module_cli_la_OBJECTS) $(module_cli_la_LIBADD) $(LIBS) +modules/module_combine_sink_la-module-combine-sink.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-combine-sink.la: $(module_combine_sink_la_OBJECTS) $(module_combine_sink_la_DEPENDENCIES) $(EXTRA_module_combine_sink_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_combine_sink_la_LINK) -rpath $(modlibexecdir) $(module_combine_sink_la_OBJECTS) $(module_combine_sink_la_LIBADD) $(LIBS) +modules/module_combine_la-module-combine.lo: modules/$(am__dirstamp) \ + modules/$(DEPDIR)/$(am__dirstamp) + +module-combine.la: $(module_combine_la_OBJECTS) $(module_combine_la_DEPENDENCIES) $(EXTRA_module_combine_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_combine_la_LINK) -rpath $(modlibexecdir) $(module_combine_la_OBJECTS) $(module_combine_la_LIBADD) $(LIBS) +modules/module_console_kit_la-module-console-kit.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-console-kit.la: $(module_console_kit_la_OBJECTS) $(module_console_kit_la_DEPENDENCIES) $(EXTRA_module_console_kit_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_console_kit_la_LINK) $(am_module_console_kit_la_rpath) $(module_console_kit_la_OBJECTS) $(module_console_kit_la_LIBADD) $(LIBS) +modules/macosx/module_coreaudio_detect_la-module-coreaudio-detect.lo: \ + modules/macosx/$(am__dirstamp) \ + modules/macosx/$(DEPDIR)/$(am__dirstamp) + +module-coreaudio-detect.la: $(module_coreaudio_detect_la_OBJECTS) $(module_coreaudio_detect_la_DEPENDENCIES) $(EXTRA_module_coreaudio_detect_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_coreaudio_detect_la_LINK) $(am_module_coreaudio_detect_la_rpath) $(module_coreaudio_detect_la_OBJECTS) $(module_coreaudio_detect_la_LIBADD) $(LIBS) +modules/macosx/module_coreaudio_device_la-module-coreaudio-device.lo: \ + modules/macosx/$(am__dirstamp) \ + modules/macosx/$(DEPDIR)/$(am__dirstamp) + +module-coreaudio-device.la: $(module_coreaudio_device_la_OBJECTS) $(module_coreaudio_device_la_DEPENDENCIES) $(EXTRA_module_coreaudio_device_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_coreaudio_device_la_LINK) $(am_module_coreaudio_device_la_rpath) $(module_coreaudio_device_la_OBJECTS) $(module_coreaudio_device_la_LIBADD) $(LIBS) +modules/dbus/$(am__dirstamp): + @$(MKDIR_P) modules/dbus + @: > modules/dbus/$(am__dirstamp) +modules/dbus/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) modules/dbus/$(DEPDIR) + @: > modules/dbus/$(DEPDIR)/$(am__dirstamp) +modules/dbus/module_dbus_protocol_la-iface-card.lo: \ + modules/dbus/$(am__dirstamp) \ + modules/dbus/$(DEPDIR)/$(am__dirstamp) +modules/dbus/module_dbus_protocol_la-iface-card-profile.lo: \ + modules/dbus/$(am__dirstamp) \ + modules/dbus/$(DEPDIR)/$(am__dirstamp) +modules/dbus/module_dbus_protocol_la-iface-client.lo: \ + modules/dbus/$(am__dirstamp) \ + modules/dbus/$(DEPDIR)/$(am__dirstamp) +modules/dbus/module_dbus_protocol_la-iface-core.lo: \ + modules/dbus/$(am__dirstamp) \ + modules/dbus/$(DEPDIR)/$(am__dirstamp) +modules/dbus/module_dbus_protocol_la-iface-device.lo: \ + modules/dbus/$(am__dirstamp) \ + modules/dbus/$(DEPDIR)/$(am__dirstamp) +modules/dbus/module_dbus_protocol_la-iface-device-port.lo: \ + modules/dbus/$(am__dirstamp) \ + modules/dbus/$(DEPDIR)/$(am__dirstamp) +modules/dbus/module_dbus_protocol_la-iface-memstats.lo: \ + modules/dbus/$(am__dirstamp) \ + modules/dbus/$(DEPDIR)/$(am__dirstamp) +modules/dbus/module_dbus_protocol_la-iface-module.lo: \ + modules/dbus/$(am__dirstamp) \ + modules/dbus/$(DEPDIR)/$(am__dirstamp) +modules/dbus/module_dbus_protocol_la-iface-sample.lo: \ + modules/dbus/$(am__dirstamp) \ + modules/dbus/$(DEPDIR)/$(am__dirstamp) +modules/dbus/module_dbus_protocol_la-iface-stream.lo: \ + modules/dbus/$(am__dirstamp) \ + modules/dbus/$(DEPDIR)/$(am__dirstamp) +modules/dbus/module_dbus_protocol_la-module-dbus-protocol.lo: \ + modules/dbus/$(am__dirstamp) \ + modules/dbus/$(DEPDIR)/$(am__dirstamp) + +module-dbus-protocol.la: $(module_dbus_protocol_la_OBJECTS) $(module_dbus_protocol_la_DEPENDENCIES) $(EXTRA_module_dbus_protocol_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_dbus_protocol_la_LINK) $(am_module_dbus_protocol_la_rpath) $(module_dbus_protocol_la_OBJECTS) $(module_dbus_protocol_la_LIBADD) $(LIBS) +modules/module_default_device_restore_la-module-default-device-restore.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-default-device-restore.la: $(module_default_device_restore_la_OBJECTS) $(module_default_device_restore_la_DEPENDENCIES) $(EXTRA_module_default_device_restore_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_default_device_restore_la_LINK) -rpath $(modlibexecdir) $(module_default_device_restore_la_OBJECTS) $(module_default_device_restore_la_LIBADD) $(LIBS) +modules/module_detect_la-module-detect.lo: modules/$(am__dirstamp) \ + modules/$(DEPDIR)/$(am__dirstamp) + +module-detect.la: $(module_detect_la_OBJECTS) $(module_detect_la_DEPENDENCIES) $(EXTRA_module_detect_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_detect_la_LINK) -rpath $(modlibexecdir) $(module_detect_la_OBJECTS) $(module_detect_la_LIBADD) $(LIBS) +modules/module_device_manager_la-module-device-manager.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-device-manager.la: $(module_device_manager_la_OBJECTS) $(module_device_manager_la_DEPENDENCIES) $(EXTRA_module_device_manager_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_device_manager_la_LINK) -rpath $(modlibexecdir) $(module_device_manager_la_OBJECTS) $(module_device_manager_la_LIBADD) $(LIBS) +modules/module_device_restore_la-module-device-restore.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-device-restore.la: $(module_device_restore_la_OBJECTS) $(module_device_restore_la_DEPENDENCIES) $(EXTRA_module_device_restore_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_device_restore_la_LINK) -rpath $(modlibexecdir) $(module_device_restore_la_OBJECTS) $(module_device_restore_la_LIBADD) $(LIBS) +modules/echo-cancel/module_echo_cancel_la-module-echo-cancel.lo: \ + modules/echo-cancel/$(am__dirstamp) \ + modules/echo-cancel/$(DEPDIR)/$(am__dirstamp) +modules/echo-cancel/module_echo_cancel_la-null.lo: \ + modules/echo-cancel/$(am__dirstamp) \ + modules/echo-cancel/$(DEPDIR)/$(am__dirstamp) +modules/echo-cancel/module_echo_cancel_la-adrian-aec.lo: \ + modules/echo-cancel/$(am__dirstamp) \ + modules/echo-cancel/$(DEPDIR)/$(am__dirstamp) +modules/echo-cancel/module_echo_cancel_la-adrian.lo: \ + modules/echo-cancel/$(am__dirstamp) \ + modules/echo-cancel/$(DEPDIR)/$(am__dirstamp) +modules/echo-cancel/module_echo_cancel_la-speex.lo: \ + modules/echo-cancel/$(am__dirstamp) \ + modules/echo-cancel/$(DEPDIR)/$(am__dirstamp) +modules/echo-cancel/module_echo_cancel_la-adrian-aec-orc-gen.lo: \ + modules/echo-cancel/$(am__dirstamp) \ + modules/echo-cancel/$(DEPDIR)/$(am__dirstamp) + +module-echo-cancel.la: $(module_echo_cancel_la_OBJECTS) $(module_echo_cancel_la_DEPENDENCIES) $(EXTRA_module_echo_cancel_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_echo_cancel_la_LINK) -rpath $(modlibexecdir) $(module_echo_cancel_la_OBJECTS) $(module_echo_cancel_la_LIBADD) $(LIBS) +modules/module_equalizer_sink_la-module-equalizer-sink.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-equalizer-sink.la: $(module_equalizer_sink_la_OBJECTS) $(module_equalizer_sink_la_DEPENDENCIES) $(EXTRA_module_equalizer_sink_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_equalizer_sink_la_LINK) $(am_module_equalizer_sink_la_rpath) $(module_equalizer_sink_la_OBJECTS) $(module_equalizer_sink_la_LIBADD) $(LIBS) +modules/module_esound_compat_spawnfd_la-module-esound-compat-spawnfd.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-esound-compat-spawnfd.la: $(module_esound_compat_spawnfd_la_OBJECTS) $(module_esound_compat_spawnfd_la_DEPENDENCIES) $(EXTRA_module_esound_compat_spawnfd_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_esound_compat_spawnfd_la_LINK) $(am_module_esound_compat_spawnfd_la_rpath) $(module_esound_compat_spawnfd_la_OBJECTS) $(module_esound_compat_spawnfd_la_LIBADD) $(LIBS) +modules/module_esound_compat_spawnpid_la-module-esound-compat-spawnpid.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-esound-compat-spawnpid.la: $(module_esound_compat_spawnpid_la_OBJECTS) $(module_esound_compat_spawnpid_la_DEPENDENCIES) $(EXTRA_module_esound_compat_spawnpid_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_esound_compat_spawnpid_la_LINK) $(am_module_esound_compat_spawnpid_la_rpath) $(module_esound_compat_spawnpid_la_OBJECTS) $(module_esound_compat_spawnpid_la_LIBADD) $(LIBS) +modules/module_esound_protocol_tcp_la-module-protocol-stub.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-esound-protocol-tcp.la: $(module_esound_protocol_tcp_la_OBJECTS) $(module_esound_protocol_tcp_la_DEPENDENCIES) $(EXTRA_module_esound_protocol_tcp_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_esound_protocol_tcp_la_LINK) $(am_module_esound_protocol_tcp_la_rpath) $(module_esound_protocol_tcp_la_OBJECTS) $(module_esound_protocol_tcp_la_LIBADD) $(LIBS) +modules/module_esound_protocol_unix_la-module-protocol-stub.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-esound-protocol-unix.la: $(module_esound_protocol_unix_la_OBJECTS) $(module_esound_protocol_unix_la_DEPENDENCIES) $(EXTRA_module_esound_protocol_unix_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_esound_protocol_unix_la_LINK) $(am_module_esound_protocol_unix_la_rpath) $(module_esound_protocol_unix_la_OBJECTS) $(module_esound_protocol_unix_la_LIBADD) $(LIBS) +modules/module_esound_sink_la-module-esound-sink.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-esound-sink.la: $(module_esound_sink_la_OBJECTS) $(module_esound_sink_la_DEPENDENCIES) $(EXTRA_module_esound_sink_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_esound_sink_la_LINK) $(am_module_esound_sink_la_rpath) $(module_esound_sink_la_OBJECTS) $(module_esound_sink_la_LIBADD) $(LIBS) +modules/module_filter_apply_la-module-filter-apply.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-filter-apply.la: $(module_filter_apply_la_OBJECTS) $(module_filter_apply_la_DEPENDENCIES) $(EXTRA_module_filter_apply_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_filter_apply_la_LINK) -rpath $(modlibexecdir) $(module_filter_apply_la_OBJECTS) $(module_filter_apply_la_LIBADD) $(LIBS) +modules/module_filter_heuristics_la-module-filter-heuristics.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-filter-heuristics.la: $(module_filter_heuristics_la_OBJECTS) $(module_filter_heuristics_la_DEPENDENCIES) $(EXTRA_module_filter_heuristics_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_filter_heuristics_la_LINK) -rpath $(modlibexecdir) $(module_filter_heuristics_la_OBJECTS) $(module_filter_heuristics_la_LIBADD) $(LIBS) +modules/module_gconf_la-stdin-util.lo: modules/$(am__dirstamp) \ + modules/$(DEPDIR)/$(am__dirstamp) +modules/gconf/$(am__dirstamp): + @$(MKDIR_P) modules/gconf + @: > modules/gconf/$(am__dirstamp) +modules/gconf/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) modules/gconf/$(DEPDIR) + @: > modules/gconf/$(DEPDIR)/$(am__dirstamp) +modules/gconf/module_gconf_la-module-gconf.lo: \ + modules/gconf/$(am__dirstamp) \ + modules/gconf/$(DEPDIR)/$(am__dirstamp) + +module-gconf.la: $(module_gconf_la_OBJECTS) $(module_gconf_la_DEPENDENCIES) $(EXTRA_module_gconf_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_gconf_la_LINK) $(am_module_gconf_la_rpath) $(module_gconf_la_OBJECTS) $(module_gconf_la_LIBADD) $(LIBS) +modules/module_gsettings_la-stdin-util.lo: modules/$(am__dirstamp) \ + modules/$(DEPDIR)/$(am__dirstamp) +modules/gsettings/$(am__dirstamp): + @$(MKDIR_P) modules/gsettings + @: > modules/gsettings/$(am__dirstamp) +modules/gsettings/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) modules/gsettings/$(DEPDIR) + @: > modules/gsettings/$(DEPDIR)/$(am__dirstamp) +modules/gsettings/module_gsettings_la-module-gsettings.lo: \ + modules/gsettings/$(am__dirstamp) \ + modules/gsettings/$(DEPDIR)/$(am__dirstamp) + +module-gsettings.la: $(module_gsettings_la_OBJECTS) $(module_gsettings_la_DEPENDENCIES) $(EXTRA_module_gsettings_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_gsettings_la_LINK) $(am_module_gsettings_la_rpath) $(module_gsettings_la_OBJECTS) $(module_gsettings_la_LIBADD) $(LIBS) +modules/module_hal_detect_la-module-hal-detect-compat.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-hal-detect.la: $(module_hal_detect_la_OBJECTS) $(module_hal_detect_la_DEPENDENCIES) $(EXTRA_module_hal_detect_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_hal_detect_la_LINK) $(am_module_hal_detect_la_rpath) $(module_hal_detect_la_OBJECTS) $(module_hal_detect_la_LIBADD) $(LIBS) +modules/module_http_protocol_tcp_la-module-protocol-stub.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-http-protocol-tcp.la: $(module_http_protocol_tcp_la_OBJECTS) $(module_http_protocol_tcp_la_DEPENDENCIES) $(EXTRA_module_http_protocol_tcp_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_http_protocol_tcp_la_LINK) -rpath $(modlibexecdir) $(module_http_protocol_tcp_la_OBJECTS) $(module_http_protocol_tcp_la_LIBADD) $(LIBS) +modules/module_http_protocol_unix_la-module-protocol-stub.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-http-protocol-unix.la: $(module_http_protocol_unix_la_OBJECTS) $(module_http_protocol_unix_la_DEPENDENCIES) $(EXTRA_module_http_protocol_unix_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_http_protocol_unix_la_LINK) $(am_module_http_protocol_unix_la_rpath) $(module_http_protocol_unix_la_OBJECTS) $(module_http_protocol_unix_la_LIBADD) $(LIBS) +modules/module_intended_roles_la-module-intended-roles.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-intended-roles.la: $(module_intended_roles_la_OBJECTS) $(module_intended_roles_la_DEPENDENCIES) $(EXTRA_module_intended_roles_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_intended_roles_la_LINK) -rpath $(modlibexecdir) $(module_intended_roles_la_OBJECTS) $(module_intended_roles_la_LIBADD) $(LIBS) +modules/jack/$(am__dirstamp): + @$(MKDIR_P) modules/jack + @: > modules/jack/$(am__dirstamp) +modules/jack/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) modules/jack/$(DEPDIR) + @: > modules/jack/$(DEPDIR)/$(am__dirstamp) +modules/jack/module_jack_sink_la-module-jack-sink.lo: \ + modules/jack/$(am__dirstamp) \ + modules/jack/$(DEPDIR)/$(am__dirstamp) + +module-jack-sink.la: $(module_jack_sink_la_OBJECTS) $(module_jack_sink_la_DEPENDENCIES) $(EXTRA_module_jack_sink_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_jack_sink_la_LINK) $(am_module_jack_sink_la_rpath) $(module_jack_sink_la_OBJECTS) $(module_jack_sink_la_LIBADD) $(LIBS) +modules/jack/module_jack_source_la-module-jack-source.lo: \ + modules/jack/$(am__dirstamp) \ + modules/jack/$(DEPDIR)/$(am__dirstamp) + +module-jack-source.la: $(module_jack_source_la_OBJECTS) $(module_jack_source_la_DEPENDENCIES) $(EXTRA_module_jack_source_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_jack_source_la_LINK) $(am_module_jack_source_la_rpath) $(module_jack_source_la_OBJECTS) $(module_jack_source_la_LIBADD) $(LIBS) +modules/jack/module_jackdbus_detect_la-module-jackdbus-detect.lo: \ + modules/jack/$(am__dirstamp) \ + modules/jack/$(DEPDIR)/$(am__dirstamp) + +module-jackdbus-detect.la: $(module_jackdbus_detect_la_OBJECTS) $(module_jackdbus_detect_la_DEPENDENCIES) $(EXTRA_module_jackdbus_detect_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_jackdbus_detect_la_LINK) $(am_module_jackdbus_detect_la_rpath) $(module_jackdbus_detect_la_OBJECTS) $(module_jackdbus_detect_la_LIBADD) $(LIBS) +modules/module_ladspa_sink_la-module-ladspa-sink.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-ladspa-sink.la: $(module_ladspa_sink_la_OBJECTS) $(module_ladspa_sink_la_DEPENDENCIES) $(EXTRA_module_ladspa_sink_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_ladspa_sink_la_LINK) -rpath $(modlibexecdir) $(module_ladspa_sink_la_OBJECTS) $(module_ladspa_sink_la_LIBADD) $(LIBS) +modules/module_lirc_la-module-lirc.lo: modules/$(am__dirstamp) \ + modules/$(DEPDIR)/$(am__dirstamp) + +module-lirc.la: $(module_lirc_la_OBJECTS) $(module_lirc_la_DEPENDENCIES) $(EXTRA_module_lirc_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_lirc_la_LINK) $(am_module_lirc_la_rpath) $(module_lirc_la_OBJECTS) $(module_lirc_la_LIBADD) $(LIBS) +modules/module_loopback_la-module-loopback.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-loopback.la: $(module_loopback_la_OBJECTS) $(module_loopback_la_DEPENDENCIES) $(EXTRA_module_loopback_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_loopback_la_LINK) -rpath $(modlibexecdir) $(module_loopback_la_OBJECTS) $(module_loopback_la_LIBADD) $(LIBS) +modules/module_match_la-module-match.lo: modules/$(am__dirstamp) \ + modules/$(DEPDIR)/$(am__dirstamp) + +module-match.la: $(module_match_la_OBJECTS) $(module_match_la_DEPENDENCIES) $(EXTRA_module_match_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_match_la_LINK) $(am_module_match_la_rpath) $(module_match_la_OBJECTS) $(module_match_la_LIBADD) $(LIBS) +modules/module_mmkbd_evdev_la-module-mmkbd-evdev.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-mmkbd-evdev.la: $(module_mmkbd_evdev_la_OBJECTS) $(module_mmkbd_evdev_la_DEPENDENCIES) $(EXTRA_module_mmkbd_evdev_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_mmkbd_evdev_la_LINK) $(am_module_mmkbd_evdev_la_rpath) $(module_mmkbd_evdev_la_OBJECTS) $(module_mmkbd_evdev_la_LIBADD) $(LIBS) +modules/module_native_protocol_fd_la-module-native-protocol-fd.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-native-protocol-fd.la: $(module_native_protocol_fd_la_OBJECTS) $(module_native_protocol_fd_la_DEPENDENCIES) $(EXTRA_module_native_protocol_fd_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_native_protocol_fd_la_LINK) -rpath $(modlibexecdir) $(module_native_protocol_fd_la_OBJECTS) $(module_native_protocol_fd_la_LIBADD) $(LIBS) +modules/module_native_protocol_tcp_la-module-protocol-stub.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-native-protocol-tcp.la: $(module_native_protocol_tcp_la_OBJECTS) $(module_native_protocol_tcp_la_DEPENDENCIES) $(EXTRA_module_native_protocol_tcp_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_native_protocol_tcp_la_LINK) -rpath $(modlibexecdir) $(module_native_protocol_tcp_la_OBJECTS) $(module_native_protocol_tcp_la_LIBADD) $(LIBS) +modules/module_native_protocol_unix_la-module-protocol-stub.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-native-protocol-unix.la: $(module_native_protocol_unix_la_OBJECTS) $(module_native_protocol_unix_la_DEPENDENCIES) $(EXTRA_module_native_protocol_unix_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_native_protocol_unix_la_LINK) $(am_module_native_protocol_unix_la_rpath) $(module_native_protocol_unix_la_OBJECTS) $(module_native_protocol_unix_la_LIBADD) $(LIBS) +modules/module_null_sink_la-module-null-sink.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-null-sink.la: $(module_null_sink_la_OBJECTS) $(module_null_sink_la_DEPENDENCIES) $(EXTRA_module_null_sink_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_null_sink_la_LINK) -rpath $(modlibexecdir) $(module_null_sink_la_OBJECTS) $(module_null_sink_la_LIBADD) $(LIBS) +modules/module_null_source_la-module-null-source.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-null-source.la: $(module_null_source_la_OBJECTS) $(module_null_source_la_DEPENDENCIES) $(EXTRA_module_null_source_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_null_source_la_LINK) -rpath $(modlibexecdir) $(module_null_source_la_OBJECTS) $(module_null_source_la_LIBADD) $(LIBS) +modules/oss/module_oss_la-module-oss.lo: modules/oss/$(am__dirstamp) \ + modules/oss/$(DEPDIR)/$(am__dirstamp) + +module-oss.la: $(module_oss_la_OBJECTS) $(module_oss_la_DEPENDENCIES) $(EXTRA_module_oss_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_oss_la_LINK) $(am_module_oss_la_rpath) $(module_oss_la_OBJECTS) $(module_oss_la_LIBADD) $(LIBS) +modules/module_pipe_sink_la-module-pipe-sink.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-pipe-sink.la: $(module_pipe_sink_la_OBJECTS) $(module_pipe_sink_la_DEPENDENCIES) $(EXTRA_module_pipe_sink_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_pipe_sink_la_LINK) $(am_module_pipe_sink_la_rpath) $(module_pipe_sink_la_OBJECTS) $(module_pipe_sink_la_LIBADD) $(LIBS) +modules/module_pipe_source_la-module-pipe-source.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-pipe-source.la: $(module_pipe_source_la_OBJECTS) $(module_pipe_source_la_DEPENDENCIES) $(EXTRA_module_pipe_source_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_pipe_source_la_LINK) $(am_module_pipe_source_la_rpath) $(module_pipe_source_la_OBJECTS) $(module_pipe_source_la_LIBADD) $(LIBS) +modules/module_position_event_sounds_la-module-position-event-sounds.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-position-event-sounds.la: $(module_position_event_sounds_la_OBJECTS) $(module_position_event_sounds_la_DEPENDENCIES) $(EXTRA_module_position_event_sounds_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_position_event_sounds_la_LINK) -rpath $(modlibexecdir) $(module_position_event_sounds_la_OBJECTS) $(module_position_event_sounds_la_LIBADD) $(LIBS) +modules/raop/module_raop_discover_la-module-raop-discover.lo: \ + modules/raop/$(am__dirstamp) \ + modules/raop/$(DEPDIR)/$(am__dirstamp) + +module-raop-discover.la: $(module_raop_discover_la_OBJECTS) $(module_raop_discover_la_DEPENDENCIES) $(EXTRA_module_raop_discover_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_raop_discover_la_LINK) $(am_module_raop_discover_la_rpath) $(module_raop_discover_la_OBJECTS) $(module_raop_discover_la_LIBADD) $(LIBS) +modules/raop/module_raop_sink_la-module-raop-sink.lo: \ + modules/raop/$(am__dirstamp) \ + modules/raop/$(DEPDIR)/$(am__dirstamp) + +module-raop-sink.la: $(module_raop_sink_la_OBJECTS) $(module_raop_sink_la_DEPENDENCIES) $(EXTRA_module_raop_sink_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_raop_sink_la_LINK) $(am_module_raop_sink_la_rpath) $(module_raop_sink_la_OBJECTS) $(module_raop_sink_la_LIBADD) $(LIBS) +modules/module_remap_sink_la-module-remap-sink.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-remap-sink.la: $(module_remap_sink_la_OBJECTS) $(module_remap_sink_la_DEPENDENCIES) $(EXTRA_module_remap_sink_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_remap_sink_la_LINK) -rpath $(modlibexecdir) $(module_remap_sink_la_OBJECTS) $(module_remap_sink_la_LIBADD) $(LIBS) +modules/module_remap_source_la-module-remap-source.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-remap-source.la: $(module_remap_source_la_OBJECTS) $(module_remap_source_la_DEPENDENCIES) $(EXTRA_module_remap_source_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_remap_source_la_LINK) -rpath $(modlibexecdir) $(module_remap_source_la_OBJECTS) $(module_remap_source_la_LIBADD) $(LIBS) +modules/module_rescue_streams_la-module-rescue-streams.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-rescue-streams.la: $(module_rescue_streams_la_OBJECTS) $(module_rescue_streams_la_DEPENDENCIES) $(EXTRA_module_rescue_streams_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_rescue_streams_la_LINK) -rpath $(modlibexecdir) $(module_rescue_streams_la_OBJECTS) $(module_rescue_streams_la_LIBADD) $(LIBS) +modules/module_role_cork_la-module-role-cork.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) +modules/module_role_cork_la-stream-interaction.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-role-cork.la: $(module_role_cork_la_OBJECTS) $(module_role_cork_la_DEPENDENCIES) $(EXTRA_module_role_cork_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_role_cork_la_LINK) -rpath $(modlibexecdir) $(module_role_cork_la_OBJECTS) $(module_role_cork_la_LIBADD) $(LIBS) +modules/module_role_ducking_la-module-role-ducking.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) +modules/module_role_ducking_la-stream-interaction.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-role-ducking.la: $(module_role_ducking_la_OBJECTS) $(module_role_ducking_la_DEPENDENCIES) $(EXTRA_module_role_ducking_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_role_ducking_la_LINK) -rpath $(modlibexecdir) $(module_role_ducking_la_OBJECTS) $(module_role_ducking_la_LIBADD) $(LIBS) +modules/rtp/module_rtp_recv_la-module-rtp-recv.lo: \ + modules/rtp/$(am__dirstamp) \ + modules/rtp/$(DEPDIR)/$(am__dirstamp) + +module-rtp-recv.la: $(module_rtp_recv_la_OBJECTS) $(module_rtp_recv_la_DEPENDENCIES) $(EXTRA_module_rtp_recv_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_rtp_recv_la_LINK) $(am_module_rtp_recv_la_rpath) $(module_rtp_recv_la_OBJECTS) $(module_rtp_recv_la_LIBADD) $(LIBS) +modules/rtp/module_rtp_send_la-module-rtp-send.lo: \ + modules/rtp/$(am__dirstamp) \ + modules/rtp/$(DEPDIR)/$(am__dirstamp) + +module-rtp-send.la: $(module_rtp_send_la_OBJECTS) $(module_rtp_send_la_DEPENDENCIES) $(EXTRA_module_rtp_send_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_rtp_send_la_LINK) $(am_module_rtp_send_la_rpath) $(module_rtp_send_la_OBJECTS) $(module_rtp_send_la_LIBADD) $(LIBS) +modules/module_rygel_media_server_la-module-rygel-media-server.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-rygel-media-server.la: $(module_rygel_media_server_la_OBJECTS) $(module_rygel_media_server_la_DEPENDENCIES) $(EXTRA_module_rygel_media_server_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_rygel_media_server_la_LINK) $(am_module_rygel_media_server_la_rpath) $(module_rygel_media_server_la_OBJECTS) $(module_rygel_media_server_la_LIBADD) $(LIBS) +modules/module_simple_protocol_tcp_la-module-protocol-stub.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-simple-protocol-tcp.la: $(module_simple_protocol_tcp_la_OBJECTS) $(module_simple_protocol_tcp_la_DEPENDENCIES) $(EXTRA_module_simple_protocol_tcp_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_simple_protocol_tcp_la_LINK) -rpath $(modlibexecdir) $(module_simple_protocol_tcp_la_OBJECTS) $(module_simple_protocol_tcp_la_LIBADD) $(LIBS) +modules/module_simple_protocol_unix_la-module-protocol-stub.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-simple-protocol-unix.la: $(module_simple_protocol_unix_la_OBJECTS) $(module_simple_protocol_unix_la_DEPENDENCIES) $(EXTRA_module_simple_protocol_unix_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_simple_protocol_unix_la_LINK) $(am_module_simple_protocol_unix_la_rpath) $(module_simple_protocol_unix_la_OBJECTS) $(module_simple_protocol_unix_la_LIBADD) $(LIBS) +modules/module_sine_source_la-module-sine-source.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-sine-source.la: $(module_sine_source_la_OBJECTS) $(module_sine_source_la_DEPENDENCIES) $(EXTRA_module_sine_source_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_sine_source_la_LINK) -rpath $(modlibexecdir) $(module_sine_source_la_OBJECTS) $(module_sine_source_la_LIBADD) $(LIBS) +modules/module_sine_la-module-sine.lo: modules/$(am__dirstamp) \ + modules/$(DEPDIR)/$(am__dirstamp) + +module-sine.la: $(module_sine_la_OBJECTS) $(module_sine_la_DEPENDENCIES) $(EXTRA_module_sine_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_sine_la_LINK) -rpath $(modlibexecdir) $(module_sine_la_OBJECTS) $(module_sine_la_LIBADD) $(LIBS) +modules/module_solaris_la-module-solaris.lo: modules/$(am__dirstamp) \ + modules/$(DEPDIR)/$(am__dirstamp) + +module-solaris.la: $(module_solaris_la_OBJECTS) $(module_solaris_la_DEPENDENCIES) $(EXTRA_module_solaris_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_solaris_la_LINK) $(am_module_solaris_la_rpath) $(module_solaris_la_OBJECTS) $(module_solaris_la_LIBADD) $(LIBS) +modules/module_stream_restore_la-module-stream-restore.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-stream-restore.la: $(module_stream_restore_la_OBJECTS) $(module_stream_restore_la_DEPENDENCIES) $(EXTRA_module_stream_restore_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_stream_restore_la_LINK) -rpath $(modlibexecdir) $(module_stream_restore_la_OBJECTS) $(module_stream_restore_la_LIBADD) $(LIBS) +modules/module_suspend_on_idle_la-module-suspend-on-idle.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-suspend-on-idle.la: $(module_suspend_on_idle_la_OBJECTS) $(module_suspend_on_idle_la_DEPENDENCIES) $(EXTRA_module_suspend_on_idle_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_suspend_on_idle_la_LINK) -rpath $(modlibexecdir) $(module_suspend_on_idle_la_OBJECTS) $(module_suspend_on_idle_la_LIBADD) $(LIBS) +modules/module_switch_on_connect_la-module-switch-on-connect.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-switch-on-connect.la: $(module_switch_on_connect_la_OBJECTS) $(module_switch_on_connect_la_DEPENDENCIES) $(EXTRA_module_switch_on_connect_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_switch_on_connect_la_LINK) -rpath $(modlibexecdir) $(module_switch_on_connect_la_OBJECTS) $(module_switch_on_connect_la_LIBADD) $(LIBS) +modules/module_switch_on_port_available_la-module-switch-on-port-available.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-switch-on-port-available.la: $(module_switch_on_port_available_la_OBJECTS) $(module_switch_on_port_available_la_DEPENDENCIES) $(EXTRA_module_switch_on_port_available_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_switch_on_port_available_la_LINK) -rpath $(modlibexecdir) $(module_switch_on_port_available_la_OBJECTS) $(module_switch_on_port_available_la_LIBADD) $(LIBS) +modules/module_systemd_login_la-module-systemd-login.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-systemd-login.la: $(module_systemd_login_la_OBJECTS) $(module_systemd_login_la_DEPENDENCIES) $(EXTRA_module_systemd_login_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_systemd_login_la_LINK) $(am_module_systemd_login_la_rpath) $(module_systemd_login_la_OBJECTS) $(module_systemd_login_la_LIBADD) $(LIBS) +modules/module_tunnel_sink_new_la-module-tunnel-sink-new.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-tunnel-sink-new.la: $(module_tunnel_sink_new_la_OBJECTS) $(module_tunnel_sink_new_la_DEPENDENCIES) $(EXTRA_module_tunnel_sink_new_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_tunnel_sink_new_la_LINK) -rpath $(modlibexecdir) $(module_tunnel_sink_new_la_OBJECTS) $(module_tunnel_sink_new_la_LIBADD) $(LIBS) +modules/module_tunnel_sink_la-module-tunnel.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-tunnel-sink.la: $(module_tunnel_sink_la_OBJECTS) $(module_tunnel_sink_la_DEPENDENCIES) $(EXTRA_module_tunnel_sink_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_tunnel_sink_la_LINK) -rpath $(modlibexecdir) $(module_tunnel_sink_la_OBJECTS) $(module_tunnel_sink_la_LIBADD) $(LIBS) +modules/module_tunnel_source_new_la-module-tunnel-source-new.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-tunnel-source-new.la: $(module_tunnel_source_new_la_OBJECTS) $(module_tunnel_source_new_la_DEPENDENCIES) $(EXTRA_module_tunnel_source_new_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_tunnel_source_new_la_LINK) -rpath $(modlibexecdir) $(module_tunnel_source_new_la_OBJECTS) $(module_tunnel_source_new_la_LIBADD) $(LIBS) +modules/module_tunnel_source_la-module-tunnel.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-tunnel-source.la: $(module_tunnel_source_la_OBJECTS) $(module_tunnel_source_la_DEPENDENCIES) $(EXTRA_module_tunnel_source_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_tunnel_source_la_LINK) -rpath $(modlibexecdir) $(module_tunnel_source_la_OBJECTS) $(module_tunnel_source_la_LIBADD) $(LIBS) +modules/module_udev_detect_la-module-udev-detect.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-udev-detect.la: $(module_udev_detect_la_OBJECTS) $(module_udev_detect_la_DEPENDENCIES) $(EXTRA_module_udev_detect_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_udev_detect_la_LINK) $(am_module_udev_detect_la_rpath) $(module_udev_detect_la_OBJECTS) $(module_udev_detect_la_LIBADD) $(LIBS) +modules/module_virtual_sink_la-module-virtual-sink.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-virtual-sink.la: $(module_virtual_sink_la_OBJECTS) $(module_virtual_sink_la_DEPENDENCIES) $(EXTRA_module_virtual_sink_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_virtual_sink_la_LINK) -rpath $(modlibexecdir) $(module_virtual_sink_la_OBJECTS) $(module_virtual_sink_la_LIBADD) $(LIBS) +modules/module_virtual_source_la-module-virtual-source.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-virtual-source.la: $(module_virtual_source_la_OBJECTS) $(module_virtual_source_la_DEPENDENCIES) $(EXTRA_module_virtual_source_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_virtual_source_la_LINK) -rpath $(modlibexecdir) $(module_virtual_source_la_OBJECTS) $(module_virtual_source_la_LIBADD) $(LIBS) +modules/module_virtual_surround_sink_la-module-virtual-surround-sink.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-virtual-surround-sink.la: $(module_virtual_surround_sink_la_OBJECTS) $(module_virtual_surround_sink_la_DEPENDENCIES) $(EXTRA_module_virtual_surround_sink_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_virtual_surround_sink_la_LINK) -rpath $(modlibexecdir) $(module_virtual_surround_sink_la_OBJECTS) $(module_virtual_surround_sink_la_LIBADD) $(LIBS) +modules/module_volume_restore_la-module-volume-restore.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-volume-restore.la: $(module_volume_restore_la_OBJECTS) $(module_volume_restore_la_DEPENDENCIES) $(EXTRA_module_volume_restore_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_volume_restore_la_LINK) -rpath $(modlibexecdir) $(module_volume_restore_la_OBJECTS) $(module_volume_restore_la_LIBADD) $(LIBS) +modules/module_waveout_la-module-waveout.lo: modules/$(am__dirstamp) \ + modules/$(DEPDIR)/$(am__dirstamp) + +module-waveout.la: $(module_waveout_la_OBJECTS) $(module_waveout_la_DEPENDENCIES) $(EXTRA_module_waveout_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_waveout_la_LINK) $(am_module_waveout_la_rpath) $(module_waveout_la_OBJECTS) $(module_waveout_la_LIBADD) $(LIBS) +modules/x11/$(am__dirstamp): + @$(MKDIR_P) modules/x11 + @: > modules/x11/$(am__dirstamp) +modules/x11/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) modules/x11/$(DEPDIR) + @: > modules/x11/$(DEPDIR)/$(am__dirstamp) +modules/x11/module_x11_bell_la-module-x11-bell.lo: \ + modules/x11/$(am__dirstamp) \ + modules/x11/$(DEPDIR)/$(am__dirstamp) + +module-x11-bell.la: $(module_x11_bell_la_OBJECTS) $(module_x11_bell_la_DEPENDENCIES) $(EXTRA_module_x11_bell_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_x11_bell_la_LINK) $(am_module_x11_bell_la_rpath) $(module_x11_bell_la_OBJECTS) $(module_x11_bell_la_LIBADD) $(LIBS) +modules/x11/module_x11_cork_request_la-module-x11-cork-request.lo: \ + modules/x11/$(am__dirstamp) \ + modules/x11/$(DEPDIR)/$(am__dirstamp) + +module-x11-cork-request.la: $(module_x11_cork_request_la_OBJECTS) $(module_x11_cork_request_la_DEPENDENCIES) $(EXTRA_module_x11_cork_request_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_x11_cork_request_la_LINK) $(am_module_x11_cork_request_la_rpath) $(module_x11_cork_request_la_OBJECTS) $(module_x11_cork_request_la_LIBADD) $(LIBS) +modules/x11/module_x11_publish_la-module-x11-publish.lo: \ + modules/x11/$(am__dirstamp) \ + modules/x11/$(DEPDIR)/$(am__dirstamp) + +module-x11-publish.la: $(module_x11_publish_la_OBJECTS) $(module_x11_publish_la_DEPENDENCIES) $(EXTRA_module_x11_publish_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_x11_publish_la_LINK) $(am_module_x11_publish_la_rpath) $(module_x11_publish_la_OBJECTS) $(module_x11_publish_la_LIBADD) $(LIBS) +modules/x11/module_x11_xsmp_la-module-x11-xsmp.lo: \ + modules/x11/$(am__dirstamp) \ + modules/x11/$(DEPDIR)/$(am__dirstamp) + +module-x11-xsmp.la: $(module_x11_xsmp_la_OBJECTS) $(module_x11_xsmp_la_DEPENDENCIES) $(EXTRA_module_x11_xsmp_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_x11_xsmp_la_LINK) $(am_module_x11_xsmp_la_rpath) $(module_x11_xsmp_la_OBJECTS) $(module_x11_xsmp_la_LIBADD) $(LIBS) +modules/module_zeroconf_discover_la-module-zeroconf-discover.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-zeroconf-discover.la: $(module_zeroconf_discover_la_OBJECTS) $(module_zeroconf_discover_la_DEPENDENCIES) $(EXTRA_module_zeroconf_discover_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_zeroconf_discover_la_LINK) $(am_module_zeroconf_discover_la_rpath) $(module_zeroconf_discover_la_OBJECTS) $(module_zeroconf_discover_la_LIBADD) $(LIBS) +modules/module_zeroconf_publish_la-module-zeroconf-publish.lo: \ + modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp) + +module-zeroconf-publish.la: $(module_zeroconf_publish_la_OBJECTS) $(module_zeroconf_publish_la_DEPENDENCIES) $(EXTRA_module_zeroconf_publish_la_DEPENDENCIES) + $(AM_V_CCLD)$(module_zeroconf_publish_la_LINK) $(am_module_zeroconf_publish_la_rpath) $(module_zeroconf_publish_la_OBJECTS) $(module_zeroconf_publish_la_LIBADD) $(LIBS) +tests/alsa_mixer_path_test-alsa-mixer-path-test.$(OBJEXT): \ + tests/$(am__dirstamp) tests/$(DEPDIR)/$(am__dirstamp) + +alsa-mixer-path-test$(EXEEXT): $(alsa_mixer_path_test_OBJECTS) $(alsa_mixer_path_test_DEPENDENCIES) $(EXTRA_alsa_mixer_path_test_DEPENDENCIES) + @rm -f alsa-mixer-path-test$(EXEEXT) + $(AM_V_CCLD)$(alsa_mixer_path_test_LINK) $(alsa_mixer_path_test_OBJECTS) $(alsa_mixer_path_test_LDADD) $(LIBS) +tests/alsa_time_test-alsa-time-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +alsa-time-test$(EXEEXT): $(alsa_time_test_OBJECTS) $(alsa_time_test_DEPENDENCIES) $(EXTRA_alsa_time_test_DEPENDENCIES) + @rm -f alsa-time-test$(EXEEXT) + $(AM_V_CCLD)$(alsa_time_test_LINK) $(alsa_time_test_OBJECTS) $(alsa_time_test_LDADD) $(LIBS) +tests/asyncmsgq_test-asyncmsgq-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +asyncmsgq-test$(EXEEXT): $(asyncmsgq_test_OBJECTS) $(asyncmsgq_test_DEPENDENCIES) $(EXTRA_asyncmsgq_test_DEPENDENCIES) + @rm -f asyncmsgq-test$(EXEEXT) + $(AM_V_CCLD)$(asyncmsgq_test_LINK) $(asyncmsgq_test_OBJECTS) $(asyncmsgq_test_LDADD) $(LIBS) +tests/asyncq_test-asyncq-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +asyncq-test$(EXEEXT): $(asyncq_test_OBJECTS) $(asyncq_test_DEPENDENCIES) $(EXTRA_asyncq_test_DEPENDENCIES) + @rm -f asyncq-test$(EXEEXT) + $(AM_V_CCLD)$(asyncq_test_LINK) $(asyncq_test_OBJECTS) $(asyncq_test_LDADD) $(LIBS) +tests/atomic_test-atomic-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +atomic-test$(EXEEXT): $(atomic_test_OBJECTS) $(atomic_test_DEPENDENCIES) $(EXTRA_atomic_test_DEPENDENCIES) + @rm -f atomic-test$(EXEEXT) + $(AM_V_CCLD)$(atomic_test_LINK) $(atomic_test_OBJECTS) $(atomic_test_LDADD) $(LIBS) +tests/channelmap_test-channelmap-test.$(OBJEXT): \ + tests/$(am__dirstamp) tests/$(DEPDIR)/$(am__dirstamp) + +channelmap-test$(EXEEXT): $(channelmap_test_OBJECTS) $(channelmap_test_DEPENDENCIES) $(EXTRA_channelmap_test_DEPENDENCIES) + @rm -f channelmap-test$(EXEEXT) + $(AM_V_CCLD)$(channelmap_test_LINK) $(channelmap_test_OBJECTS) $(channelmap_test_LDADD) $(LIBS) +tests/close_test-close-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +close-test$(EXEEXT): $(close_test_OBJECTS) $(close_test_DEPENDENCIES) $(EXTRA_close_test_DEPENDENCIES) + @rm -f close-test$(EXEEXT) + $(AM_V_CCLD)$(close_test_LINK) $(close_test_OBJECTS) $(close_test_LDADD) $(LIBS) +tests/connect_stress-connect-stress.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +connect-stress$(EXEEXT): $(connect_stress_OBJECTS) $(connect_stress_DEPENDENCIES) $(EXTRA_connect_stress_DEPENDENCIES) + @rm -f connect-stress$(EXEEXT) + $(AM_V_CCLD)$(connect_stress_LINK) $(connect_stress_OBJECTS) $(connect_stress_LDADD) $(LIBS) +tests/core_util_test-core-util-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +core-util-test$(EXEEXT): $(core_util_test_OBJECTS) $(core_util_test_DEPENDENCIES) $(EXTRA_core_util_test_DEPENDENCIES) + @rm -f core-util-test$(EXEEXT) + $(AM_V_CCLD)$(core_util_test_LINK) $(core_util_test_OBJECTS) $(core_util_test_LDADD) $(LIBS) +tests/cpu_mix_test-cpu-mix-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +cpu-mix-test$(EXEEXT): $(cpu_mix_test_OBJECTS) $(cpu_mix_test_DEPENDENCIES) $(EXTRA_cpu_mix_test_DEPENDENCIES) + @rm -f cpu-mix-test$(EXEEXT) + $(AM_V_CCLD)$(cpu_mix_test_LINK) $(cpu_mix_test_OBJECTS) $(cpu_mix_test_LDADD) $(LIBS) +tests/cpu_remap_test-cpu-remap-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +cpu-remap-test$(EXEEXT): $(cpu_remap_test_OBJECTS) $(cpu_remap_test_DEPENDENCIES) $(EXTRA_cpu_remap_test_DEPENDENCIES) + @rm -f cpu-remap-test$(EXEEXT) + $(AM_V_CCLD)$(cpu_remap_test_LINK) $(cpu_remap_test_OBJECTS) $(cpu_remap_test_LDADD) $(LIBS) +tests/cpu_sconv_test-cpu-sconv-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +cpu-sconv-test$(EXEEXT): $(cpu_sconv_test_OBJECTS) $(cpu_sconv_test_DEPENDENCIES) $(EXTRA_cpu_sconv_test_DEPENDENCIES) + @rm -f cpu-sconv-test$(EXEEXT) + $(AM_V_CCLD)$(cpu_sconv_test_LINK) $(cpu_sconv_test_OBJECTS) $(cpu_sconv_test_LDADD) $(LIBS) +tests/cpu_volume_test-cpu-volume-test.$(OBJEXT): \ + tests/$(am__dirstamp) tests/$(DEPDIR)/$(am__dirstamp) + +cpu-volume-test$(EXEEXT): $(cpu_volume_test_OBJECTS) $(cpu_volume_test_DEPENDENCIES) $(EXTRA_cpu_volume_test_DEPENDENCIES) + @rm -f cpu-volume-test$(EXEEXT) + $(AM_V_CCLD)$(cpu_volume_test_LINK) $(cpu_volume_test_OBJECTS) $(cpu_volume_test_LDADD) $(LIBS) +tests/cpulimit_test-cpulimit-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) +daemon/$(am__dirstamp): + @$(MKDIR_P) daemon + @: > daemon/$(am__dirstamp) +daemon/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) daemon/$(DEPDIR) + @: > daemon/$(DEPDIR)/$(am__dirstamp) +daemon/cpulimit_test-cpulimit.$(OBJEXT): daemon/$(am__dirstamp) \ + daemon/$(DEPDIR)/$(am__dirstamp) + +cpulimit-test$(EXEEXT): $(cpulimit_test_OBJECTS) $(cpulimit_test_DEPENDENCIES) $(EXTRA_cpulimit_test_DEPENDENCIES) + @rm -f cpulimit-test$(EXEEXT) + $(AM_V_CCLD)$(cpulimit_test_LINK) $(cpulimit_test_OBJECTS) $(cpulimit_test_LDADD) $(LIBS) +tests/cpulimit_test2-cpulimit-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) +daemon/cpulimit_test2-cpulimit.$(OBJEXT): daemon/$(am__dirstamp) \ + daemon/$(DEPDIR)/$(am__dirstamp) + +cpulimit-test2$(EXEEXT): $(cpulimit_test2_OBJECTS) $(cpulimit_test2_DEPENDENCIES) $(EXTRA_cpulimit_test2_DEPENDENCIES) + @rm -f cpulimit-test2$(EXEEXT) + $(AM_V_CCLD)$(cpulimit_test2_LINK) $(cpulimit_test2_OBJECTS) $(cpulimit_test2_LDADD) $(LIBS) +modules/echo-cancel/echo_cancel_test-module-echo-cancel.$(OBJEXT): \ + modules/echo-cancel/$(am__dirstamp) \ + modules/echo-cancel/$(DEPDIR)/$(am__dirstamp) +modules/echo-cancel/echo_cancel_test-null.$(OBJEXT): \ + modules/echo-cancel/$(am__dirstamp) \ + modules/echo-cancel/$(DEPDIR)/$(am__dirstamp) +modules/echo-cancel/echo_cancel_test-adrian-aec.$(OBJEXT): \ + modules/echo-cancel/$(am__dirstamp) \ + modules/echo-cancel/$(DEPDIR)/$(am__dirstamp) +modules/echo-cancel/echo_cancel_test-adrian.$(OBJEXT): \ + modules/echo-cancel/$(am__dirstamp) \ + modules/echo-cancel/$(DEPDIR)/$(am__dirstamp) +modules/echo-cancel/echo_cancel_test-speex.$(OBJEXT): \ + modules/echo-cancel/$(am__dirstamp) \ + modules/echo-cancel/$(DEPDIR)/$(am__dirstamp) +modules/echo-cancel/echo_cancel_test-adrian-aec-orc-gen.$(OBJEXT): \ + modules/echo-cancel/$(am__dirstamp) \ + modules/echo-cancel/$(DEPDIR)/$(am__dirstamp) + +echo-cancel-test$(EXEEXT): $(echo_cancel_test_OBJECTS) $(echo_cancel_test_DEPENDENCIES) $(EXTRA_echo_cancel_test_DEPENDENCIES) + @rm -f echo-cancel-test$(EXEEXT) + $(AM_V_CCLD)$(echo_cancel_test_LINK) $(echo_cancel_test_OBJECTS) $(echo_cancel_test_LDADD) $(LIBS) +tests/extended_test-extended-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +extended-test$(EXEEXT): $(extended_test_OBJECTS) $(extended_test_DEPENDENCIES) $(EXTRA_extended_test_DEPENDENCIES) + @rm -f extended-test$(EXEEXT) + $(AM_V_CCLD)$(extended_test_LINK) $(extended_test_OBJECTS) $(extended_test_LDADD) $(LIBS) +tests/flist_test-flist-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +flist-test$(EXEEXT): $(flist_test_OBJECTS) $(flist_test_DEPENDENCIES) $(EXTRA_flist_test_DEPENDENCIES) + @rm -f flist-test$(EXEEXT) + $(AM_V_CCLD)$(flist_test_LINK) $(flist_test_OBJECTS) $(flist_test_LDADD) $(LIBS) +tests/format_test-format-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +format-test$(EXEEXT): $(format_test_OBJECTS) $(format_test_DEPENDENCIES) $(EXTRA_format_test_DEPENDENCIES) + @rm -f format-test$(EXEEXT) + $(AM_V_CCLD)$(format_test_LINK) $(format_test_OBJECTS) $(format_test_LDADD) $(LIBS) +modules/gconf/gconf_helper-gconf-helper.$(OBJEXT): \ + modules/gconf/$(am__dirstamp) \ + modules/gconf/$(DEPDIR)/$(am__dirstamp) + +gconf-helper$(EXEEXT): $(gconf_helper_OBJECTS) $(gconf_helper_DEPENDENCIES) $(EXTRA_gconf_helper_DEPENDENCIES) + @rm -f gconf-helper$(EXEEXT) + $(AM_V_CCLD)$(gconf_helper_LINK) $(gconf_helper_OBJECTS) $(gconf_helper_LDADD) $(LIBS) +tests/get_binary_name_test-get-binary-name-test.$(OBJEXT): \ + tests/$(am__dirstamp) tests/$(DEPDIR)/$(am__dirstamp) + +get-binary-name-test$(EXEEXT): $(get_binary_name_test_OBJECTS) $(get_binary_name_test_DEPENDENCIES) $(EXTRA_get_binary_name_test_DEPENDENCIES) + @rm -f get-binary-name-test$(EXEEXT) + $(AM_V_CCLD)$(get_binary_name_test_LINK) $(get_binary_name_test_OBJECTS) $(get_binary_name_test_LDADD) $(LIBS) +modules/gsettings/gsettings_helper-gsettings-helper.$(OBJEXT): \ + modules/gsettings/$(am__dirstamp) \ + modules/gsettings/$(DEPDIR)/$(am__dirstamp) + +gsettings-helper$(EXEEXT): $(gsettings_helper_OBJECTS) $(gsettings_helper_DEPENDENCIES) $(EXTRA_gsettings_helper_DEPENDENCIES) + @rm -f gsettings-helper$(EXEEXT) + $(AM_V_CCLD)$(gsettings_helper_LINK) $(gsettings_helper_OBJECTS) $(gsettings_helper_LDADD) $(LIBS) +tests/gtk_test-gtk-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +gtk-test$(EXEEXT): $(gtk_test_OBJECTS) $(gtk_test_DEPENDENCIES) $(EXTRA_gtk_test_DEPENDENCIES) + @rm -f gtk-test$(EXEEXT) + $(AM_V_CCLD)$(gtk_test_LINK) $(gtk_test_OBJECTS) $(gtk_test_LDADD) $(LIBS) +tests/hashmap_test-hashmap-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +hashmap-test$(EXEEXT): $(hashmap_test_OBJECTS) $(hashmap_test_DEPENDENCIES) $(EXTRA_hashmap_test_DEPENDENCIES) + @rm -f hashmap-test$(EXEEXT) + $(AM_V_CCLD)$(hashmap_test_LINK) $(hashmap_test_OBJECTS) $(hashmap_test_LDADD) $(LIBS) +tests/hook_list_test-hook-list-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +hook-list-test$(EXEEXT): $(hook_list_test_OBJECTS) $(hook_list_test_DEPENDENCIES) $(EXTRA_hook_list_test_DEPENDENCIES) + @rm -f hook-list-test$(EXEEXT) + $(AM_V_CCLD)$(hook_list_test_LINK) $(hook_list_test_OBJECTS) $(hook_list_test_LDADD) $(LIBS) +tests/interpol_test-interpol-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +interpol-test$(EXEEXT): $(interpol_test_OBJECTS) $(interpol_test_DEPENDENCIES) $(EXTRA_interpol_test_DEPENDENCIES) + @rm -f interpol-test$(EXEEXT) + $(AM_V_CCLD)$(interpol_test_LINK) $(interpol_test_OBJECTS) $(interpol_test_LDADD) $(LIBS) +tests/ipacl_test-ipacl-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +ipacl-test$(EXEEXT): $(ipacl_test_OBJECTS) $(ipacl_test_DEPENDENCIES) $(EXTRA_ipacl_test_DEPENDENCIES) + @rm -f ipacl-test$(EXEEXT) + $(AM_V_CCLD)$(ipacl_test_LINK) $(ipacl_test_OBJECTS) $(ipacl_test_LDADD) $(LIBS) +tests/json_test-json-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +json-test$(EXEEXT): $(json_test_OBJECTS) $(json_test_DEPENDENCIES) $(EXTRA_json_test_DEPENDENCIES) + @rm -f json-test$(EXEEXT) + $(AM_V_CCLD)$(json_test_LINK) $(json_test_OBJECTS) $(json_test_LDADD) $(LIBS) +tests/lfe_filter_test-lfe-filter-test.$(OBJEXT): \ + tests/$(am__dirstamp) tests/$(DEPDIR)/$(am__dirstamp) + +lfe-filter-test$(EXEEXT): $(lfe_filter_test_OBJECTS) $(lfe_filter_test_DEPENDENCIES) $(EXTRA_lfe_filter_test_DEPENDENCIES) + @rm -f lfe-filter-test$(EXEEXT) + $(AM_V_CCLD)$(lfe_filter_test_LINK) $(lfe_filter_test_OBJECTS) $(lfe_filter_test_LDADD) $(LIBS) +tests/lo_latency_test-lo-latency-test.$(OBJEXT): \ + tests/$(am__dirstamp) tests/$(DEPDIR)/$(am__dirstamp) + +lo-latency-test$(EXEEXT): $(lo_latency_test_OBJECTS) $(lo_latency_test_DEPENDENCIES) $(EXTRA_lo_latency_test_DEPENDENCIES) + @rm -f lo-latency-test$(EXEEXT) + $(AM_V_CCLD)$(lo_latency_test_LINK) $(lo_latency_test_OBJECTS) $(lo_latency_test_LDADD) $(LIBS) +tests/lock_autospawn_test-lock-autospawn-test.$(OBJEXT): \ + tests/$(am__dirstamp) tests/$(DEPDIR)/$(am__dirstamp) + +lock-autospawn-test$(EXEEXT): $(lock_autospawn_test_OBJECTS) $(lock_autospawn_test_DEPENDENCIES) $(EXTRA_lock_autospawn_test_DEPENDENCIES) + @rm -f lock-autospawn-test$(EXEEXT) + $(AM_V_CCLD)$(lock_autospawn_test_LINK) $(lock_autospawn_test_OBJECTS) $(lock_autospawn_test_LDADD) $(LIBS) +tests/mainloop_test-mainloop-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +mainloop-test$(EXEEXT): $(mainloop_test_OBJECTS) $(mainloop_test_DEPENDENCIES) $(EXTRA_mainloop_test_DEPENDENCIES) + @rm -f mainloop-test$(EXEEXT) + $(AM_V_CCLD)$(mainloop_test_LINK) $(mainloop_test_OBJECTS) $(mainloop_test_LDADD) $(LIBS) +tests/mainloop_test_glib-mainloop-test.$(OBJEXT): \ + tests/$(am__dirstamp) tests/$(DEPDIR)/$(am__dirstamp) + +mainloop-test-glib$(EXEEXT): $(mainloop_test_glib_OBJECTS) $(mainloop_test_glib_DEPENDENCIES) $(EXTRA_mainloop_test_glib_DEPENDENCIES) + @rm -f mainloop-test-glib$(EXEEXT) + $(AM_V_CCLD)$(mainloop_test_glib_LINK) $(mainloop_test_glib_OBJECTS) $(mainloop_test_glib_LDADD) $(LIBS) +tests/mcalign_test-mcalign-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +mcalign-test$(EXEEXT): $(mcalign_test_OBJECTS) $(mcalign_test_DEPENDENCIES) $(EXTRA_mcalign_test_DEPENDENCIES) + @rm -f mcalign-test$(EXEEXT) + $(AM_V_CCLD)$(mcalign_test_LINK) $(mcalign_test_OBJECTS) $(mcalign_test_LDADD) $(LIBS) +tests/memblock_test-memblock-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +memblock-test$(EXEEXT): $(memblock_test_OBJECTS) $(memblock_test_DEPENDENCIES) $(EXTRA_memblock_test_DEPENDENCIES) + @rm -f memblock-test$(EXEEXT) + $(AM_V_CCLD)$(memblock_test_LINK) $(memblock_test_OBJECTS) $(memblock_test_LDADD) $(LIBS) +tests/memblockq_test-memblockq-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +memblockq-test$(EXEEXT): $(memblockq_test_OBJECTS) $(memblockq_test_DEPENDENCIES) $(EXTRA_memblockq_test_DEPENDENCIES) + @rm -f memblockq-test$(EXEEXT) + $(AM_V_CCLD)$(memblockq_test_LINK) $(memblockq_test_OBJECTS) $(memblockq_test_LDADD) $(LIBS) +tests/mix_test-mix-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +mix-test$(EXEEXT): $(mix_test_OBJECTS) $(mix_test_DEPENDENCIES) $(EXTRA_mix_test_DEPENDENCIES) + @rm -f mix-test$(EXEEXT) + $(AM_V_CCLD)$(mix_test_LINK) $(mix_test_OBJECTS) $(mix_test_LDADD) $(LIBS) +tests/mult_s16_test-mult-s16-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +mult-s16-test$(EXEEXT): $(mult_s16_test_OBJECTS) $(mult_s16_test_DEPENDENCIES) $(EXTRA_mult_s16_test_DEPENDENCIES) + @rm -f mult-s16-test$(EXEEXT) + $(AM_V_CCLD)$(mult_s16_test_LINK) $(mult_s16_test_OBJECTS) $(mult_s16_test_LDADD) $(LIBS) +tests/once_test-once-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +once-test$(EXEEXT): $(once_test_OBJECTS) $(once_test_DEPENDENCIES) $(EXTRA_once_test_DEPENDENCIES) + @rm -f once-test$(EXEEXT) + $(AM_V_CCLD)$(once_test_LINK) $(once_test_OBJECTS) $(once_test_LDADD) $(LIBS) +utils/pacat-pacat.$(OBJEXT): utils/$(am__dirstamp) \ + utils/$(DEPDIR)/$(am__dirstamp) + +pacat$(EXEEXT): $(pacat_OBJECTS) $(pacat_DEPENDENCIES) $(EXTRA_pacat_DEPENDENCIES) + @rm -f pacat$(EXEEXT) + $(AM_V_CCLD)$(pacat_LINK) $(pacat_OBJECTS) $(pacat_LDADD) $(LIBS) +tests/pacat_simple-pacat-simple.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +pacat-simple$(EXEEXT): $(pacat_simple_OBJECTS) $(pacat_simple_DEPENDENCIES) $(EXTRA_pacat_simple_DEPENDENCIES) + @rm -f pacat-simple$(EXEEXT) + $(AM_V_CCLD)$(pacat_simple_LINK) $(pacat_simple_OBJECTS) $(pacat_simple_LDADD) $(LIBS) +utils/pacmd-pacmd.$(OBJEXT): utils/$(am__dirstamp) \ + utils/$(DEPDIR)/$(am__dirstamp) + +pacmd$(EXEEXT): $(pacmd_OBJECTS) $(pacmd_DEPENDENCIES) $(EXTRA_pacmd_DEPENDENCIES) + @rm -f pacmd$(EXEEXT) + $(AM_V_CCLD)$(pacmd_LINK) $(pacmd_OBJECTS) $(pacmd_LDADD) $(LIBS) +utils/pactl-pactl.$(OBJEXT): utils/$(am__dirstamp) \ + utils/$(DEPDIR)/$(am__dirstamp) + +pactl$(EXEEXT): $(pactl_OBJECTS) $(pactl_DEPENDENCIES) $(EXTRA_pactl_DEPENDENCIES) + @rm -f pactl$(EXEEXT) + $(AM_V_CCLD)$(pactl_LINK) $(pactl_OBJECTS) $(pactl_LDADD) $(LIBS) +tests/parec_simple-parec-simple.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +parec-simple$(EXEEXT): $(parec_simple_OBJECTS) $(parec_simple_DEPENDENCIES) $(EXTRA_parec_simple_DEPENDENCIES) + @rm -f parec-simple$(EXEEXT) + $(AM_V_CCLD)$(parec_simple_LINK) $(parec_simple_OBJECTS) $(parec_simple_LDADD) $(LIBS) +tests/passthrough_test-passthrough-test.$(OBJEXT): \ + tests/$(am__dirstamp) tests/$(DEPDIR)/$(am__dirstamp) + +passthrough-test$(EXEEXT): $(passthrough_test_OBJECTS) $(passthrough_test_DEPENDENCIES) $(EXTRA_passthrough_test_DEPENDENCIES) + @rm -f passthrough-test$(EXEEXT) + $(AM_V_CCLD)$(passthrough_test_LINK) $(passthrough_test_OBJECTS) $(passthrough_test_LDADD) $(LIBS) +utils/pasuspender-pasuspender.$(OBJEXT): utils/$(am__dirstamp) \ + utils/$(DEPDIR)/$(am__dirstamp) + +pasuspender$(EXEEXT): $(pasuspender_OBJECTS) $(pasuspender_DEPENDENCIES) $(EXTRA_pasuspender_DEPENDENCIES) + @rm -f pasuspender$(EXEEXT) + $(AM_V_CCLD)$(pasuspender_LINK) $(pasuspender_OBJECTS) $(pasuspender_LDADD) $(LIBS) +utils/pax11publish-pax11publish.$(OBJEXT): utils/$(am__dirstamp) \ + utils/$(DEPDIR)/$(am__dirstamp) + +pax11publish$(EXEEXT): $(pax11publish_OBJECTS) $(pax11publish_DEPENDENCIES) $(EXTRA_pax11publish_DEPENDENCIES) + @rm -f pax11publish$(EXEEXT) + $(AM_V_CCLD)$(pax11publish_LINK) $(pax11publish_OBJECTS) $(pax11publish_LDADD) $(LIBS) +tests/proplist_test-proplist-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +proplist-test$(EXEEXT): $(proplist_test_OBJECTS) $(proplist_test_DEPENDENCIES) $(EXTRA_proplist_test_DEPENDENCIES) + @rm -f proplist-test$(EXEEXT) + $(AM_V_CCLD)$(proplist_test_LINK) $(proplist_test_OBJECTS) $(proplist_test_LDADD) $(LIBS) +daemon/pulseaudio-caps.$(OBJEXT): daemon/$(am__dirstamp) \ + daemon/$(DEPDIR)/$(am__dirstamp) +daemon/pulseaudio-cmdline.$(OBJEXT): daemon/$(am__dirstamp) \ + daemon/$(DEPDIR)/$(am__dirstamp) +daemon/pulseaudio-cpulimit.$(OBJEXT): daemon/$(am__dirstamp) \ + daemon/$(DEPDIR)/$(am__dirstamp) +daemon/pulseaudio-daemon-conf.$(OBJEXT): daemon/$(am__dirstamp) \ + daemon/$(DEPDIR)/$(am__dirstamp) +daemon/pulseaudio-dumpmodules.$(OBJEXT): daemon/$(am__dirstamp) \ + daemon/$(DEPDIR)/$(am__dirstamp) +daemon/pulseaudio-ltdl-bind-now.$(OBJEXT): daemon/$(am__dirstamp) \ + daemon/$(DEPDIR)/$(am__dirstamp) +daemon/pulseaudio-main.$(OBJEXT): daemon/$(am__dirstamp) \ + daemon/$(DEPDIR)/$(am__dirstamp) +daemon/pulseaudio-server-lookup.$(OBJEXT): daemon/$(am__dirstamp) \ + daemon/$(DEPDIR)/$(am__dirstamp) + +pulseaudio$(EXEEXT): $(pulseaudio_OBJECTS) $(pulseaudio_DEPENDENCIES) $(EXTRA_pulseaudio_DEPENDENCIES) + @rm -f pulseaudio$(EXEEXT) + $(AM_V_CCLD)$(pulseaudio_LINK) $(pulseaudio_OBJECTS) $(pulseaudio_LDADD) $(LIBS) +tests/queue_test-queue-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +queue-test$(EXEEXT): $(queue_test_OBJECTS) $(queue_test_DEPENDENCIES) $(EXTRA_queue_test_DEPENDENCIES) + @rm -f queue-test$(EXEEXT) + $(AM_V_CCLD)$(queue_test_LINK) $(queue_test_OBJECTS) $(queue_test_LDADD) $(LIBS) +tests/remix_test-remix-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +remix-test$(EXEEXT): $(remix_test_OBJECTS) $(remix_test_DEPENDENCIES) $(EXTRA_remix_test_DEPENDENCIES) + @rm -f remix-test$(EXEEXT) + $(AM_V_CCLD)$(remix_test_LINK) $(remix_test_OBJECTS) $(remix_test_LDADD) $(LIBS) +tests/resampler_test-resampler-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +resampler-test$(EXEEXT): $(resampler_test_OBJECTS) $(resampler_test_DEPENDENCIES) $(EXTRA_resampler_test_DEPENDENCIES) + @rm -f resampler-test$(EXEEXT) + $(AM_V_CCLD)$(resampler_test_LINK) $(resampler_test_OBJECTS) $(resampler_test_LDADD) $(LIBS) +tests/rtpoll_test-rtpoll-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +rtpoll-test$(EXEEXT): $(rtpoll_test_OBJECTS) $(rtpoll_test_DEPENDENCIES) $(EXTRA_rtpoll_test_DEPENDENCIES) + @rm -f rtpoll-test$(EXEEXT) + $(AM_V_CCLD)$(rtpoll_test_LINK) $(rtpoll_test_OBJECTS) $(rtpoll_test_LDADD) $(LIBS) +tests/rtstutter-rtstutter.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +rtstutter$(EXEEXT): $(rtstutter_OBJECTS) $(rtstutter_DEPENDENCIES) $(EXTRA_rtstutter_DEPENDENCIES) + @rm -f rtstutter$(EXEEXT) + $(AM_V_CCLD)$(rtstutter_LINK) $(rtstutter_OBJECTS) $(rtstutter_LDADD) $(LIBS) +tests/sig2str_test-sig2str-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +sig2str-test$(EXEEXT): $(sig2str_test_OBJECTS) $(sig2str_test_DEPENDENCIES) $(EXTRA_sig2str_test_DEPENDENCIES) + @rm -f sig2str-test$(EXEEXT) + $(AM_V_CCLD)$(sig2str_test_LINK) $(sig2str_test_OBJECTS) $(sig2str_test_LDADD) $(LIBS) +tests/sigbus_test-sigbus-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +sigbus-test$(EXEEXT): $(sigbus_test_OBJECTS) $(sigbus_test_DEPENDENCIES) $(EXTRA_sigbus_test_DEPENDENCIES) + @rm -f sigbus-test$(EXEEXT) + $(AM_V_CCLD)$(sigbus_test_LINK) $(sigbus_test_OBJECTS) $(sigbus_test_LDADD) $(LIBS) +tests/smoother_test-smoother-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +smoother-test$(EXEEXT): $(smoother_test_OBJECTS) $(smoother_test_DEPENDENCIES) $(EXTRA_smoother_test_DEPENDENCIES) + @rm -f smoother-test$(EXEEXT) + $(AM_V_CCLD)$(smoother_test_LINK) $(smoother_test_OBJECTS) $(smoother_test_LDADD) $(LIBS) +tests/srbchannel_test-srbchannel-test.$(OBJEXT): \ + tests/$(am__dirstamp) tests/$(DEPDIR)/$(am__dirstamp) + +srbchannel-test$(EXEEXT): $(srbchannel_test_OBJECTS) $(srbchannel_test_DEPENDENCIES) $(EXTRA_srbchannel_test_DEPENDENCIES) + @rm -f srbchannel-test$(EXEEXT) + $(AM_V_CCLD)$(srbchannel_test_LINK) $(srbchannel_test_OBJECTS) $(srbchannel_test_LDADD) $(LIBS) +tests/stripnul-stripnul.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +stripnul$(EXEEXT): $(stripnul_OBJECTS) $(stripnul_DEPENDENCIES) $(EXTRA_stripnul_DEPENDENCIES) + @rm -f stripnul$(EXEEXT) + $(AM_V_CCLD)$(stripnul_LINK) $(stripnul_OBJECTS) $(stripnul_LDADD) $(LIBS) +tests/strlist_test-strlist-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +strlist-test$(EXEEXT): $(strlist_test_OBJECTS) $(strlist_test_DEPENDENCIES) $(EXTRA_strlist_test_DEPENDENCIES) + @rm -f strlist-test$(EXEEXT) + $(AM_V_CCLD)$(strlist_test_LINK) $(strlist_test_OBJECTS) $(strlist_test_LDADD) $(LIBS) +tests/sync_playback-sync-playback.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +sync-playback$(EXEEXT): $(sync_playback_OBJECTS) $(sync_playback_DEPENDENCIES) $(EXTRA_sync_playback_DEPENDENCIES) + @rm -f sync-playback$(EXEEXT) + $(AM_V_CCLD)$(sync_playback_LINK) $(sync_playback_OBJECTS) $(sync_playback_LDADD) $(LIBS) +tests/thread_mainloop_test-thread-mainloop-test.$(OBJEXT): \ + tests/$(am__dirstamp) tests/$(DEPDIR)/$(am__dirstamp) + +thread-mainloop-test$(EXEEXT): $(thread_mainloop_test_OBJECTS) $(thread_mainloop_test_DEPENDENCIES) $(EXTRA_thread_mainloop_test_DEPENDENCIES) + @rm -f thread-mainloop-test$(EXEEXT) + $(AM_V_CCLD)$(thread_mainloop_test_LINK) $(thread_mainloop_test_OBJECTS) $(thread_mainloop_test_LDADD) $(LIBS) +tests/thread_test-thread-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +thread-test$(EXEEXT): $(thread_test_OBJECTS) $(thread_test_DEPENDENCIES) $(EXTRA_thread_test_DEPENDENCIES) + @rm -f thread-test$(EXEEXT) + $(AM_V_CCLD)$(thread_test_LINK) $(thread_test_OBJECTS) $(thread_test_LDADD) $(LIBS) +tests/usergroup_test-usergroup-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +usergroup-test$(EXEEXT): $(usergroup_test_OBJECTS) $(usergroup_test_DEPENDENCIES) $(EXTRA_usergroup_test_DEPENDENCIES) + @rm -f usergroup-test$(EXEEXT) + $(AM_V_CCLD)$(usergroup_test_LINK) $(usergroup_test_OBJECTS) $(usergroup_test_LDADD) $(LIBS) +tests/utf8_test-utf8-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +utf8-test$(EXEEXT): $(utf8_test_OBJECTS) $(utf8_test_DEPENDENCIES) $(EXTRA_utf8_test_DEPENDENCIES) + @rm -f utf8-test$(EXEEXT) + $(AM_V_CCLD)$(utf8_test_LINK) $(utf8_test_OBJECTS) $(utf8_test_LDADD) $(LIBS) +tests/volume_test-volume-test.$(OBJEXT): tests/$(am__dirstamp) \ + tests/$(DEPDIR)/$(am__dirstamp) + +volume-test$(EXEEXT): $(volume_test_OBJECTS) $(volume_test_DEPENDENCIES) $(EXTRA_volume_test_DEPENDENCIES) + @rm -f volume-test$(EXEEXT) + $(AM_V_CCLD)$(volume_test_LINK) $(volume_test_OBJECTS) $(volume_test_LDADD) $(LIBS) +install-binSCRIPTS: $(bin_SCRIPTS) + @$(NORMAL_INSTALL) + @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n' \ + -e 'h;s|.*|.|' \ + -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) { files[d] = files[d] " " $$1; \ + if (++n[d] == $(am__install_max)) { \ + print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ + else { print "f", d "/" $$4, $$1 } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 's,.*/,,;$(transform)'`; \ + dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f daemon/*.$(OBJEXT) + -rm -f modules/*.$(OBJEXT) + -rm -f modules/*.lo + -rm -f modules/alsa/*.$(OBJEXT) + -rm -f modules/alsa/*.lo + -rm -f modules/bluetooth/*.$(OBJEXT) + -rm -f modules/bluetooth/*.lo + -rm -f modules/dbus/*.$(OBJEXT) + -rm -f modules/dbus/*.lo + -rm -f modules/echo-cancel/*.$(OBJEXT) + -rm -f modules/echo-cancel/*.lo + -rm -f modules/gconf/*.$(OBJEXT) + -rm -f modules/gconf/*.lo + -rm -f modules/gsettings/*.$(OBJEXT) + -rm -f modules/gsettings/*.lo + -rm -f modules/jack/*.$(OBJEXT) + -rm -f modules/jack/*.lo + -rm -f modules/macosx/*.$(OBJEXT) + -rm -f modules/macosx/*.lo + -rm -f modules/oss/*.$(OBJEXT) + -rm -f modules/oss/*.lo + -rm -f modules/raop/*.$(OBJEXT) + -rm -f modules/raop/*.lo + -rm -f modules/rtp/*.$(OBJEXT) + -rm -f modules/rtp/*.lo + -rm -f modules/x11/*.$(OBJEXT) + -rm -f modules/x11/*.lo + -rm -f pulse/*.$(OBJEXT) + -rm -f pulse/*.lo + -rm -f pulsecore/*.$(OBJEXT) + -rm -f pulsecore/*.lo + -rm -f pulsecore/ffmpeg/*.$(OBJEXT) + -rm -f pulsecore/ffmpeg/*.lo + -rm -f pulsecore/filter/*.$(OBJEXT) + -rm -f pulsecore/filter/*.lo + -rm -f pulsecore/resampler/*.$(OBJEXT) + -rm -f pulsecore/resampler/*.lo + -rm -f tests/*.$(OBJEXT) + -rm -f tests/*.lo + -rm -f utils/*.$(OBJEXT) + -rm -f utils/*.lo + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@daemon/$(DEPDIR)/cpulimit_test-cpulimit.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@daemon/$(DEPDIR)/cpulimit_test2-cpulimit.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@daemon/$(DEPDIR)/pulseaudio-caps.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@daemon/$(DEPDIR)/pulseaudio-cmdline.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@daemon/$(DEPDIR)/pulseaudio-cpulimit.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@daemon/$(DEPDIR)/pulseaudio-daemon-conf.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@daemon/$(DEPDIR)/pulseaudio-dumpmodules.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@daemon/$(DEPDIR)/pulseaudio-ltdl-bind-now.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@daemon/$(DEPDIR)/pulseaudio-main.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@daemon/$(DEPDIR)/pulseaudio-server-lookup.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/libalsa_util_la-reserve-monitor.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/libalsa_util_la-reserve-wrap.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/libalsa_util_la-reserve.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/libalsa_util_la-udev-util.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_allow_passthrough_la-module-allow-passthrough.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_always_sink_la-module-always-sink.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_always_source_la-module-always-source.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_augment_properties_la-module-augment-properties.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_card_restore_la-module-card-restore.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_cli_la-module-cli.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_cli_protocol_tcp_la-module-protocol-stub.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_cli_protocol_unix_la-module-protocol-stub.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_combine_la-module-combine.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_combine_sink_la-module-combine-sink.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_console_kit_la-module-console-kit.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_default_device_restore_la-module-default-device-restore.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_detect_la-module-detect.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_device_manager_la-module-device-manager.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_device_restore_la-module-device-restore.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_equalizer_sink_la-module-equalizer-sink.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_esound_compat_spawnfd_la-module-esound-compat-spawnfd.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_esound_compat_spawnpid_la-module-esound-compat-spawnpid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_esound_protocol_tcp_la-module-protocol-stub.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_esound_protocol_unix_la-module-protocol-stub.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_esound_sink_la-module-esound-sink.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_filter_apply_la-module-filter-apply.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_filter_heuristics_la-module-filter-heuristics.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_gconf_la-stdin-util.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_gsettings_la-stdin-util.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_hal_detect_la-module-hal-detect-compat.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_http_protocol_tcp_la-module-protocol-stub.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_http_protocol_unix_la-module-protocol-stub.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_intended_roles_la-module-intended-roles.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_ladspa_sink_la-module-ladspa-sink.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_lirc_la-module-lirc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_loopback_la-module-loopback.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_match_la-module-match.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_mmkbd_evdev_la-module-mmkbd-evdev.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_native_protocol_fd_la-module-native-protocol-fd.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_native_protocol_tcp_la-module-protocol-stub.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_native_protocol_unix_la-module-protocol-stub.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_null_sink_la-module-null-sink.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_null_source_la-module-null-source.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_pipe_sink_la-module-pipe-sink.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_pipe_source_la-module-pipe-source.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_position_event_sounds_la-module-position-event-sounds.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_remap_sink_la-module-remap-sink.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_remap_source_la-module-remap-source.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_rescue_streams_la-module-rescue-streams.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_role_cork_la-module-role-cork.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_role_cork_la-stream-interaction.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_role_ducking_la-module-role-ducking.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_role_ducking_la-stream-interaction.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_rygel_media_server_la-module-rygel-media-server.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_simple_protocol_tcp_la-module-protocol-stub.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_simple_protocol_unix_la-module-protocol-stub.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_sine_la-module-sine.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_sine_source_la-module-sine-source.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_solaris_la-module-solaris.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_stream_restore_la-module-stream-restore.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_suspend_on_idle_la-module-suspend-on-idle.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_switch_on_connect_la-module-switch-on-connect.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_switch_on_port_available_la-module-switch-on-port-available.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_systemd_login_la-module-systemd-login.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_tunnel_sink_la-module-tunnel.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_tunnel_sink_new_la-module-tunnel-sink-new.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_tunnel_source_la-module-tunnel.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_tunnel_source_new_la-module-tunnel-source-new.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_udev_detect_la-module-udev-detect.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_virtual_sink_la-module-virtual-sink.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_virtual_source_la-module-virtual-source.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_virtual_surround_sink_la-module-virtual-surround-sink.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_volume_restore_la-module-volume-restore.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_waveout_la-module-waveout.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_zeroconf_discover_la-module-zeroconf-discover.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/$(DEPDIR)/module_zeroconf_publish_la-module-zeroconf-publish.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-mixer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-sink.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-source.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-ucm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-util.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/alsa/$(DEPDIR)/module_alsa_card_la-module-alsa-card.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/alsa/$(DEPDIR)/module_alsa_sink_la-module-alsa-sink.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/alsa/$(DEPDIR)/module_alsa_source_la-module-alsa-source.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/bluetooth/$(DEPDIR)/libbluez5_util_la-a2dp-codec-sbc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/bluetooth/$(DEPDIR)/libbluez5_util_la-a2dp-codec-util.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/bluetooth/$(DEPDIR)/libbluez5_util_la-backend-native.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/bluetooth/$(DEPDIR)/libbluez5_util_la-backend-ofono.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/bluetooth/$(DEPDIR)/libbluez5_util_la-bluez5-util.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/bluetooth/$(DEPDIR)/module_bluetooth_discover_la-module-bluetooth-discover.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/bluetooth/$(DEPDIR)/module_bluetooth_policy_la-module-bluetooth-policy.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/bluetooth/$(DEPDIR)/module_bluez5_device_la-module-bluez5-device.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/bluetooth/$(DEPDIR)/module_bluez5_discover_la-module-bluez5-discover.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-card-profile.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-card.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-client.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-core.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-device-port.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-device.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-memstats.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-module.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-sample.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-stream.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/dbus/$(DEPDIR)/module_dbus_protocol_la-module-dbus-protocol.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian-aec-orc-gen.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian-aec.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/echo-cancel/$(DEPDIR)/echo_cancel_test-module-echo-cancel.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/echo-cancel/$(DEPDIR)/echo_cancel_test-null.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/echo-cancel/$(DEPDIR)/echo_cancel_test-speex.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/echo-cancel/$(DEPDIR)/libwebrtc_util_la-webrtc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-adrian-aec-orc-gen.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-adrian-aec.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-adrian.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-module-echo-cancel.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-null.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-speex.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/gconf/$(DEPDIR)/gconf_helper-gconf-helper.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/gconf/$(DEPDIR)/module_gconf_la-module-gconf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/gsettings/$(DEPDIR)/gsettings_helper-gsettings-helper.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/gsettings/$(DEPDIR)/module_gsettings_la-module-gsettings.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/jack/$(DEPDIR)/module_jack_sink_la-module-jack-sink.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/jack/$(DEPDIR)/module_jack_source_la-module-jack-source.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/jack/$(DEPDIR)/module_jackdbus_detect_la-module-jackdbus-detect.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/macosx/$(DEPDIR)/module_bonjour_publish_la-module-bonjour-publish.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/macosx/$(DEPDIR)/module_coreaudio_detect_la-module-coreaudio-detect.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/macosx/$(DEPDIR)/module_coreaudio_device_la-module-coreaudio-device.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/oss/$(DEPDIR)/module_oss_la-module-oss.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/oss/$(DEPDIR)/oss-util.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/raop/$(DEPDIR)/libraop_la-raop-client.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/raop/$(DEPDIR)/libraop_la-raop-crypto.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/raop/$(DEPDIR)/libraop_la-raop-packet-buffer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/raop/$(DEPDIR)/libraop_la-raop-sink.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/raop/$(DEPDIR)/libraop_la-raop-util.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/raop/$(DEPDIR)/module_raop_discover_la-module-raop-discover.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/raop/$(DEPDIR)/module_raop_sink_la-module-raop-sink.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/rtp/$(DEPDIR)/librtp_la-headerlist.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/rtp/$(DEPDIR)/librtp_la-rtp-common.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/rtp/$(DEPDIR)/librtp_la-rtp-gstreamer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/rtp/$(DEPDIR)/librtp_la-rtp-native.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/rtp/$(DEPDIR)/librtp_la-rtsp_client.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/rtp/$(DEPDIR)/librtp_la-sap.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/rtp/$(DEPDIR)/librtp_la-sdp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/rtp/$(DEPDIR)/module_rtp_recv_la-module-rtp-recv.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/rtp/$(DEPDIR)/module_rtp_send_la-module-rtp-send.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/x11/$(DEPDIR)/module_x11_bell_la-module-x11-bell.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/x11/$(DEPDIR)/module_x11_cork_request_la-module-x11-cork-request.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/x11/$(DEPDIR)/module_x11_publish_la-module-x11-publish.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@modules/x11/$(DEPDIR)/module_x11_xsmp_la-module-x11-xsmp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-channelmap.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-context.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-direction.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-error.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-ext-device-manager.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-ext-device-restore.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-ext-stream-restore.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-format.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-introspect.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-mainloop-api.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-mainloop-signal.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-mainloop.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-operation.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-proplist.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-rtclock.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-sample.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-scache.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-stream.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-subscribe.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-thread-mainloop.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-timeval.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-utf8.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-util.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-volume.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_la-xmalloc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_mainloop_glib_la-glib-mainloop.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulse_simple_la-simple.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-channelmap.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-client-conf-x11.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-client-conf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-fork-detect.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-format.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-json.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-proplist.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-rtclock.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-sample.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-timeval.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-utf8.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-util.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-volume.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-xmalloc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/cli.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libavahi_wrap_la-avahi-wrap.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libprotocol_native_la-protocol-native.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-arpa-inet.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-aupdate.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-authkey.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-bitset.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-conf-parser.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-error.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-format.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-rtclock.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-util.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-dbus-util.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-dllmain.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-dynarray.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-fdsem.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-flist.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-g711.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-hashmap.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-i18n.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-idxset.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-iochannel.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-ioline.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-ipacl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-lock-autospawn.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-log.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-mcalign.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memblock.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memblockq.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memchunk.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memtrap.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-mutex-posix.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-mutex-win32.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-native-common.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-once.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-packet.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-parseaddr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pdispatch.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pipe.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-poll-posix.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-poll-win32.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-proplist-util.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pstream-util.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pstream.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-queue.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-random.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-ratelimit.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-rtkit.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-sample-util.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-osx.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-posix.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-win32.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-shm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-sndfile-util.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-socket-client.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-socket-server.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-socket-util.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-srbchannel.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-strbuf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-strlist.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-tagstruct.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-thread-posix.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-thread-win32.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-time-smoother.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-tokenizer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-usergroup.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-x11prop.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-asyncmsgq.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-asyncq.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-auth-cookie.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-card.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cli-command.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cli-text.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-client.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-core-scache.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-core-subscribe.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-core.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu-arm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu-orc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu-x86.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database-gdbm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database-simple.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database-tdb.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-dbus-shared.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-device-port.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-hook-list.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-ltdl-helper.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-message-handler.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-mix.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-modargs.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-modinfo.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-module.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-msgobject.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-namereg.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-object.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-play-memblockq.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-play-memchunk.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-protocol-dbus.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-remap.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-remap_mmx.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-remap_sse.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-resampler.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-rtpoll.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16be.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16le.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv_sse.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-shared.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sink-input.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sink.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sioman.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sound-file-stream.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sound-file.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-source-output.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-source.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-start-child.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-stream-util.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume-orc-gen.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_arm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_c.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_mmx.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_orc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_sse.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-thread-mq.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-x11wrap.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_mix_neon_la-mix_neon.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_remap_neon_la-remap_neon.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/libpulsecore_sconv_neon_la-sconv_neon.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/mime-type.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/protocol-cli.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/protocol-esound.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/protocol-http.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/$(DEPDIR)/protocol-simple.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/ffmpeg/$(DEPDIR)/libpulsecore_foreign_la-resample2.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/filter/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-biquad.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/filter/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-crossover.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/filter/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-lfe-filter.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-ffmpeg.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-libsamplerate.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-peaks.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-soxr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-speex.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-trivial.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/alsa_mixer_path_test-alsa-mixer-path-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/alsa_time_test-alsa-time-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/asyncmsgq_test-asyncmsgq-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/asyncq_test-asyncq-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/atomic_test-atomic-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/channelmap_test-channelmap-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/close_test-close-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/connect_stress-connect-stress.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/core_util_test-core-util-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/cpu_mix_test-cpu-mix-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/cpu_remap_test-cpu-remap-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/cpu_sconv_test-cpu-sconv-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/cpu_volume_test-cpu-volume-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/cpulimit_test-cpulimit-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/cpulimit_test2-cpulimit-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/extended_test-extended-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/flist_test-flist-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/format_test-format-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/get_binary_name_test-get-binary-name-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/gtk_test-gtk-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/hashmap_test-hashmap-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/hook_list_test-hook-list-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/interpol_test-interpol-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/ipacl_test-ipacl-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/json_test-json-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/lfe_filter_test-lfe-filter-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/lo-test-util.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/lo_latency_test-lo-latency-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/lock_autospawn_test-lock-autospawn-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/mainloop_test-mainloop-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/mainloop_test_glib-mainloop-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/mcalign_test-mcalign-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/memblock_test-memblock-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/memblockq_test-memblockq-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/mix_test-mix-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/mult_s16_test-mult-s16-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/once_test-once-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/pacat_simple-pacat-simple.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/parec_simple-parec-simple.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/passthrough_test-passthrough-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/proplist_test-proplist-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/queue_test-queue-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/remix_test-remix-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/resampler_test-resampler-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/rtpoll_test-rtpoll-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/rtstutter-rtstutter.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/sig2str_test-sig2str-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/sigbus_test-sigbus-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/smoother_test-smoother-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/srbchannel_test-srbchannel-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/stripnul-stripnul.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/strlist_test-strlist-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/sync_playback-sync-playback.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/thread_mainloop_test-thread-mainloop-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/thread_test-thread-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/usergroup_test-usergroup-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/utf8_test-utf8-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@tests/$(DEPDIR)/volume_test-volume-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@utils/$(DEPDIR)/libpulsedsp_la-padsp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@utils/$(DEPDIR)/pacat-pacat.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@utils/$(DEPDIR)/pacmd-pacmd.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@utils/$(DEPDIR)/pactl-pactl.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@utils/$(DEPDIR)/pasuspender-pasuspender.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@utils/$(DEPDIR)/pax11publish-pax11publish.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +modules/alsa/libalsa_util_la-alsa-util.lo: modules/alsa/alsa-util.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libalsa_util_la_CFLAGS) $(CFLAGS) -MT modules/alsa/libalsa_util_la-alsa-util.lo -MD -MP -MF modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-util.Tpo -c -o modules/alsa/libalsa_util_la-alsa-util.lo `test -f 'modules/alsa/alsa-util.c' || echo '$(srcdir)/'`modules/alsa/alsa-util.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-util.Tpo modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-util.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/alsa/alsa-util.c' object='modules/alsa/libalsa_util_la-alsa-util.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libalsa_util_la_CFLAGS) $(CFLAGS) -c -o modules/alsa/libalsa_util_la-alsa-util.lo `test -f 'modules/alsa/alsa-util.c' || echo '$(srcdir)/'`modules/alsa/alsa-util.c + +modules/alsa/libalsa_util_la-alsa-ucm.lo: modules/alsa/alsa-ucm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libalsa_util_la_CFLAGS) $(CFLAGS) -MT modules/alsa/libalsa_util_la-alsa-ucm.lo -MD -MP -MF modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-ucm.Tpo -c -o modules/alsa/libalsa_util_la-alsa-ucm.lo `test -f 'modules/alsa/alsa-ucm.c' || echo '$(srcdir)/'`modules/alsa/alsa-ucm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-ucm.Tpo modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-ucm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/alsa/alsa-ucm.c' object='modules/alsa/libalsa_util_la-alsa-ucm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libalsa_util_la_CFLAGS) $(CFLAGS) -c -o modules/alsa/libalsa_util_la-alsa-ucm.lo `test -f 'modules/alsa/alsa-ucm.c' || echo '$(srcdir)/'`modules/alsa/alsa-ucm.c + +modules/alsa/libalsa_util_la-alsa-mixer.lo: modules/alsa/alsa-mixer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libalsa_util_la_CFLAGS) $(CFLAGS) -MT modules/alsa/libalsa_util_la-alsa-mixer.lo -MD -MP -MF modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-mixer.Tpo -c -o modules/alsa/libalsa_util_la-alsa-mixer.lo `test -f 'modules/alsa/alsa-mixer.c' || echo '$(srcdir)/'`modules/alsa/alsa-mixer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-mixer.Tpo modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-mixer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/alsa/alsa-mixer.c' object='modules/alsa/libalsa_util_la-alsa-mixer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libalsa_util_la_CFLAGS) $(CFLAGS) -c -o modules/alsa/libalsa_util_la-alsa-mixer.lo `test -f 'modules/alsa/alsa-mixer.c' || echo '$(srcdir)/'`modules/alsa/alsa-mixer.c + +modules/alsa/libalsa_util_la-alsa-sink.lo: modules/alsa/alsa-sink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libalsa_util_la_CFLAGS) $(CFLAGS) -MT modules/alsa/libalsa_util_la-alsa-sink.lo -MD -MP -MF modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-sink.Tpo -c -o modules/alsa/libalsa_util_la-alsa-sink.lo `test -f 'modules/alsa/alsa-sink.c' || echo '$(srcdir)/'`modules/alsa/alsa-sink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-sink.Tpo modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-sink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/alsa/alsa-sink.c' object='modules/alsa/libalsa_util_la-alsa-sink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libalsa_util_la_CFLAGS) $(CFLAGS) -c -o modules/alsa/libalsa_util_la-alsa-sink.lo `test -f 'modules/alsa/alsa-sink.c' || echo '$(srcdir)/'`modules/alsa/alsa-sink.c + +modules/alsa/libalsa_util_la-alsa-source.lo: modules/alsa/alsa-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libalsa_util_la_CFLAGS) $(CFLAGS) -MT modules/alsa/libalsa_util_la-alsa-source.lo -MD -MP -MF modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-source.Tpo -c -o modules/alsa/libalsa_util_la-alsa-source.lo `test -f 'modules/alsa/alsa-source.c' || echo '$(srcdir)/'`modules/alsa/alsa-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-source.Tpo modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-source.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/alsa/alsa-source.c' object='modules/alsa/libalsa_util_la-alsa-source.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libalsa_util_la_CFLAGS) $(CFLAGS) -c -o modules/alsa/libalsa_util_la-alsa-source.lo `test -f 'modules/alsa/alsa-source.c' || echo '$(srcdir)/'`modules/alsa/alsa-source.c + +modules/libalsa_util_la-reserve-wrap.lo: modules/reserve-wrap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libalsa_util_la_CFLAGS) $(CFLAGS) -MT modules/libalsa_util_la-reserve-wrap.lo -MD -MP -MF modules/$(DEPDIR)/libalsa_util_la-reserve-wrap.Tpo -c -o modules/libalsa_util_la-reserve-wrap.lo `test -f 'modules/reserve-wrap.c' || echo '$(srcdir)/'`modules/reserve-wrap.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/libalsa_util_la-reserve-wrap.Tpo modules/$(DEPDIR)/libalsa_util_la-reserve-wrap.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/reserve-wrap.c' object='modules/libalsa_util_la-reserve-wrap.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libalsa_util_la_CFLAGS) $(CFLAGS) -c -o modules/libalsa_util_la-reserve-wrap.lo `test -f 'modules/reserve-wrap.c' || echo '$(srcdir)/'`modules/reserve-wrap.c + +modules/libalsa_util_la-udev-util.lo: modules/udev-util.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libalsa_util_la_CFLAGS) $(CFLAGS) -MT modules/libalsa_util_la-udev-util.lo -MD -MP -MF modules/$(DEPDIR)/libalsa_util_la-udev-util.Tpo -c -o modules/libalsa_util_la-udev-util.lo `test -f 'modules/udev-util.c' || echo '$(srcdir)/'`modules/udev-util.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/libalsa_util_la-udev-util.Tpo modules/$(DEPDIR)/libalsa_util_la-udev-util.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/udev-util.c' object='modules/libalsa_util_la-udev-util.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libalsa_util_la_CFLAGS) $(CFLAGS) -c -o modules/libalsa_util_la-udev-util.lo `test -f 'modules/udev-util.c' || echo '$(srcdir)/'`modules/udev-util.c + +modules/libalsa_util_la-reserve.lo: modules/reserve.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libalsa_util_la_CFLAGS) $(CFLAGS) -MT modules/libalsa_util_la-reserve.lo -MD -MP -MF modules/$(DEPDIR)/libalsa_util_la-reserve.Tpo -c -o modules/libalsa_util_la-reserve.lo `test -f 'modules/reserve.c' || echo '$(srcdir)/'`modules/reserve.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/libalsa_util_la-reserve.Tpo modules/$(DEPDIR)/libalsa_util_la-reserve.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/reserve.c' object='modules/libalsa_util_la-reserve.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libalsa_util_la_CFLAGS) $(CFLAGS) -c -o modules/libalsa_util_la-reserve.lo `test -f 'modules/reserve.c' || echo '$(srcdir)/'`modules/reserve.c + +modules/libalsa_util_la-reserve-monitor.lo: modules/reserve-monitor.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libalsa_util_la_CFLAGS) $(CFLAGS) -MT modules/libalsa_util_la-reserve-monitor.lo -MD -MP -MF modules/$(DEPDIR)/libalsa_util_la-reserve-monitor.Tpo -c -o modules/libalsa_util_la-reserve-monitor.lo `test -f 'modules/reserve-monitor.c' || echo '$(srcdir)/'`modules/reserve-monitor.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/libalsa_util_la-reserve-monitor.Tpo modules/$(DEPDIR)/libalsa_util_la-reserve-monitor.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/reserve-monitor.c' object='modules/libalsa_util_la-reserve-monitor.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libalsa_util_la_CFLAGS) $(CFLAGS) -c -o modules/libalsa_util_la-reserve-monitor.lo `test -f 'modules/reserve-monitor.c' || echo '$(srcdir)/'`modules/reserve-monitor.c + +pulsecore/libavahi_wrap_la-avahi-wrap.lo: pulsecore/avahi-wrap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libavahi_wrap_la_CFLAGS) $(CFLAGS) -MT pulsecore/libavahi_wrap_la-avahi-wrap.lo -MD -MP -MF pulsecore/$(DEPDIR)/libavahi_wrap_la-avahi-wrap.Tpo -c -o pulsecore/libavahi_wrap_la-avahi-wrap.lo `test -f 'pulsecore/avahi-wrap.c' || echo '$(srcdir)/'`pulsecore/avahi-wrap.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libavahi_wrap_la-avahi-wrap.Tpo pulsecore/$(DEPDIR)/libavahi_wrap_la-avahi-wrap.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/avahi-wrap.c' object='pulsecore/libavahi_wrap_la-avahi-wrap.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libavahi_wrap_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libavahi_wrap_la-avahi-wrap.lo `test -f 'pulsecore/avahi-wrap.c' || echo '$(srcdir)/'`pulsecore/avahi-wrap.c + +modules/bluetooth/libbluez5_util_la-bluez5-util.lo: modules/bluetooth/bluez5-util.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbluez5_util_la_CPPFLAGS) $(CPPFLAGS) $(libbluez5_util_la_CFLAGS) $(CFLAGS) -MT modules/bluetooth/libbluez5_util_la-bluez5-util.lo -MD -MP -MF modules/bluetooth/$(DEPDIR)/libbluez5_util_la-bluez5-util.Tpo -c -o modules/bluetooth/libbluez5_util_la-bluez5-util.lo `test -f 'modules/bluetooth/bluez5-util.c' || echo '$(srcdir)/'`modules/bluetooth/bluez5-util.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/bluetooth/$(DEPDIR)/libbluez5_util_la-bluez5-util.Tpo modules/bluetooth/$(DEPDIR)/libbluez5_util_la-bluez5-util.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/bluetooth/bluez5-util.c' object='modules/bluetooth/libbluez5_util_la-bluez5-util.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbluez5_util_la_CPPFLAGS) $(CPPFLAGS) $(libbluez5_util_la_CFLAGS) $(CFLAGS) -c -o modules/bluetooth/libbluez5_util_la-bluez5-util.lo `test -f 'modules/bluetooth/bluez5-util.c' || echo '$(srcdir)/'`modules/bluetooth/bluez5-util.c + +modules/bluetooth/libbluez5_util_la-a2dp-codec-util.lo: modules/bluetooth/a2dp-codec-util.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbluez5_util_la_CPPFLAGS) $(CPPFLAGS) $(libbluez5_util_la_CFLAGS) $(CFLAGS) -MT modules/bluetooth/libbluez5_util_la-a2dp-codec-util.lo -MD -MP -MF modules/bluetooth/$(DEPDIR)/libbluez5_util_la-a2dp-codec-util.Tpo -c -o modules/bluetooth/libbluez5_util_la-a2dp-codec-util.lo `test -f 'modules/bluetooth/a2dp-codec-util.c' || echo '$(srcdir)/'`modules/bluetooth/a2dp-codec-util.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/bluetooth/$(DEPDIR)/libbluez5_util_la-a2dp-codec-util.Tpo modules/bluetooth/$(DEPDIR)/libbluez5_util_la-a2dp-codec-util.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/bluetooth/a2dp-codec-util.c' object='modules/bluetooth/libbluez5_util_la-a2dp-codec-util.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbluez5_util_la_CPPFLAGS) $(CPPFLAGS) $(libbluez5_util_la_CFLAGS) $(CFLAGS) -c -o modules/bluetooth/libbluez5_util_la-a2dp-codec-util.lo `test -f 'modules/bluetooth/a2dp-codec-util.c' || echo '$(srcdir)/'`modules/bluetooth/a2dp-codec-util.c + +modules/bluetooth/libbluez5_util_la-backend-ofono.lo: modules/bluetooth/backend-ofono.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbluez5_util_la_CPPFLAGS) $(CPPFLAGS) $(libbluez5_util_la_CFLAGS) $(CFLAGS) -MT modules/bluetooth/libbluez5_util_la-backend-ofono.lo -MD -MP -MF modules/bluetooth/$(DEPDIR)/libbluez5_util_la-backend-ofono.Tpo -c -o modules/bluetooth/libbluez5_util_la-backend-ofono.lo `test -f 'modules/bluetooth/backend-ofono.c' || echo '$(srcdir)/'`modules/bluetooth/backend-ofono.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/bluetooth/$(DEPDIR)/libbluez5_util_la-backend-ofono.Tpo modules/bluetooth/$(DEPDIR)/libbluez5_util_la-backend-ofono.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/bluetooth/backend-ofono.c' object='modules/bluetooth/libbluez5_util_la-backend-ofono.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbluez5_util_la_CPPFLAGS) $(CPPFLAGS) $(libbluez5_util_la_CFLAGS) $(CFLAGS) -c -o modules/bluetooth/libbluez5_util_la-backend-ofono.lo `test -f 'modules/bluetooth/backend-ofono.c' || echo '$(srcdir)/'`modules/bluetooth/backend-ofono.c + +modules/bluetooth/libbluez5_util_la-backend-native.lo: modules/bluetooth/backend-native.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbluez5_util_la_CPPFLAGS) $(CPPFLAGS) $(libbluez5_util_la_CFLAGS) $(CFLAGS) -MT modules/bluetooth/libbluez5_util_la-backend-native.lo -MD -MP -MF modules/bluetooth/$(DEPDIR)/libbluez5_util_la-backend-native.Tpo -c -o modules/bluetooth/libbluez5_util_la-backend-native.lo `test -f 'modules/bluetooth/backend-native.c' || echo '$(srcdir)/'`modules/bluetooth/backend-native.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/bluetooth/$(DEPDIR)/libbluez5_util_la-backend-native.Tpo modules/bluetooth/$(DEPDIR)/libbluez5_util_la-backend-native.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/bluetooth/backend-native.c' object='modules/bluetooth/libbluez5_util_la-backend-native.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbluez5_util_la_CPPFLAGS) $(CPPFLAGS) $(libbluez5_util_la_CFLAGS) $(CFLAGS) -c -o modules/bluetooth/libbluez5_util_la-backend-native.lo `test -f 'modules/bluetooth/backend-native.c' || echo '$(srcdir)/'`modules/bluetooth/backend-native.c + +modules/bluetooth/libbluez5_util_la-a2dp-codec-sbc.lo: modules/bluetooth/a2dp-codec-sbc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbluez5_util_la_CPPFLAGS) $(CPPFLAGS) $(libbluez5_util_la_CFLAGS) $(CFLAGS) -MT modules/bluetooth/libbluez5_util_la-a2dp-codec-sbc.lo -MD -MP -MF modules/bluetooth/$(DEPDIR)/libbluez5_util_la-a2dp-codec-sbc.Tpo -c -o modules/bluetooth/libbluez5_util_la-a2dp-codec-sbc.lo `test -f 'modules/bluetooth/a2dp-codec-sbc.c' || echo '$(srcdir)/'`modules/bluetooth/a2dp-codec-sbc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/bluetooth/$(DEPDIR)/libbluez5_util_la-a2dp-codec-sbc.Tpo modules/bluetooth/$(DEPDIR)/libbluez5_util_la-a2dp-codec-sbc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/bluetooth/a2dp-codec-sbc.c' object='modules/bluetooth/libbluez5_util_la-a2dp-codec-sbc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbluez5_util_la_CPPFLAGS) $(CPPFLAGS) $(libbluez5_util_la_CFLAGS) $(CFLAGS) -c -o modules/bluetooth/libbluez5_util_la-a2dp-codec-sbc.lo `test -f 'modules/bluetooth/a2dp-codec-sbc.c' || echo '$(srcdir)/'`modules/bluetooth/a2dp-codec-sbc.c + +pulsecore/libprotocol_native_la-protocol-native.lo: pulsecore/protocol-native.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libprotocol_native_la_CFLAGS) $(CFLAGS) -MT pulsecore/libprotocol_native_la-protocol-native.lo -MD -MP -MF pulsecore/$(DEPDIR)/libprotocol_native_la-protocol-native.Tpo -c -o pulsecore/libprotocol_native_la-protocol-native.lo `test -f 'pulsecore/protocol-native.c' || echo '$(srcdir)/'`pulsecore/protocol-native.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libprotocol_native_la-protocol-native.Tpo pulsecore/$(DEPDIR)/libprotocol_native_la-protocol-native.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/protocol-native.c' object='pulsecore/libprotocol_native_la-protocol-native.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libprotocol_native_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libprotocol_native_la-protocol-native.lo `test -f 'pulsecore/protocol-native.c' || echo '$(srcdir)/'`pulsecore/protocol-native.c + +pulse/libpulse_mainloop_glib_la-glib-mainloop.lo: pulse/glib-mainloop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_mainloop_glib_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_mainloop_glib_la-glib-mainloop.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_mainloop_glib_la-glib-mainloop.Tpo -c -o pulse/libpulse_mainloop_glib_la-glib-mainloop.lo `test -f 'pulse/glib-mainloop.c' || echo '$(srcdir)/'`pulse/glib-mainloop.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_mainloop_glib_la-glib-mainloop.Tpo pulse/$(DEPDIR)/libpulse_mainloop_glib_la-glib-mainloop.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/glib-mainloop.c' object='pulse/libpulse_mainloop_glib_la-glib-mainloop.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_mainloop_glib_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_mainloop_glib_la-glib-mainloop.lo `test -f 'pulse/glib-mainloop.c' || echo '$(srcdir)/'`pulse/glib-mainloop.c + +pulse/libpulse_simple_la-simple.lo: pulse/simple.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_simple_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_simple_la-simple.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_simple_la-simple.Tpo -c -o pulse/libpulse_simple_la-simple.lo `test -f 'pulse/simple.c' || echo '$(srcdir)/'`pulse/simple.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_simple_la-simple.Tpo pulse/$(DEPDIR)/libpulse_simple_la-simple.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/simple.c' object='pulse/libpulse_simple_la-simple.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_simple_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_simple_la-simple.lo `test -f 'pulse/simple.c' || echo '$(srcdir)/'`pulse/simple.c + +pulse/libpulse_la-channelmap.lo: pulse/channelmap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-channelmap.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-channelmap.Tpo -c -o pulse/libpulse_la-channelmap.lo `test -f 'pulse/channelmap.c' || echo '$(srcdir)/'`pulse/channelmap.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-channelmap.Tpo pulse/$(DEPDIR)/libpulse_la-channelmap.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/channelmap.c' object='pulse/libpulse_la-channelmap.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-channelmap.lo `test -f 'pulse/channelmap.c' || echo '$(srcdir)/'`pulse/channelmap.c + +pulse/libpulse_la-context.lo: pulse/context.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-context.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-context.Tpo -c -o pulse/libpulse_la-context.lo `test -f 'pulse/context.c' || echo '$(srcdir)/'`pulse/context.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-context.Tpo pulse/$(DEPDIR)/libpulse_la-context.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/context.c' object='pulse/libpulse_la-context.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-context.lo `test -f 'pulse/context.c' || echo '$(srcdir)/'`pulse/context.c + +pulse/libpulse_la-direction.lo: pulse/direction.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-direction.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-direction.Tpo -c -o pulse/libpulse_la-direction.lo `test -f 'pulse/direction.c' || echo '$(srcdir)/'`pulse/direction.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-direction.Tpo pulse/$(DEPDIR)/libpulse_la-direction.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/direction.c' object='pulse/libpulse_la-direction.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-direction.lo `test -f 'pulse/direction.c' || echo '$(srcdir)/'`pulse/direction.c + +pulse/libpulse_la-error.lo: pulse/error.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-error.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-error.Tpo -c -o pulse/libpulse_la-error.lo `test -f 'pulse/error.c' || echo '$(srcdir)/'`pulse/error.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-error.Tpo pulse/$(DEPDIR)/libpulse_la-error.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/error.c' object='pulse/libpulse_la-error.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-error.lo `test -f 'pulse/error.c' || echo '$(srcdir)/'`pulse/error.c + +pulse/libpulse_la-ext-device-manager.lo: pulse/ext-device-manager.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-ext-device-manager.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-ext-device-manager.Tpo -c -o pulse/libpulse_la-ext-device-manager.lo `test -f 'pulse/ext-device-manager.c' || echo '$(srcdir)/'`pulse/ext-device-manager.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-ext-device-manager.Tpo pulse/$(DEPDIR)/libpulse_la-ext-device-manager.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/ext-device-manager.c' object='pulse/libpulse_la-ext-device-manager.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-ext-device-manager.lo `test -f 'pulse/ext-device-manager.c' || echo '$(srcdir)/'`pulse/ext-device-manager.c + +pulse/libpulse_la-ext-device-restore.lo: pulse/ext-device-restore.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-ext-device-restore.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-ext-device-restore.Tpo -c -o pulse/libpulse_la-ext-device-restore.lo `test -f 'pulse/ext-device-restore.c' || echo '$(srcdir)/'`pulse/ext-device-restore.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-ext-device-restore.Tpo pulse/$(DEPDIR)/libpulse_la-ext-device-restore.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/ext-device-restore.c' object='pulse/libpulse_la-ext-device-restore.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-ext-device-restore.lo `test -f 'pulse/ext-device-restore.c' || echo '$(srcdir)/'`pulse/ext-device-restore.c + +pulse/libpulse_la-ext-stream-restore.lo: pulse/ext-stream-restore.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-ext-stream-restore.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-ext-stream-restore.Tpo -c -o pulse/libpulse_la-ext-stream-restore.lo `test -f 'pulse/ext-stream-restore.c' || echo '$(srcdir)/'`pulse/ext-stream-restore.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-ext-stream-restore.Tpo pulse/$(DEPDIR)/libpulse_la-ext-stream-restore.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/ext-stream-restore.c' object='pulse/libpulse_la-ext-stream-restore.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-ext-stream-restore.lo `test -f 'pulse/ext-stream-restore.c' || echo '$(srcdir)/'`pulse/ext-stream-restore.c + +pulse/libpulse_la-format.lo: pulse/format.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-format.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-format.Tpo -c -o pulse/libpulse_la-format.lo `test -f 'pulse/format.c' || echo '$(srcdir)/'`pulse/format.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-format.Tpo pulse/$(DEPDIR)/libpulse_la-format.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/format.c' object='pulse/libpulse_la-format.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-format.lo `test -f 'pulse/format.c' || echo '$(srcdir)/'`pulse/format.c + +pulse/libpulse_la-introspect.lo: pulse/introspect.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-introspect.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-introspect.Tpo -c -o pulse/libpulse_la-introspect.lo `test -f 'pulse/introspect.c' || echo '$(srcdir)/'`pulse/introspect.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-introspect.Tpo pulse/$(DEPDIR)/libpulse_la-introspect.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/introspect.c' object='pulse/libpulse_la-introspect.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-introspect.lo `test -f 'pulse/introspect.c' || echo '$(srcdir)/'`pulse/introspect.c + +pulse/libpulse_la-mainloop-api.lo: pulse/mainloop-api.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-mainloop-api.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-mainloop-api.Tpo -c -o pulse/libpulse_la-mainloop-api.lo `test -f 'pulse/mainloop-api.c' || echo '$(srcdir)/'`pulse/mainloop-api.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-mainloop-api.Tpo pulse/$(DEPDIR)/libpulse_la-mainloop-api.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/mainloop-api.c' object='pulse/libpulse_la-mainloop-api.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-mainloop-api.lo `test -f 'pulse/mainloop-api.c' || echo '$(srcdir)/'`pulse/mainloop-api.c + +pulse/libpulse_la-mainloop-signal.lo: pulse/mainloop-signal.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-mainloop-signal.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-mainloop-signal.Tpo -c -o pulse/libpulse_la-mainloop-signal.lo `test -f 'pulse/mainloop-signal.c' || echo '$(srcdir)/'`pulse/mainloop-signal.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-mainloop-signal.Tpo pulse/$(DEPDIR)/libpulse_la-mainloop-signal.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/mainloop-signal.c' object='pulse/libpulse_la-mainloop-signal.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-mainloop-signal.lo `test -f 'pulse/mainloop-signal.c' || echo '$(srcdir)/'`pulse/mainloop-signal.c + +pulse/libpulse_la-mainloop.lo: pulse/mainloop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-mainloop.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-mainloop.Tpo -c -o pulse/libpulse_la-mainloop.lo `test -f 'pulse/mainloop.c' || echo '$(srcdir)/'`pulse/mainloop.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-mainloop.Tpo pulse/$(DEPDIR)/libpulse_la-mainloop.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/mainloop.c' object='pulse/libpulse_la-mainloop.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-mainloop.lo `test -f 'pulse/mainloop.c' || echo '$(srcdir)/'`pulse/mainloop.c + +pulse/libpulse_la-operation.lo: pulse/operation.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-operation.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-operation.Tpo -c -o pulse/libpulse_la-operation.lo `test -f 'pulse/operation.c' || echo '$(srcdir)/'`pulse/operation.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-operation.Tpo pulse/$(DEPDIR)/libpulse_la-operation.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/operation.c' object='pulse/libpulse_la-operation.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-operation.lo `test -f 'pulse/operation.c' || echo '$(srcdir)/'`pulse/operation.c + +pulse/libpulse_la-proplist.lo: pulse/proplist.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-proplist.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-proplist.Tpo -c -o pulse/libpulse_la-proplist.lo `test -f 'pulse/proplist.c' || echo '$(srcdir)/'`pulse/proplist.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-proplist.Tpo pulse/$(DEPDIR)/libpulse_la-proplist.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/proplist.c' object='pulse/libpulse_la-proplist.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-proplist.lo `test -f 'pulse/proplist.c' || echo '$(srcdir)/'`pulse/proplist.c + +pulse/libpulse_la-rtclock.lo: pulse/rtclock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-rtclock.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-rtclock.Tpo -c -o pulse/libpulse_la-rtclock.lo `test -f 'pulse/rtclock.c' || echo '$(srcdir)/'`pulse/rtclock.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-rtclock.Tpo pulse/$(DEPDIR)/libpulse_la-rtclock.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/rtclock.c' object='pulse/libpulse_la-rtclock.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-rtclock.lo `test -f 'pulse/rtclock.c' || echo '$(srcdir)/'`pulse/rtclock.c + +pulse/libpulse_la-sample.lo: pulse/sample.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-sample.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-sample.Tpo -c -o pulse/libpulse_la-sample.lo `test -f 'pulse/sample.c' || echo '$(srcdir)/'`pulse/sample.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-sample.Tpo pulse/$(DEPDIR)/libpulse_la-sample.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/sample.c' object='pulse/libpulse_la-sample.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-sample.lo `test -f 'pulse/sample.c' || echo '$(srcdir)/'`pulse/sample.c + +pulse/libpulse_la-scache.lo: pulse/scache.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-scache.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-scache.Tpo -c -o pulse/libpulse_la-scache.lo `test -f 'pulse/scache.c' || echo '$(srcdir)/'`pulse/scache.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-scache.Tpo pulse/$(DEPDIR)/libpulse_la-scache.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/scache.c' object='pulse/libpulse_la-scache.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-scache.lo `test -f 'pulse/scache.c' || echo '$(srcdir)/'`pulse/scache.c + +pulse/libpulse_la-stream.lo: pulse/stream.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-stream.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-stream.Tpo -c -o pulse/libpulse_la-stream.lo `test -f 'pulse/stream.c' || echo '$(srcdir)/'`pulse/stream.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-stream.Tpo pulse/$(DEPDIR)/libpulse_la-stream.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/stream.c' object='pulse/libpulse_la-stream.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-stream.lo `test -f 'pulse/stream.c' || echo '$(srcdir)/'`pulse/stream.c + +pulse/libpulse_la-subscribe.lo: pulse/subscribe.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-subscribe.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-subscribe.Tpo -c -o pulse/libpulse_la-subscribe.lo `test -f 'pulse/subscribe.c' || echo '$(srcdir)/'`pulse/subscribe.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-subscribe.Tpo pulse/$(DEPDIR)/libpulse_la-subscribe.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/subscribe.c' object='pulse/libpulse_la-subscribe.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-subscribe.lo `test -f 'pulse/subscribe.c' || echo '$(srcdir)/'`pulse/subscribe.c + +pulse/libpulse_la-thread-mainloop.lo: pulse/thread-mainloop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-thread-mainloop.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-thread-mainloop.Tpo -c -o pulse/libpulse_la-thread-mainloop.lo `test -f 'pulse/thread-mainloop.c' || echo '$(srcdir)/'`pulse/thread-mainloop.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-thread-mainloop.Tpo pulse/$(DEPDIR)/libpulse_la-thread-mainloop.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/thread-mainloop.c' object='pulse/libpulse_la-thread-mainloop.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-thread-mainloop.lo `test -f 'pulse/thread-mainloop.c' || echo '$(srcdir)/'`pulse/thread-mainloop.c + +pulse/libpulse_la-timeval.lo: pulse/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-timeval.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-timeval.Tpo -c -o pulse/libpulse_la-timeval.lo `test -f 'pulse/timeval.c' || echo '$(srcdir)/'`pulse/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-timeval.Tpo pulse/$(DEPDIR)/libpulse_la-timeval.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/timeval.c' object='pulse/libpulse_la-timeval.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-timeval.lo `test -f 'pulse/timeval.c' || echo '$(srcdir)/'`pulse/timeval.c + +pulse/libpulse_la-utf8.lo: pulse/utf8.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-utf8.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-utf8.Tpo -c -o pulse/libpulse_la-utf8.lo `test -f 'pulse/utf8.c' || echo '$(srcdir)/'`pulse/utf8.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-utf8.Tpo pulse/$(DEPDIR)/libpulse_la-utf8.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/utf8.c' object='pulse/libpulse_la-utf8.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-utf8.lo `test -f 'pulse/utf8.c' || echo '$(srcdir)/'`pulse/utf8.c + +pulse/libpulse_la-util.lo: pulse/util.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-util.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-util.Tpo -c -o pulse/libpulse_la-util.lo `test -f 'pulse/util.c' || echo '$(srcdir)/'`pulse/util.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-util.Tpo pulse/$(DEPDIR)/libpulse_la-util.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/util.c' object='pulse/libpulse_la-util.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-util.lo `test -f 'pulse/util.c' || echo '$(srcdir)/'`pulse/util.c + +pulse/libpulse_la-volume.lo: pulse/volume.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-volume.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-volume.Tpo -c -o pulse/libpulse_la-volume.lo `test -f 'pulse/volume.c' || echo '$(srcdir)/'`pulse/volume.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-volume.Tpo pulse/$(DEPDIR)/libpulse_la-volume.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/volume.c' object='pulse/libpulse_la-volume.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-volume.lo `test -f 'pulse/volume.c' || echo '$(srcdir)/'`pulse/volume.c + +pulse/libpulse_la-xmalloc.lo: pulse/xmalloc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -MT pulse/libpulse_la-xmalloc.lo -MD -MP -MF pulse/$(DEPDIR)/libpulse_la-xmalloc.Tpo -c -o pulse/libpulse_la-xmalloc.lo `test -f 'pulse/xmalloc.c' || echo '$(srcdir)/'`pulse/xmalloc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulse_la-xmalloc.Tpo pulse/$(DEPDIR)/libpulse_la-xmalloc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/xmalloc.c' object='pulse/libpulse_la-xmalloc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulse_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulse_la-xmalloc.lo `test -f 'pulse/xmalloc.c' || echo '$(srcdir)/'`pulse/xmalloc.c + +pulse/libpulsecommon_@PA_MAJORMINOR@_la-client-conf.lo: pulse/client-conf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulse/libpulsecommon_@PA_MAJORMINOR@_la-client-conf.lo -MD -MP -MF pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-client-conf.Tpo -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-client-conf.lo `test -f 'pulse/client-conf.c' || echo '$(srcdir)/'`pulse/client-conf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-client-conf.Tpo pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-client-conf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/client-conf.c' object='pulse/libpulsecommon_@PA_MAJORMINOR@_la-client-conf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-client-conf.lo `test -f 'pulse/client-conf.c' || echo '$(srcdir)/'`pulse/client-conf.c + +pulse/libpulsecommon_@PA_MAJORMINOR@_la-fork-detect.lo: pulse/fork-detect.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulse/libpulsecommon_@PA_MAJORMINOR@_la-fork-detect.lo -MD -MP -MF pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-fork-detect.Tpo -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-fork-detect.lo `test -f 'pulse/fork-detect.c' || echo '$(srcdir)/'`pulse/fork-detect.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-fork-detect.Tpo pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-fork-detect.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/fork-detect.c' object='pulse/libpulsecommon_@PA_MAJORMINOR@_la-fork-detect.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-fork-detect.lo `test -f 'pulse/fork-detect.c' || echo '$(srcdir)/'`pulse/fork-detect.c + +pulse/libpulsecommon_@PA_MAJORMINOR@_la-format.lo: pulse/format.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulse/libpulsecommon_@PA_MAJORMINOR@_la-format.lo -MD -MP -MF pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-format.Tpo -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-format.lo `test -f 'pulse/format.c' || echo '$(srcdir)/'`pulse/format.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-format.Tpo pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-format.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/format.c' object='pulse/libpulsecommon_@PA_MAJORMINOR@_la-format.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-format.lo `test -f 'pulse/format.c' || echo '$(srcdir)/'`pulse/format.c + +pulse/libpulsecommon_@PA_MAJORMINOR@_la-json.lo: pulse/json.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulse/libpulsecommon_@PA_MAJORMINOR@_la-json.lo -MD -MP -MF pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-json.Tpo -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-json.lo `test -f 'pulse/json.c' || echo '$(srcdir)/'`pulse/json.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-json.Tpo pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-json.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/json.c' object='pulse/libpulsecommon_@PA_MAJORMINOR@_la-json.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-json.lo `test -f 'pulse/json.c' || echo '$(srcdir)/'`pulse/json.c + +pulse/libpulsecommon_@PA_MAJORMINOR@_la-xmalloc.lo: pulse/xmalloc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulse/libpulsecommon_@PA_MAJORMINOR@_la-xmalloc.lo -MD -MP -MF pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-xmalloc.Tpo -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-xmalloc.lo `test -f 'pulse/xmalloc.c' || echo '$(srcdir)/'`pulse/xmalloc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-xmalloc.Tpo pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-xmalloc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/xmalloc.c' object='pulse/libpulsecommon_@PA_MAJORMINOR@_la-xmalloc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-xmalloc.lo `test -f 'pulse/xmalloc.c' || echo '$(srcdir)/'`pulse/xmalloc.c + +pulse/libpulsecommon_@PA_MAJORMINOR@_la-proplist.lo: pulse/proplist.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulse/libpulsecommon_@PA_MAJORMINOR@_la-proplist.lo -MD -MP -MF pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-proplist.Tpo -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-proplist.lo `test -f 'pulse/proplist.c' || echo '$(srcdir)/'`pulse/proplist.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-proplist.Tpo pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-proplist.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/proplist.c' object='pulse/libpulsecommon_@PA_MAJORMINOR@_la-proplist.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-proplist.lo `test -f 'pulse/proplist.c' || echo '$(srcdir)/'`pulse/proplist.c + +pulse/libpulsecommon_@PA_MAJORMINOR@_la-utf8.lo: pulse/utf8.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulse/libpulsecommon_@PA_MAJORMINOR@_la-utf8.lo -MD -MP -MF pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-utf8.Tpo -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-utf8.lo `test -f 'pulse/utf8.c' || echo '$(srcdir)/'`pulse/utf8.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-utf8.Tpo pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-utf8.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/utf8.c' object='pulse/libpulsecommon_@PA_MAJORMINOR@_la-utf8.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-utf8.lo `test -f 'pulse/utf8.c' || echo '$(srcdir)/'`pulse/utf8.c + +pulse/libpulsecommon_@PA_MAJORMINOR@_la-channelmap.lo: pulse/channelmap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulse/libpulsecommon_@PA_MAJORMINOR@_la-channelmap.lo -MD -MP -MF pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-channelmap.Tpo -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-channelmap.lo `test -f 'pulse/channelmap.c' || echo '$(srcdir)/'`pulse/channelmap.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-channelmap.Tpo pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-channelmap.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/channelmap.c' object='pulse/libpulsecommon_@PA_MAJORMINOR@_la-channelmap.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-channelmap.lo `test -f 'pulse/channelmap.c' || echo '$(srcdir)/'`pulse/channelmap.c + +pulse/libpulsecommon_@PA_MAJORMINOR@_la-sample.lo: pulse/sample.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulse/libpulsecommon_@PA_MAJORMINOR@_la-sample.lo -MD -MP -MF pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-sample.Tpo -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-sample.lo `test -f 'pulse/sample.c' || echo '$(srcdir)/'`pulse/sample.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-sample.Tpo pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-sample.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/sample.c' object='pulse/libpulsecommon_@PA_MAJORMINOR@_la-sample.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-sample.lo `test -f 'pulse/sample.c' || echo '$(srcdir)/'`pulse/sample.c + +pulse/libpulsecommon_@PA_MAJORMINOR@_la-util.lo: pulse/util.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulse/libpulsecommon_@PA_MAJORMINOR@_la-util.lo -MD -MP -MF pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-util.Tpo -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-util.lo `test -f 'pulse/util.c' || echo '$(srcdir)/'`pulse/util.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-util.Tpo pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-util.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/util.c' object='pulse/libpulsecommon_@PA_MAJORMINOR@_la-util.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-util.lo `test -f 'pulse/util.c' || echo '$(srcdir)/'`pulse/util.c + +pulse/libpulsecommon_@PA_MAJORMINOR@_la-timeval.lo: pulse/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulse/libpulsecommon_@PA_MAJORMINOR@_la-timeval.lo -MD -MP -MF pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-timeval.Tpo -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-timeval.lo `test -f 'pulse/timeval.c' || echo '$(srcdir)/'`pulse/timeval.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-timeval.Tpo pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-timeval.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/timeval.c' object='pulse/libpulsecommon_@PA_MAJORMINOR@_la-timeval.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-timeval.lo `test -f 'pulse/timeval.c' || echo '$(srcdir)/'`pulse/timeval.c + +pulse/libpulsecommon_@PA_MAJORMINOR@_la-rtclock.lo: pulse/rtclock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulse/libpulsecommon_@PA_MAJORMINOR@_la-rtclock.lo -MD -MP -MF pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-rtclock.Tpo -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-rtclock.lo `test -f 'pulse/rtclock.c' || echo '$(srcdir)/'`pulse/rtclock.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-rtclock.Tpo pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-rtclock.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/rtclock.c' object='pulse/libpulsecommon_@PA_MAJORMINOR@_la-rtclock.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-rtclock.lo `test -f 'pulse/rtclock.c' || echo '$(srcdir)/'`pulse/rtclock.c + +pulse/libpulsecommon_@PA_MAJORMINOR@_la-volume.lo: pulse/volume.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulse/libpulsecommon_@PA_MAJORMINOR@_la-volume.lo -MD -MP -MF pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-volume.Tpo -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-volume.lo `test -f 'pulse/volume.c' || echo '$(srcdir)/'`pulse/volume.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-volume.Tpo pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-volume.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/volume.c' object='pulse/libpulsecommon_@PA_MAJORMINOR@_la-volume.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-volume.lo `test -f 'pulse/volume.c' || echo '$(srcdir)/'`pulse/volume.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-authkey.lo: pulsecore/authkey.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-authkey.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-authkey.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-authkey.lo `test -f 'pulsecore/authkey.c' || echo '$(srcdir)/'`pulsecore/authkey.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-authkey.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-authkey.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/authkey.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-authkey.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-authkey.lo `test -f 'pulsecore/authkey.c' || echo '$(srcdir)/'`pulsecore/authkey.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-conf-parser.lo: pulsecore/conf-parser.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-conf-parser.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-conf-parser.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-conf-parser.lo `test -f 'pulsecore/conf-parser.c' || echo '$(srcdir)/'`pulsecore/conf-parser.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-conf-parser.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-conf-parser.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/conf-parser.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-conf-parser.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-conf-parser.lo `test -f 'pulsecore/conf-parser.c' || echo '$(srcdir)/'`pulsecore/conf-parser.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-error.lo: pulsecore/core-error.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-error.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-error.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-error.lo `test -f 'pulsecore/core-error.c' || echo '$(srcdir)/'`pulsecore/core-error.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-error.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-error.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/core-error.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-error.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-error.lo `test -f 'pulsecore/core-error.c' || echo '$(srcdir)/'`pulsecore/core-error.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-format.lo: pulsecore/core-format.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-format.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-format.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-format.lo `test -f 'pulsecore/core-format.c' || echo '$(srcdir)/'`pulsecore/core-format.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-format.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-format.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/core-format.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-format.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-format.lo `test -f 'pulsecore/core-format.c' || echo '$(srcdir)/'`pulsecore/core-format.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-rtclock.lo: pulsecore/core-rtclock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-rtclock.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-rtclock.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-rtclock.lo `test -f 'pulsecore/core-rtclock.c' || echo '$(srcdir)/'`pulsecore/core-rtclock.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-rtclock.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-rtclock.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/core-rtclock.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-rtclock.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-rtclock.lo `test -f 'pulsecore/core-rtclock.c' || echo '$(srcdir)/'`pulsecore/core-rtclock.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-util.lo: pulsecore/core-util.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-util.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-util.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-util.lo `test -f 'pulsecore/core-util.c' || echo '$(srcdir)/'`pulsecore/core-util.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-util.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-util.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/core-util.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-util.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-core-util.lo `test -f 'pulsecore/core-util.c' || echo '$(srcdir)/'`pulsecore/core-util.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-dynarray.lo: pulsecore/dynarray.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-dynarray.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-dynarray.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-dynarray.lo `test -f 'pulsecore/dynarray.c' || echo '$(srcdir)/'`pulsecore/dynarray.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-dynarray.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-dynarray.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/dynarray.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-dynarray.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-dynarray.lo `test -f 'pulsecore/dynarray.c' || echo '$(srcdir)/'`pulsecore/dynarray.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-fdsem.lo: pulsecore/fdsem.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-fdsem.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-fdsem.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-fdsem.lo `test -f 'pulsecore/fdsem.c' || echo '$(srcdir)/'`pulsecore/fdsem.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-fdsem.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-fdsem.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/fdsem.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-fdsem.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-fdsem.lo `test -f 'pulsecore/fdsem.c' || echo '$(srcdir)/'`pulsecore/fdsem.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-flist.lo: pulsecore/flist.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-flist.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-flist.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-flist.lo `test -f 'pulsecore/flist.c' || echo '$(srcdir)/'`pulsecore/flist.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-flist.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-flist.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/flist.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-flist.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-flist.lo `test -f 'pulsecore/flist.c' || echo '$(srcdir)/'`pulsecore/flist.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-g711.lo: pulsecore/g711.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-g711.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-g711.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-g711.lo `test -f 'pulsecore/g711.c' || echo '$(srcdir)/'`pulsecore/g711.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-g711.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-g711.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/g711.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-g711.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-g711.lo `test -f 'pulsecore/g711.c' || echo '$(srcdir)/'`pulsecore/g711.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-hashmap.lo: pulsecore/hashmap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-hashmap.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-hashmap.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-hashmap.lo `test -f 'pulsecore/hashmap.c' || echo '$(srcdir)/'`pulsecore/hashmap.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-hashmap.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-hashmap.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/hashmap.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-hashmap.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-hashmap.lo `test -f 'pulsecore/hashmap.c' || echo '$(srcdir)/'`pulsecore/hashmap.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-i18n.lo: pulsecore/i18n.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-i18n.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-i18n.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-i18n.lo `test -f 'pulsecore/i18n.c' || echo '$(srcdir)/'`pulsecore/i18n.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-i18n.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-i18n.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/i18n.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-i18n.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-i18n.lo `test -f 'pulsecore/i18n.c' || echo '$(srcdir)/'`pulsecore/i18n.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-idxset.lo: pulsecore/idxset.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-idxset.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-idxset.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-idxset.lo `test -f 'pulsecore/idxset.c' || echo '$(srcdir)/'`pulsecore/idxset.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-idxset.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-idxset.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/idxset.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-idxset.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-idxset.lo `test -f 'pulsecore/idxset.c' || echo '$(srcdir)/'`pulsecore/idxset.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-arpa-inet.lo: pulsecore/arpa-inet.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-arpa-inet.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-arpa-inet.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-arpa-inet.lo `test -f 'pulsecore/arpa-inet.c' || echo '$(srcdir)/'`pulsecore/arpa-inet.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-arpa-inet.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-arpa-inet.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/arpa-inet.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-arpa-inet.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-arpa-inet.lo `test -f 'pulsecore/arpa-inet.c' || echo '$(srcdir)/'`pulsecore/arpa-inet.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-iochannel.lo: pulsecore/iochannel.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-iochannel.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-iochannel.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-iochannel.lo `test -f 'pulsecore/iochannel.c' || echo '$(srcdir)/'`pulsecore/iochannel.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-iochannel.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-iochannel.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/iochannel.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-iochannel.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-iochannel.lo `test -f 'pulsecore/iochannel.c' || echo '$(srcdir)/'`pulsecore/iochannel.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-ioline.lo: pulsecore/ioline.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-ioline.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-ioline.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-ioline.lo `test -f 'pulsecore/ioline.c' || echo '$(srcdir)/'`pulsecore/ioline.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-ioline.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-ioline.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/ioline.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-ioline.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-ioline.lo `test -f 'pulsecore/ioline.c' || echo '$(srcdir)/'`pulsecore/ioline.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-ipacl.lo: pulsecore/ipacl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-ipacl.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-ipacl.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-ipacl.lo `test -f 'pulsecore/ipacl.c' || echo '$(srcdir)/'`pulsecore/ipacl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-ipacl.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-ipacl.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/ipacl.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-ipacl.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-ipacl.lo `test -f 'pulsecore/ipacl.c' || echo '$(srcdir)/'`pulsecore/ipacl.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-lock-autospawn.lo: pulsecore/lock-autospawn.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-lock-autospawn.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-lock-autospawn.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-lock-autospawn.lo `test -f 'pulsecore/lock-autospawn.c' || echo '$(srcdir)/'`pulsecore/lock-autospawn.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-lock-autospawn.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-lock-autospawn.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/lock-autospawn.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-lock-autospawn.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-lock-autospawn.lo `test -f 'pulsecore/lock-autospawn.c' || echo '$(srcdir)/'`pulsecore/lock-autospawn.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-log.lo: pulsecore/log.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-log.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-log.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-log.lo `test -f 'pulsecore/log.c' || echo '$(srcdir)/'`pulsecore/log.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-log.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-log.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/log.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-log.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-log.lo `test -f 'pulsecore/log.c' || echo '$(srcdir)/'`pulsecore/log.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-ratelimit.lo: pulsecore/ratelimit.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-ratelimit.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-ratelimit.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-ratelimit.lo `test -f 'pulsecore/ratelimit.c' || echo '$(srcdir)/'`pulsecore/ratelimit.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-ratelimit.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-ratelimit.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/ratelimit.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-ratelimit.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-ratelimit.lo `test -f 'pulsecore/ratelimit.c' || echo '$(srcdir)/'`pulsecore/ratelimit.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-mcalign.lo: pulsecore/mcalign.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-mcalign.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-mcalign.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-mcalign.lo `test -f 'pulsecore/mcalign.c' || echo '$(srcdir)/'`pulsecore/mcalign.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-mcalign.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-mcalign.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/mcalign.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-mcalign.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-mcalign.lo `test -f 'pulsecore/mcalign.c' || echo '$(srcdir)/'`pulsecore/mcalign.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memblock.lo: pulsecore/memblock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memblock.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memblock.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memblock.lo `test -f 'pulsecore/memblock.c' || echo '$(srcdir)/'`pulsecore/memblock.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memblock.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memblock.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/memblock.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memblock.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memblock.lo `test -f 'pulsecore/memblock.c' || echo '$(srcdir)/'`pulsecore/memblock.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memblockq.lo: pulsecore/memblockq.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memblockq.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memblockq.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memblockq.lo `test -f 'pulsecore/memblockq.c' || echo '$(srcdir)/'`pulsecore/memblockq.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memblockq.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memblockq.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/memblockq.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memblockq.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memblockq.lo `test -f 'pulsecore/memblockq.c' || echo '$(srcdir)/'`pulsecore/memblockq.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memchunk.lo: pulsecore/memchunk.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memchunk.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memchunk.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memchunk.lo `test -f 'pulsecore/memchunk.c' || echo '$(srcdir)/'`pulsecore/memchunk.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memchunk.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memchunk.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/memchunk.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memchunk.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memchunk.lo `test -f 'pulsecore/memchunk.c' || echo '$(srcdir)/'`pulsecore/memchunk.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-native-common.lo: pulsecore/native-common.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-native-common.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-native-common.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-native-common.lo `test -f 'pulsecore/native-common.c' || echo '$(srcdir)/'`pulsecore/native-common.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-native-common.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-native-common.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/native-common.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-native-common.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-native-common.lo `test -f 'pulsecore/native-common.c' || echo '$(srcdir)/'`pulsecore/native-common.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-once.lo: pulsecore/once.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-once.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-once.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-once.lo `test -f 'pulsecore/once.c' || echo '$(srcdir)/'`pulsecore/once.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-once.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-once.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/once.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-once.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-once.lo `test -f 'pulsecore/once.c' || echo '$(srcdir)/'`pulsecore/once.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-packet.lo: pulsecore/packet.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-packet.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-packet.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-packet.lo `test -f 'pulsecore/packet.c' || echo '$(srcdir)/'`pulsecore/packet.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-packet.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-packet.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/packet.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-packet.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-packet.lo `test -f 'pulsecore/packet.c' || echo '$(srcdir)/'`pulsecore/packet.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-parseaddr.lo: pulsecore/parseaddr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-parseaddr.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-parseaddr.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-parseaddr.lo `test -f 'pulsecore/parseaddr.c' || echo '$(srcdir)/'`pulsecore/parseaddr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-parseaddr.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-parseaddr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/parseaddr.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-parseaddr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-parseaddr.lo `test -f 'pulsecore/parseaddr.c' || echo '$(srcdir)/'`pulsecore/parseaddr.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pdispatch.lo: pulsecore/pdispatch.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pdispatch.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pdispatch.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pdispatch.lo `test -f 'pulsecore/pdispatch.c' || echo '$(srcdir)/'`pulsecore/pdispatch.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pdispatch.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pdispatch.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/pdispatch.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pdispatch.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pdispatch.lo `test -f 'pulsecore/pdispatch.c' || echo '$(srcdir)/'`pulsecore/pdispatch.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pid.lo: pulsecore/pid.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pid.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pid.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pid.lo `test -f 'pulsecore/pid.c' || echo '$(srcdir)/'`pulsecore/pid.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pid.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pid.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/pid.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pid.lo `test -f 'pulsecore/pid.c' || echo '$(srcdir)/'`pulsecore/pid.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pipe.lo: pulsecore/pipe.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pipe.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pipe.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pipe.lo `test -f 'pulsecore/pipe.c' || echo '$(srcdir)/'`pulsecore/pipe.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pipe.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pipe.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/pipe.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pipe.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pipe.lo `test -f 'pulsecore/pipe.c' || echo '$(srcdir)/'`pulsecore/pipe.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memtrap.lo: pulsecore/memtrap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memtrap.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memtrap.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memtrap.lo `test -f 'pulsecore/memtrap.c' || echo '$(srcdir)/'`pulsecore/memtrap.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memtrap.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memtrap.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/memtrap.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memtrap.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-memtrap.lo `test -f 'pulsecore/memtrap.c' || echo '$(srcdir)/'`pulsecore/memtrap.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-aupdate.lo: pulsecore/aupdate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-aupdate.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-aupdate.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-aupdate.lo `test -f 'pulsecore/aupdate.c' || echo '$(srcdir)/'`pulsecore/aupdate.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-aupdate.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-aupdate.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/aupdate.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-aupdate.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-aupdate.lo `test -f 'pulsecore/aupdate.c' || echo '$(srcdir)/'`pulsecore/aupdate.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-proplist-util.lo: pulsecore/proplist-util.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-proplist-util.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-proplist-util.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-proplist-util.lo `test -f 'pulsecore/proplist-util.c' || echo '$(srcdir)/'`pulsecore/proplist-util.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-proplist-util.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-proplist-util.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/proplist-util.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-proplist-util.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-proplist-util.lo `test -f 'pulsecore/proplist-util.c' || echo '$(srcdir)/'`pulsecore/proplist-util.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pstream-util.lo: pulsecore/pstream-util.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pstream-util.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pstream-util.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pstream-util.lo `test -f 'pulsecore/pstream-util.c' || echo '$(srcdir)/'`pulsecore/pstream-util.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pstream-util.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pstream-util.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/pstream-util.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pstream-util.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pstream-util.lo `test -f 'pulsecore/pstream-util.c' || echo '$(srcdir)/'`pulsecore/pstream-util.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pstream.lo: pulsecore/pstream.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pstream.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pstream.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pstream.lo `test -f 'pulsecore/pstream.c' || echo '$(srcdir)/'`pulsecore/pstream.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pstream.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pstream.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/pstream.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pstream.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-pstream.lo `test -f 'pulsecore/pstream.c' || echo '$(srcdir)/'`pulsecore/pstream.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-queue.lo: pulsecore/queue.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-queue.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-queue.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-queue.lo `test -f 'pulsecore/queue.c' || echo '$(srcdir)/'`pulsecore/queue.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-queue.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-queue.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/queue.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-queue.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-queue.lo `test -f 'pulsecore/queue.c' || echo '$(srcdir)/'`pulsecore/queue.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-random.lo: pulsecore/random.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-random.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-random.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-random.lo `test -f 'pulsecore/random.c' || echo '$(srcdir)/'`pulsecore/random.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-random.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-random.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/random.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-random.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-random.lo `test -f 'pulsecore/random.c' || echo '$(srcdir)/'`pulsecore/random.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-srbchannel.lo: pulsecore/srbchannel.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-srbchannel.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-srbchannel.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-srbchannel.lo `test -f 'pulsecore/srbchannel.c' || echo '$(srcdir)/'`pulsecore/srbchannel.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-srbchannel.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-srbchannel.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/srbchannel.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-srbchannel.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-srbchannel.lo `test -f 'pulsecore/srbchannel.c' || echo '$(srcdir)/'`pulsecore/srbchannel.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-sample-util.lo: pulsecore/sample-util.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-sample-util.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-sample-util.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-sample-util.lo `test -f 'pulsecore/sample-util.c' || echo '$(srcdir)/'`pulsecore/sample-util.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-sample-util.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-sample-util.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/sample-util.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-sample-util.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-sample-util.lo `test -f 'pulsecore/sample-util.c' || echo '$(srcdir)/'`pulsecore/sample-util.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-shm.lo: pulsecore/shm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-shm.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-shm.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-shm.lo `test -f 'pulsecore/shm.c' || echo '$(srcdir)/'`pulsecore/shm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-shm.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-shm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/shm.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-shm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-shm.lo `test -f 'pulsecore/shm.c' || echo '$(srcdir)/'`pulsecore/shm.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-bitset.lo: pulsecore/bitset.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-bitset.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-bitset.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-bitset.lo `test -f 'pulsecore/bitset.c' || echo '$(srcdir)/'`pulsecore/bitset.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-bitset.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-bitset.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/bitset.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-bitset.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-bitset.lo `test -f 'pulsecore/bitset.c' || echo '$(srcdir)/'`pulsecore/bitset.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-socket-client.lo: pulsecore/socket-client.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-socket-client.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-socket-client.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-socket-client.lo `test -f 'pulsecore/socket-client.c' || echo '$(srcdir)/'`pulsecore/socket-client.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-socket-client.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-socket-client.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/socket-client.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-socket-client.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-socket-client.lo `test -f 'pulsecore/socket-client.c' || echo '$(srcdir)/'`pulsecore/socket-client.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-socket-server.lo: pulsecore/socket-server.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-socket-server.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-socket-server.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-socket-server.lo `test -f 'pulsecore/socket-server.c' || echo '$(srcdir)/'`pulsecore/socket-server.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-socket-server.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-socket-server.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/socket-server.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-socket-server.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-socket-server.lo `test -f 'pulsecore/socket-server.c' || echo '$(srcdir)/'`pulsecore/socket-server.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-socket-util.lo: pulsecore/socket-util.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-socket-util.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-socket-util.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-socket-util.lo `test -f 'pulsecore/socket-util.c' || echo '$(srcdir)/'`pulsecore/socket-util.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-socket-util.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-socket-util.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/socket-util.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-socket-util.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-socket-util.lo `test -f 'pulsecore/socket-util.c' || echo '$(srcdir)/'`pulsecore/socket-util.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-strbuf.lo: pulsecore/strbuf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-strbuf.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-strbuf.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-strbuf.lo `test -f 'pulsecore/strbuf.c' || echo '$(srcdir)/'`pulsecore/strbuf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-strbuf.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-strbuf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/strbuf.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-strbuf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-strbuf.lo `test -f 'pulsecore/strbuf.c' || echo '$(srcdir)/'`pulsecore/strbuf.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-strlist.lo: pulsecore/strlist.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-strlist.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-strlist.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-strlist.lo `test -f 'pulsecore/strlist.c' || echo '$(srcdir)/'`pulsecore/strlist.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-strlist.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-strlist.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/strlist.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-strlist.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-strlist.lo `test -f 'pulsecore/strlist.c' || echo '$(srcdir)/'`pulsecore/strlist.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-tagstruct.lo: pulsecore/tagstruct.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-tagstruct.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-tagstruct.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-tagstruct.lo `test -f 'pulsecore/tagstruct.c' || echo '$(srcdir)/'`pulsecore/tagstruct.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-tagstruct.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-tagstruct.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/tagstruct.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-tagstruct.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-tagstruct.lo `test -f 'pulsecore/tagstruct.c' || echo '$(srcdir)/'`pulsecore/tagstruct.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-time-smoother.lo: pulsecore/time-smoother.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-time-smoother.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-time-smoother.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-time-smoother.lo `test -f 'pulsecore/time-smoother.c' || echo '$(srcdir)/'`pulsecore/time-smoother.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-time-smoother.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-time-smoother.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/time-smoother.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-time-smoother.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-time-smoother.lo `test -f 'pulsecore/time-smoother.c' || echo '$(srcdir)/'`pulsecore/time-smoother.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-tokenizer.lo: pulsecore/tokenizer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-tokenizer.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-tokenizer.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-tokenizer.lo `test -f 'pulsecore/tokenizer.c' || echo '$(srcdir)/'`pulsecore/tokenizer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-tokenizer.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-tokenizer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/tokenizer.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-tokenizer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-tokenizer.lo `test -f 'pulsecore/tokenizer.c' || echo '$(srcdir)/'`pulsecore/tokenizer.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-usergroup.lo: pulsecore/usergroup.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-usergroup.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-usergroup.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-usergroup.lo `test -f 'pulsecore/usergroup.c' || echo '$(srcdir)/'`pulsecore/usergroup.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-usergroup.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-usergroup.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/usergroup.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-usergroup.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-usergroup.lo `test -f 'pulsecore/usergroup.c' || echo '$(srcdir)/'`pulsecore/usergroup.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-sndfile-util.lo: pulsecore/sndfile-util.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-sndfile-util.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-sndfile-util.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-sndfile-util.lo `test -f 'pulsecore/sndfile-util.c' || echo '$(srcdir)/'`pulsecore/sndfile-util.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-sndfile-util.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-sndfile-util.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/sndfile-util.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-sndfile-util.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-sndfile-util.lo `test -f 'pulsecore/sndfile-util.c' || echo '$(srcdir)/'`pulsecore/sndfile-util.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-poll-win32.lo: pulsecore/poll-win32.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-poll-win32.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-poll-win32.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-poll-win32.lo `test -f 'pulsecore/poll-win32.c' || echo '$(srcdir)/'`pulsecore/poll-win32.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-poll-win32.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-poll-win32.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/poll-win32.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-poll-win32.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-poll-win32.lo `test -f 'pulsecore/poll-win32.c' || echo '$(srcdir)/'`pulsecore/poll-win32.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-poll-posix.lo: pulsecore/poll-posix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-poll-posix.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-poll-posix.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-poll-posix.lo `test -f 'pulsecore/poll-posix.c' || echo '$(srcdir)/'`pulsecore/poll-posix.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-poll-posix.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-poll-posix.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/poll-posix.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-poll-posix.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-poll-posix.lo `test -f 'pulsecore/poll-posix.c' || echo '$(srcdir)/'`pulsecore/poll-posix.c + +pulse/libpulsecommon_@PA_MAJORMINOR@_la-client-conf-x11.lo: pulse/client-conf-x11.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulse/libpulsecommon_@PA_MAJORMINOR@_la-client-conf-x11.lo -MD -MP -MF pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-client-conf-x11.Tpo -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-client-conf-x11.lo `test -f 'pulse/client-conf-x11.c' || echo '$(srcdir)/'`pulse/client-conf-x11.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-client-conf-x11.Tpo pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-client-conf-x11.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulse/client-conf-x11.c' object='pulse/libpulsecommon_@PA_MAJORMINOR@_la-client-conf-x11.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulse/libpulsecommon_@PA_MAJORMINOR@_la-client-conf-x11.lo `test -f 'pulse/client-conf-x11.c' || echo '$(srcdir)/'`pulse/client-conf-x11.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-x11prop.lo: pulsecore/x11prop.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-x11prop.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-x11prop.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-x11prop.lo `test -f 'pulsecore/x11prop.c' || echo '$(srcdir)/'`pulsecore/x11prop.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-x11prop.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-x11prop.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/x11prop.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-x11prop.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-x11prop.lo `test -f 'pulsecore/x11prop.c' || echo '$(srcdir)/'`pulsecore/x11prop.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-mutex-win32.lo: pulsecore/mutex-win32.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-mutex-win32.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-mutex-win32.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-mutex-win32.lo `test -f 'pulsecore/mutex-win32.c' || echo '$(srcdir)/'`pulsecore/mutex-win32.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-mutex-win32.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-mutex-win32.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/mutex-win32.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-mutex-win32.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-mutex-win32.lo `test -f 'pulsecore/mutex-win32.c' || echo '$(srcdir)/'`pulsecore/mutex-win32.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-thread-win32.lo: pulsecore/thread-win32.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-thread-win32.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-thread-win32.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-thread-win32.lo `test -f 'pulsecore/thread-win32.c' || echo '$(srcdir)/'`pulsecore/thread-win32.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-thread-win32.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-thread-win32.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/thread-win32.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-thread-win32.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-thread-win32.lo `test -f 'pulsecore/thread-win32.c' || echo '$(srcdir)/'`pulsecore/thread-win32.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-win32.lo: pulsecore/semaphore-win32.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-win32.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-win32.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-win32.lo `test -f 'pulsecore/semaphore-win32.c' || echo '$(srcdir)/'`pulsecore/semaphore-win32.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-win32.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-win32.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/semaphore-win32.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-win32.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-win32.lo `test -f 'pulsecore/semaphore-win32.c' || echo '$(srcdir)/'`pulsecore/semaphore-win32.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-mutex-posix.lo: pulsecore/mutex-posix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-mutex-posix.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-mutex-posix.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-mutex-posix.lo `test -f 'pulsecore/mutex-posix.c' || echo '$(srcdir)/'`pulsecore/mutex-posix.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-mutex-posix.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-mutex-posix.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/mutex-posix.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-mutex-posix.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-mutex-posix.lo `test -f 'pulsecore/mutex-posix.c' || echo '$(srcdir)/'`pulsecore/mutex-posix.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-thread-posix.lo: pulsecore/thread-posix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-thread-posix.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-thread-posix.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-thread-posix.lo `test -f 'pulsecore/thread-posix.c' || echo '$(srcdir)/'`pulsecore/thread-posix.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-thread-posix.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-thread-posix.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/thread-posix.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-thread-posix.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-thread-posix.lo `test -f 'pulsecore/thread-posix.c' || echo '$(srcdir)/'`pulsecore/thread-posix.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-osx.lo: pulsecore/semaphore-osx.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-osx.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-osx.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-osx.lo `test -f 'pulsecore/semaphore-osx.c' || echo '$(srcdir)/'`pulsecore/semaphore-osx.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-osx.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-osx.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/semaphore-osx.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-osx.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-osx.lo `test -f 'pulsecore/semaphore-osx.c' || echo '$(srcdir)/'`pulsecore/semaphore-osx.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-posix.lo: pulsecore/semaphore-posix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-posix.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-posix.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-posix.lo `test -f 'pulsecore/semaphore-posix.c' || echo '$(srcdir)/'`pulsecore/semaphore-posix.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-posix.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-posix.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/semaphore-posix.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-posix.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-posix.lo `test -f 'pulsecore/semaphore-posix.c' || echo '$(srcdir)/'`pulsecore/semaphore-posix.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-dllmain.lo: pulsecore/dllmain.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-dllmain.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-dllmain.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-dllmain.lo `test -f 'pulsecore/dllmain.c' || echo '$(srcdir)/'`pulsecore/dllmain.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-dllmain.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-dllmain.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/dllmain.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-dllmain.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-dllmain.lo `test -f 'pulsecore/dllmain.c' || echo '$(srcdir)/'`pulsecore/dllmain.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-dbus-util.lo: pulsecore/dbus-util.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-dbus-util.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-dbus-util.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-dbus-util.lo `test -f 'pulsecore/dbus-util.c' || echo '$(srcdir)/'`pulsecore/dbus-util.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-dbus-util.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-dbus-util.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/dbus-util.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-dbus-util.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-dbus-util.lo `test -f 'pulsecore/dbus-util.c' || echo '$(srcdir)/'`pulsecore/dbus-util.c + +pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-rtkit.lo: pulsecore/rtkit.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-rtkit.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-rtkit.Tpo -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-rtkit.lo `test -f 'pulsecore/rtkit.c' || echo '$(srcdir)/'`pulsecore/rtkit.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-rtkit.Tpo pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-rtkit.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/rtkit.c' object='pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-rtkit.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_@PA_MAJORMINOR@_la-rtkit.lo `test -f 'pulsecore/rtkit.c' || echo '$(srcdir)/'`pulsecore/rtkit.c + +pulsecore/filter/libpulsecore_@PA_MAJORMINOR@_la-lfe-filter.lo: pulsecore/filter/lfe-filter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/filter/libpulsecore_@PA_MAJORMINOR@_la-lfe-filter.lo -MD -MP -MF pulsecore/filter/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-lfe-filter.Tpo -c -o pulsecore/filter/libpulsecore_@PA_MAJORMINOR@_la-lfe-filter.lo `test -f 'pulsecore/filter/lfe-filter.c' || echo '$(srcdir)/'`pulsecore/filter/lfe-filter.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/filter/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-lfe-filter.Tpo pulsecore/filter/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-lfe-filter.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/filter/lfe-filter.c' object='pulsecore/filter/libpulsecore_@PA_MAJORMINOR@_la-lfe-filter.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/filter/libpulsecore_@PA_MAJORMINOR@_la-lfe-filter.lo `test -f 'pulsecore/filter/lfe-filter.c' || echo '$(srcdir)/'`pulsecore/filter/lfe-filter.c + +pulsecore/filter/libpulsecore_@PA_MAJORMINOR@_la-biquad.lo: pulsecore/filter/biquad.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/filter/libpulsecore_@PA_MAJORMINOR@_la-biquad.lo -MD -MP -MF pulsecore/filter/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-biquad.Tpo -c -o pulsecore/filter/libpulsecore_@PA_MAJORMINOR@_la-biquad.lo `test -f 'pulsecore/filter/biquad.c' || echo '$(srcdir)/'`pulsecore/filter/biquad.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/filter/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-biquad.Tpo pulsecore/filter/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-biquad.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/filter/biquad.c' object='pulsecore/filter/libpulsecore_@PA_MAJORMINOR@_la-biquad.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/filter/libpulsecore_@PA_MAJORMINOR@_la-biquad.lo `test -f 'pulsecore/filter/biquad.c' || echo '$(srcdir)/'`pulsecore/filter/biquad.c + +pulsecore/filter/libpulsecore_@PA_MAJORMINOR@_la-crossover.lo: pulsecore/filter/crossover.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/filter/libpulsecore_@PA_MAJORMINOR@_la-crossover.lo -MD -MP -MF pulsecore/filter/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-crossover.Tpo -c -o pulsecore/filter/libpulsecore_@PA_MAJORMINOR@_la-crossover.lo `test -f 'pulsecore/filter/crossover.c' || echo '$(srcdir)/'`pulsecore/filter/crossover.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/filter/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-crossover.Tpo pulsecore/filter/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-crossover.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/filter/crossover.c' object='pulsecore/filter/libpulsecore_@PA_MAJORMINOR@_la-crossover.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/filter/libpulsecore_@PA_MAJORMINOR@_la-crossover.lo `test -f 'pulsecore/filter/crossover.c' || echo '$(srcdir)/'`pulsecore/filter/crossover.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-asyncmsgq.lo: pulsecore/asyncmsgq.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-asyncmsgq.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-asyncmsgq.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-asyncmsgq.lo `test -f 'pulsecore/asyncmsgq.c' || echo '$(srcdir)/'`pulsecore/asyncmsgq.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-asyncmsgq.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-asyncmsgq.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/asyncmsgq.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-asyncmsgq.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-asyncmsgq.lo `test -f 'pulsecore/asyncmsgq.c' || echo '$(srcdir)/'`pulsecore/asyncmsgq.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-asyncq.lo: pulsecore/asyncq.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-asyncq.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-asyncq.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-asyncq.lo `test -f 'pulsecore/asyncq.c' || echo '$(srcdir)/'`pulsecore/asyncq.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-asyncq.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-asyncq.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/asyncq.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-asyncq.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-asyncq.lo `test -f 'pulsecore/asyncq.c' || echo '$(srcdir)/'`pulsecore/asyncq.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-auth-cookie.lo: pulsecore/auth-cookie.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-auth-cookie.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-auth-cookie.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-auth-cookie.lo `test -f 'pulsecore/auth-cookie.c' || echo '$(srcdir)/'`pulsecore/auth-cookie.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-auth-cookie.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-auth-cookie.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/auth-cookie.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-auth-cookie.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-auth-cookie.lo `test -f 'pulsecore/auth-cookie.c' || echo '$(srcdir)/'`pulsecore/auth-cookie.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cli-command.lo: pulsecore/cli-command.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cli-command.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cli-command.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cli-command.lo `test -f 'pulsecore/cli-command.c' || echo '$(srcdir)/'`pulsecore/cli-command.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cli-command.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cli-command.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/cli-command.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cli-command.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cli-command.lo `test -f 'pulsecore/cli-command.c' || echo '$(srcdir)/'`pulsecore/cli-command.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cli-text.lo: pulsecore/cli-text.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cli-text.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cli-text.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cli-text.lo `test -f 'pulsecore/cli-text.c' || echo '$(srcdir)/'`pulsecore/cli-text.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cli-text.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cli-text.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/cli-text.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cli-text.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cli-text.lo `test -f 'pulsecore/cli-text.c' || echo '$(srcdir)/'`pulsecore/cli-text.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-client.lo: pulsecore/client.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-client.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-client.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-client.lo `test -f 'pulsecore/client.c' || echo '$(srcdir)/'`pulsecore/client.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-client.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-client.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/client.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-client.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-client.lo `test -f 'pulsecore/client.c' || echo '$(srcdir)/'`pulsecore/client.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-card.lo: pulsecore/card.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-card.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-card.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-card.lo `test -f 'pulsecore/card.c' || echo '$(srcdir)/'`pulsecore/card.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-card.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-card.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/card.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-card.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-card.lo `test -f 'pulsecore/card.c' || echo '$(srcdir)/'`pulsecore/card.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-core-scache.lo: pulsecore/core-scache.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-core-scache.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-core-scache.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-core-scache.lo `test -f 'pulsecore/core-scache.c' || echo '$(srcdir)/'`pulsecore/core-scache.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-core-scache.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-core-scache.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/core-scache.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-core-scache.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-core-scache.lo `test -f 'pulsecore/core-scache.c' || echo '$(srcdir)/'`pulsecore/core-scache.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-core-subscribe.lo: pulsecore/core-subscribe.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-core-subscribe.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-core-subscribe.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-core-subscribe.lo `test -f 'pulsecore/core-subscribe.c' || echo '$(srcdir)/'`pulsecore/core-subscribe.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-core-subscribe.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-core-subscribe.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/core-subscribe.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-core-subscribe.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-core-subscribe.lo `test -f 'pulsecore/core-subscribe.c' || echo '$(srcdir)/'`pulsecore/core-subscribe.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-core.lo: pulsecore/core.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-core.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-core.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-core.lo `test -f 'pulsecore/core.c' || echo '$(srcdir)/'`pulsecore/core.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-core.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-core.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/core.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-core.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-core.lo `test -f 'pulsecore/core.c' || echo '$(srcdir)/'`pulsecore/core.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-message-handler.lo: pulsecore/message-handler.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-message-handler.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-message-handler.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-message-handler.lo `test -f 'pulsecore/message-handler.c' || echo '$(srcdir)/'`pulsecore/message-handler.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-message-handler.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-message-handler.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/message-handler.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-message-handler.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-message-handler.lo `test -f 'pulsecore/message-handler.c' || echo '$(srcdir)/'`pulsecore/message-handler.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-hook-list.lo: pulsecore/hook-list.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-hook-list.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-hook-list.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-hook-list.lo `test -f 'pulsecore/hook-list.c' || echo '$(srcdir)/'`pulsecore/hook-list.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-hook-list.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-hook-list.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/hook-list.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-hook-list.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-hook-list.lo `test -f 'pulsecore/hook-list.c' || echo '$(srcdir)/'`pulsecore/hook-list.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-ltdl-helper.lo: pulsecore/ltdl-helper.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-ltdl-helper.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-ltdl-helper.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-ltdl-helper.lo `test -f 'pulsecore/ltdl-helper.c' || echo '$(srcdir)/'`pulsecore/ltdl-helper.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-ltdl-helper.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-ltdl-helper.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/ltdl-helper.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-ltdl-helper.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-ltdl-helper.lo `test -f 'pulsecore/ltdl-helper.c' || echo '$(srcdir)/'`pulsecore/ltdl-helper.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-modargs.lo: pulsecore/modargs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-modargs.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-modargs.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-modargs.lo `test -f 'pulsecore/modargs.c' || echo '$(srcdir)/'`pulsecore/modargs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-modargs.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-modargs.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/modargs.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-modargs.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-modargs.lo `test -f 'pulsecore/modargs.c' || echo '$(srcdir)/'`pulsecore/modargs.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-modinfo.lo: pulsecore/modinfo.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-modinfo.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-modinfo.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-modinfo.lo `test -f 'pulsecore/modinfo.c' || echo '$(srcdir)/'`pulsecore/modinfo.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-modinfo.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-modinfo.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/modinfo.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-modinfo.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-modinfo.lo `test -f 'pulsecore/modinfo.c' || echo '$(srcdir)/'`pulsecore/modinfo.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-module.lo: pulsecore/module.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-module.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-module.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-module.lo `test -f 'pulsecore/module.c' || echo '$(srcdir)/'`pulsecore/module.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-module.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-module.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/module.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-module.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-module.lo `test -f 'pulsecore/module.c' || echo '$(srcdir)/'`pulsecore/module.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-msgobject.lo: pulsecore/msgobject.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-msgobject.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-msgobject.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-msgobject.lo `test -f 'pulsecore/msgobject.c' || echo '$(srcdir)/'`pulsecore/msgobject.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-msgobject.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-msgobject.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/msgobject.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-msgobject.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-msgobject.lo `test -f 'pulsecore/msgobject.c' || echo '$(srcdir)/'`pulsecore/msgobject.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-namereg.lo: pulsecore/namereg.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-namereg.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-namereg.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-namereg.lo `test -f 'pulsecore/namereg.c' || echo '$(srcdir)/'`pulsecore/namereg.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-namereg.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-namereg.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/namereg.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-namereg.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-namereg.lo `test -f 'pulsecore/namereg.c' || echo '$(srcdir)/'`pulsecore/namereg.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-object.lo: pulsecore/object.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-object.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-object.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-object.lo `test -f 'pulsecore/object.c' || echo '$(srcdir)/'`pulsecore/object.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-object.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-object.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/object.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-object.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-object.lo `test -f 'pulsecore/object.c' || echo '$(srcdir)/'`pulsecore/object.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-play-memblockq.lo: pulsecore/play-memblockq.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-play-memblockq.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-play-memblockq.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-play-memblockq.lo `test -f 'pulsecore/play-memblockq.c' || echo '$(srcdir)/'`pulsecore/play-memblockq.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-play-memblockq.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-play-memblockq.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/play-memblockq.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-play-memblockq.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-play-memblockq.lo `test -f 'pulsecore/play-memblockq.c' || echo '$(srcdir)/'`pulsecore/play-memblockq.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-play-memchunk.lo: pulsecore/play-memchunk.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-play-memchunk.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-play-memchunk.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-play-memchunk.lo `test -f 'pulsecore/play-memchunk.c' || echo '$(srcdir)/'`pulsecore/play-memchunk.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-play-memchunk.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-play-memchunk.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/play-memchunk.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-play-memchunk.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-play-memchunk.lo `test -f 'pulsecore/play-memchunk.c' || echo '$(srcdir)/'`pulsecore/play-memchunk.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-remap.lo: pulsecore/remap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-remap.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-remap.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-remap.lo `test -f 'pulsecore/remap.c' || echo '$(srcdir)/'`pulsecore/remap.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-remap.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-remap.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/remap.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-remap.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-remap.lo `test -f 'pulsecore/remap.c' || echo '$(srcdir)/'`pulsecore/remap.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-remap_mmx.lo: pulsecore/remap_mmx.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-remap_mmx.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-remap_mmx.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-remap_mmx.lo `test -f 'pulsecore/remap_mmx.c' || echo '$(srcdir)/'`pulsecore/remap_mmx.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-remap_mmx.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-remap_mmx.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/remap_mmx.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-remap_mmx.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-remap_mmx.lo `test -f 'pulsecore/remap_mmx.c' || echo '$(srcdir)/'`pulsecore/remap_mmx.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-remap_sse.lo: pulsecore/remap_sse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-remap_sse.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-remap_sse.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-remap_sse.lo `test -f 'pulsecore/remap_sse.c' || echo '$(srcdir)/'`pulsecore/remap_sse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-remap_sse.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-remap_sse.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/remap_sse.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-remap_sse.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-remap_sse.lo `test -f 'pulsecore/remap_sse.c' || echo '$(srcdir)/'`pulsecore/remap_sse.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-resampler.lo: pulsecore/resampler.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-resampler.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-resampler.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-resampler.lo `test -f 'pulsecore/resampler.c' || echo '$(srcdir)/'`pulsecore/resampler.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-resampler.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-resampler.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/resampler.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-resampler.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-resampler.lo `test -f 'pulsecore/resampler.c' || echo '$(srcdir)/'`pulsecore/resampler.c + +pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-ffmpeg.lo: pulsecore/resampler/ffmpeg.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-ffmpeg.lo -MD -MP -MF pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-ffmpeg.Tpo -c -o pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-ffmpeg.lo `test -f 'pulsecore/resampler/ffmpeg.c' || echo '$(srcdir)/'`pulsecore/resampler/ffmpeg.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-ffmpeg.Tpo pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-ffmpeg.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/resampler/ffmpeg.c' object='pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-ffmpeg.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-ffmpeg.lo `test -f 'pulsecore/resampler/ffmpeg.c' || echo '$(srcdir)/'`pulsecore/resampler/ffmpeg.c + +pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-peaks.lo: pulsecore/resampler/peaks.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-peaks.lo -MD -MP -MF pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-peaks.Tpo -c -o pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-peaks.lo `test -f 'pulsecore/resampler/peaks.c' || echo '$(srcdir)/'`pulsecore/resampler/peaks.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-peaks.Tpo pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-peaks.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/resampler/peaks.c' object='pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-peaks.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-peaks.lo `test -f 'pulsecore/resampler/peaks.c' || echo '$(srcdir)/'`pulsecore/resampler/peaks.c + +pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-trivial.lo: pulsecore/resampler/trivial.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-trivial.lo -MD -MP -MF pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-trivial.Tpo -c -o pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-trivial.lo `test -f 'pulsecore/resampler/trivial.c' || echo '$(srcdir)/'`pulsecore/resampler/trivial.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-trivial.Tpo pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-trivial.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/resampler/trivial.c' object='pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-trivial.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-trivial.lo `test -f 'pulsecore/resampler/trivial.c' || echo '$(srcdir)/'`pulsecore/resampler/trivial.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-rtpoll.lo: pulsecore/rtpoll.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-rtpoll.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-rtpoll.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-rtpoll.lo `test -f 'pulsecore/rtpoll.c' || echo '$(srcdir)/'`pulsecore/rtpoll.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-rtpoll.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-rtpoll.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/rtpoll.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-rtpoll.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-rtpoll.lo `test -f 'pulsecore/rtpoll.c' || echo '$(srcdir)/'`pulsecore/rtpoll.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-stream-util.lo: pulsecore/stream-util.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-stream-util.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-stream-util.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-stream-util.lo `test -f 'pulsecore/stream-util.c' || echo '$(srcdir)/'`pulsecore/stream-util.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-stream-util.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-stream-util.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/stream-util.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-stream-util.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-stream-util.lo `test -f 'pulsecore/stream-util.c' || echo '$(srcdir)/'`pulsecore/stream-util.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_c.lo: pulsecore/svolume_c.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_c.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_c.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_c.lo `test -f 'pulsecore/svolume_c.c' || echo '$(srcdir)/'`pulsecore/svolume_c.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_c.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_c.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/svolume_c.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_c.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_c.lo `test -f 'pulsecore/svolume_c.c' || echo '$(srcdir)/'`pulsecore/svolume_c.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_arm.lo: pulsecore/svolume_arm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_arm.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_arm.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_arm.lo `test -f 'pulsecore/svolume_arm.c' || echo '$(srcdir)/'`pulsecore/svolume_arm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_arm.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_arm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/svolume_arm.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_arm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_arm.lo `test -f 'pulsecore/svolume_arm.c' || echo '$(srcdir)/'`pulsecore/svolume_arm.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_mmx.lo: pulsecore/svolume_mmx.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_mmx.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_mmx.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_mmx.lo `test -f 'pulsecore/svolume_mmx.c' || echo '$(srcdir)/'`pulsecore/svolume_mmx.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_mmx.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_mmx.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/svolume_mmx.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_mmx.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_mmx.lo `test -f 'pulsecore/svolume_mmx.c' || echo '$(srcdir)/'`pulsecore/svolume_mmx.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_sse.lo: pulsecore/svolume_sse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_sse.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_sse.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_sse.lo `test -f 'pulsecore/svolume_sse.c' || echo '$(srcdir)/'`pulsecore/svolume_sse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_sse.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_sse.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/svolume_sse.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_sse.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_sse.lo `test -f 'pulsecore/svolume_sse.c' || echo '$(srcdir)/'`pulsecore/svolume_sse.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-mix.lo: pulsecore/mix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-mix.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-mix.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-mix.lo `test -f 'pulsecore/mix.c' || echo '$(srcdir)/'`pulsecore/mix.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-mix.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-mix.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/mix.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-mix.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-mix.lo `test -f 'pulsecore/mix.c' || echo '$(srcdir)/'`pulsecore/mix.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu.lo: pulsecore/cpu.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu.lo `test -f 'pulsecore/cpu.c' || echo '$(srcdir)/'`pulsecore/cpu.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/cpu.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu.lo `test -f 'pulsecore/cpu.c' || echo '$(srcdir)/'`pulsecore/cpu.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu-arm.lo: pulsecore/cpu-arm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu-arm.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu-arm.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu-arm.lo `test -f 'pulsecore/cpu-arm.c' || echo '$(srcdir)/'`pulsecore/cpu-arm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu-arm.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu-arm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/cpu-arm.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu-arm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu-arm.lo `test -f 'pulsecore/cpu-arm.c' || echo '$(srcdir)/'`pulsecore/cpu-arm.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu-x86.lo: pulsecore/cpu-x86.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu-x86.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu-x86.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu-x86.lo `test -f 'pulsecore/cpu-x86.c' || echo '$(srcdir)/'`pulsecore/cpu-x86.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu-x86.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu-x86.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/cpu-x86.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu-x86.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu-x86.lo `test -f 'pulsecore/cpu-x86.c' || echo '$(srcdir)/'`pulsecore/cpu-x86.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu-orc.lo: pulsecore/cpu-orc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu-orc.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu-orc.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu-orc.lo `test -f 'pulsecore/cpu-orc.c' || echo '$(srcdir)/'`pulsecore/cpu-orc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu-orc.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu-orc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/cpu-orc.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu-orc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-cpu-orc.lo `test -f 'pulsecore/cpu-orc.c' || echo '$(srcdir)/'`pulsecore/cpu-orc.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16be.lo: pulsecore/sconv-s16be.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16be.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16be.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16be.lo `test -f 'pulsecore/sconv-s16be.c' || echo '$(srcdir)/'`pulsecore/sconv-s16be.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16be.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16be.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/sconv-s16be.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16be.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16be.lo `test -f 'pulsecore/sconv-s16be.c' || echo '$(srcdir)/'`pulsecore/sconv-s16be.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16le.lo: pulsecore/sconv-s16le.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16le.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16le.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16le.lo `test -f 'pulsecore/sconv-s16le.c' || echo '$(srcdir)/'`pulsecore/sconv-s16le.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16le.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16le.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/sconv-s16le.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16le.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16le.lo `test -f 'pulsecore/sconv-s16le.c' || echo '$(srcdir)/'`pulsecore/sconv-s16le.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv_sse.lo: pulsecore/sconv_sse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv_sse.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv_sse.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv_sse.lo `test -f 'pulsecore/sconv_sse.c' || echo '$(srcdir)/'`pulsecore/sconv_sse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv_sse.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv_sse.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/sconv_sse.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv_sse.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv_sse.lo `test -f 'pulsecore/sconv_sse.c' || echo '$(srcdir)/'`pulsecore/sconv_sse.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv.lo: pulsecore/sconv.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv.lo `test -f 'pulsecore/sconv.c' || echo '$(srcdir)/'`pulsecore/sconv.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/sconv.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sconv.lo `test -f 'pulsecore/sconv.c' || echo '$(srcdir)/'`pulsecore/sconv.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-shared.lo: pulsecore/shared.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-shared.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-shared.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-shared.lo `test -f 'pulsecore/shared.c' || echo '$(srcdir)/'`pulsecore/shared.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-shared.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-shared.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/shared.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-shared.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-shared.lo `test -f 'pulsecore/shared.c' || echo '$(srcdir)/'`pulsecore/shared.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sink-input.lo: pulsecore/sink-input.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sink-input.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sink-input.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sink-input.lo `test -f 'pulsecore/sink-input.c' || echo '$(srcdir)/'`pulsecore/sink-input.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sink-input.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sink-input.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/sink-input.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sink-input.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sink-input.lo `test -f 'pulsecore/sink-input.c' || echo '$(srcdir)/'`pulsecore/sink-input.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sink.lo: pulsecore/sink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sink.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sink.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sink.lo `test -f 'pulsecore/sink.c' || echo '$(srcdir)/'`pulsecore/sink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sink.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/sink.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sink.lo `test -f 'pulsecore/sink.c' || echo '$(srcdir)/'`pulsecore/sink.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-device-port.lo: pulsecore/device-port.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-device-port.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-device-port.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-device-port.lo `test -f 'pulsecore/device-port.c' || echo '$(srcdir)/'`pulsecore/device-port.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-device-port.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-device-port.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/device-port.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-device-port.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-device-port.lo `test -f 'pulsecore/device-port.c' || echo '$(srcdir)/'`pulsecore/device-port.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sioman.lo: pulsecore/sioman.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sioman.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sioman.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sioman.lo `test -f 'pulsecore/sioman.c' || echo '$(srcdir)/'`pulsecore/sioman.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sioman.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sioman.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/sioman.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sioman.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sioman.lo `test -f 'pulsecore/sioman.c' || echo '$(srcdir)/'`pulsecore/sioman.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sound-file-stream.lo: pulsecore/sound-file-stream.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sound-file-stream.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sound-file-stream.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sound-file-stream.lo `test -f 'pulsecore/sound-file-stream.c' || echo '$(srcdir)/'`pulsecore/sound-file-stream.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sound-file-stream.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sound-file-stream.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/sound-file-stream.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sound-file-stream.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sound-file-stream.lo `test -f 'pulsecore/sound-file-stream.c' || echo '$(srcdir)/'`pulsecore/sound-file-stream.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sound-file.lo: pulsecore/sound-file.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sound-file.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sound-file.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sound-file.lo `test -f 'pulsecore/sound-file.c' || echo '$(srcdir)/'`pulsecore/sound-file.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sound-file.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sound-file.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/sound-file.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sound-file.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-sound-file.lo `test -f 'pulsecore/sound-file.c' || echo '$(srcdir)/'`pulsecore/sound-file.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-source-output.lo: pulsecore/source-output.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-source-output.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-source-output.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-source-output.lo `test -f 'pulsecore/source-output.c' || echo '$(srcdir)/'`pulsecore/source-output.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-source-output.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-source-output.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/source-output.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-source-output.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-source-output.lo `test -f 'pulsecore/source-output.c' || echo '$(srcdir)/'`pulsecore/source-output.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-source.lo: pulsecore/source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-source.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-source.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-source.lo `test -f 'pulsecore/source.c' || echo '$(srcdir)/'`pulsecore/source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-source.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-source.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/source.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-source.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-source.lo `test -f 'pulsecore/source.c' || echo '$(srcdir)/'`pulsecore/source.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-start-child.lo: pulsecore/start-child.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-start-child.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-start-child.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-start-child.lo `test -f 'pulsecore/start-child.c' || echo '$(srcdir)/'`pulsecore/start-child.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-start-child.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-start-child.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/start-child.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-start-child.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-start-child.lo `test -f 'pulsecore/start-child.c' || echo '$(srcdir)/'`pulsecore/start-child.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-thread-mq.lo: pulsecore/thread-mq.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-thread-mq.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-thread-mq.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-thread-mq.lo `test -f 'pulsecore/thread-mq.c' || echo '$(srcdir)/'`pulsecore/thread-mq.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-thread-mq.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-thread-mq.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/thread-mq.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-thread-mq.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-thread-mq.lo `test -f 'pulsecore/thread-mq.c' || echo '$(srcdir)/'`pulsecore/thread-mq.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database.lo: pulsecore/database.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database.lo `test -f 'pulsecore/database.c' || echo '$(srcdir)/'`pulsecore/database.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/database.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database.lo `test -f 'pulsecore/database.c' || echo '$(srcdir)/'`pulsecore/database.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_orc.lo: pulsecore/svolume_orc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_orc.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_orc.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_orc.lo `test -f 'pulsecore/svolume_orc.c' || echo '$(srcdir)/'`pulsecore/svolume_orc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_orc.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_orc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/svolume_orc.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_orc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume_orc.lo `test -f 'pulsecore/svolume_orc.c' || echo '$(srcdir)/'`pulsecore/svolume_orc.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-x11wrap.lo: pulsecore/x11wrap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-x11wrap.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-x11wrap.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-x11wrap.lo `test -f 'pulsecore/x11wrap.c' || echo '$(srcdir)/'`pulsecore/x11wrap.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-x11wrap.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-x11wrap.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/x11wrap.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-x11wrap.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-x11wrap.lo `test -f 'pulsecore/x11wrap.c' || echo '$(srcdir)/'`pulsecore/x11wrap.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-dbus-shared.lo: pulsecore/dbus-shared.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-dbus-shared.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-dbus-shared.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-dbus-shared.lo `test -f 'pulsecore/dbus-shared.c' || echo '$(srcdir)/'`pulsecore/dbus-shared.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-dbus-shared.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-dbus-shared.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/dbus-shared.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-dbus-shared.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-dbus-shared.lo `test -f 'pulsecore/dbus-shared.c' || echo '$(srcdir)/'`pulsecore/dbus-shared.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-protocol-dbus.lo: pulsecore/protocol-dbus.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-protocol-dbus.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-protocol-dbus.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-protocol-dbus.lo `test -f 'pulsecore/protocol-dbus.c' || echo '$(srcdir)/'`pulsecore/protocol-dbus.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-protocol-dbus.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-protocol-dbus.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/protocol-dbus.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-protocol-dbus.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-protocol-dbus.lo `test -f 'pulsecore/protocol-dbus.c' || echo '$(srcdir)/'`pulsecore/protocol-dbus.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database-gdbm.lo: pulsecore/database-gdbm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database-gdbm.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database-gdbm.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database-gdbm.lo `test -f 'pulsecore/database-gdbm.c' || echo '$(srcdir)/'`pulsecore/database-gdbm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database-gdbm.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database-gdbm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/database-gdbm.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database-gdbm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database-gdbm.lo `test -f 'pulsecore/database-gdbm.c' || echo '$(srcdir)/'`pulsecore/database-gdbm.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database-tdb.lo: pulsecore/database-tdb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database-tdb.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database-tdb.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database-tdb.lo `test -f 'pulsecore/database-tdb.c' || echo '$(srcdir)/'`pulsecore/database-tdb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database-tdb.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database-tdb.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/database-tdb.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database-tdb.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database-tdb.lo `test -f 'pulsecore/database-tdb.c' || echo '$(srcdir)/'`pulsecore/database-tdb.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database-simple.lo: pulsecore/database-simple.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database-simple.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database-simple.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database-simple.lo `test -f 'pulsecore/database-simple.c' || echo '$(srcdir)/'`pulsecore/database-simple.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database-simple.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database-simple.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/database-simple.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database-simple.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-database-simple.lo `test -f 'pulsecore/database-simple.c' || echo '$(srcdir)/'`pulsecore/database-simple.c + +pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-speex.lo: pulsecore/resampler/speex.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-speex.lo -MD -MP -MF pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-speex.Tpo -c -o pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-speex.lo `test -f 'pulsecore/resampler/speex.c' || echo '$(srcdir)/'`pulsecore/resampler/speex.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-speex.Tpo pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-speex.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/resampler/speex.c' object='pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-speex.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-speex.lo `test -f 'pulsecore/resampler/speex.c' || echo '$(srcdir)/'`pulsecore/resampler/speex.c + +pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-soxr.lo: pulsecore/resampler/soxr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-soxr.lo -MD -MP -MF pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-soxr.Tpo -c -o pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-soxr.lo `test -f 'pulsecore/resampler/soxr.c' || echo '$(srcdir)/'`pulsecore/resampler/soxr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-soxr.Tpo pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-soxr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/resampler/soxr.c' object='pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-soxr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-soxr.lo `test -f 'pulsecore/resampler/soxr.c' || echo '$(srcdir)/'`pulsecore/resampler/soxr.c + +pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-libsamplerate.lo: pulsecore/resampler/libsamplerate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-libsamplerate.lo -MD -MP -MF pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-libsamplerate.Tpo -c -o pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-libsamplerate.lo `test -f 'pulsecore/resampler/libsamplerate.c' || echo '$(srcdir)/'`pulsecore/resampler/libsamplerate.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-libsamplerate.Tpo pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-libsamplerate.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/resampler/libsamplerate.c' object='pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-libsamplerate.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/resampler/libpulsecore_@PA_MAJORMINOR@_la-libsamplerate.lo `test -f 'pulsecore/resampler/libsamplerate.c' || echo '$(srcdir)/'`pulsecore/resampler/libsamplerate.c + +pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume-orc-gen.lo: pulsecore/svolume-orc-gen.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume-orc-gen.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume-orc-gen.Tpo -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume-orc-gen.lo `test -f 'pulsecore/svolume-orc-gen.c' || echo '$(srcdir)/'`pulsecore/svolume-orc-gen.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume-orc-gen.Tpo pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume-orc-gen.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/svolume-orc-gen.c' object='pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume-orc-gen.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_@PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_@PA_MAJORMINOR@_la-svolume-orc-gen.lo `test -f 'pulsecore/svolume-orc-gen.c' || echo '$(srcdir)/'`pulsecore/svolume-orc-gen.c + +pulsecore/ffmpeg/libpulsecore_foreign_la-resample2.lo: pulsecore/ffmpeg/resample2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_foreign_la_CFLAGS) $(CFLAGS) -MT pulsecore/ffmpeg/libpulsecore_foreign_la-resample2.lo -MD -MP -MF pulsecore/ffmpeg/$(DEPDIR)/libpulsecore_foreign_la-resample2.Tpo -c -o pulsecore/ffmpeg/libpulsecore_foreign_la-resample2.lo `test -f 'pulsecore/ffmpeg/resample2.c' || echo '$(srcdir)/'`pulsecore/ffmpeg/resample2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/ffmpeg/$(DEPDIR)/libpulsecore_foreign_la-resample2.Tpo pulsecore/ffmpeg/$(DEPDIR)/libpulsecore_foreign_la-resample2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/ffmpeg/resample2.c' object='pulsecore/ffmpeg/libpulsecore_foreign_la-resample2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_foreign_la_CFLAGS) $(CFLAGS) -c -o pulsecore/ffmpeg/libpulsecore_foreign_la-resample2.lo `test -f 'pulsecore/ffmpeg/resample2.c' || echo '$(srcdir)/'`pulsecore/ffmpeg/resample2.c + +pulsecore/libpulsecore_mix_neon_la-mix_neon.lo: pulsecore/mix_neon.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_mix_neon_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_mix_neon_la-mix_neon.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_mix_neon_la-mix_neon.Tpo -c -o pulsecore/libpulsecore_mix_neon_la-mix_neon.lo `test -f 'pulsecore/mix_neon.c' || echo '$(srcdir)/'`pulsecore/mix_neon.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_mix_neon_la-mix_neon.Tpo pulsecore/$(DEPDIR)/libpulsecore_mix_neon_la-mix_neon.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/mix_neon.c' object='pulsecore/libpulsecore_mix_neon_la-mix_neon.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_mix_neon_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_mix_neon_la-mix_neon.lo `test -f 'pulsecore/mix_neon.c' || echo '$(srcdir)/'`pulsecore/mix_neon.c + +pulsecore/libpulsecore_remap_neon_la-remap_neon.lo: pulsecore/remap_neon.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_remap_neon_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_remap_neon_la-remap_neon.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_remap_neon_la-remap_neon.Tpo -c -o pulsecore/libpulsecore_remap_neon_la-remap_neon.lo `test -f 'pulsecore/remap_neon.c' || echo '$(srcdir)/'`pulsecore/remap_neon.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_remap_neon_la-remap_neon.Tpo pulsecore/$(DEPDIR)/libpulsecore_remap_neon_la-remap_neon.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/remap_neon.c' object='pulsecore/libpulsecore_remap_neon_la-remap_neon.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_remap_neon_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_remap_neon_la-remap_neon.lo `test -f 'pulsecore/remap_neon.c' || echo '$(srcdir)/'`pulsecore/remap_neon.c + +pulsecore/libpulsecore_sconv_neon_la-sconv_neon.lo: pulsecore/sconv_neon.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_sconv_neon_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecore_sconv_neon_la-sconv_neon.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecore_sconv_neon_la-sconv_neon.Tpo -c -o pulsecore/libpulsecore_sconv_neon_la-sconv_neon.lo `test -f 'pulsecore/sconv_neon.c' || echo '$(srcdir)/'`pulsecore/sconv_neon.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecore_sconv_neon_la-sconv_neon.Tpo pulsecore/$(DEPDIR)/libpulsecore_sconv_neon_la-sconv_neon.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/sconv_neon.c' object='pulsecore/libpulsecore_sconv_neon_la-sconv_neon.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecore_sconv_neon_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecore_sconv_neon_la-sconv_neon.lo `test -f 'pulsecore/sconv_neon.c' || echo '$(srcdir)/'`pulsecore/sconv_neon.c + +utils/libpulsedsp_la-padsp.lo: utils/padsp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsedsp_la_CFLAGS) $(CFLAGS) -MT utils/libpulsedsp_la-padsp.lo -MD -MP -MF utils/$(DEPDIR)/libpulsedsp_la-padsp.Tpo -c -o utils/libpulsedsp_la-padsp.lo `test -f 'utils/padsp.c' || echo '$(srcdir)/'`utils/padsp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) utils/$(DEPDIR)/libpulsedsp_la-padsp.Tpo utils/$(DEPDIR)/libpulsedsp_la-padsp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils/padsp.c' object='utils/libpulsedsp_la-padsp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsedsp_la_CFLAGS) $(CFLAGS) -c -o utils/libpulsedsp_la-padsp.lo `test -f 'utils/padsp.c' || echo '$(srcdir)/'`utils/padsp.c + +modules/raop/libraop_la-raop-util.lo: modules/raop/raop-util.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libraop_la_CFLAGS) $(CFLAGS) -MT modules/raop/libraop_la-raop-util.lo -MD -MP -MF modules/raop/$(DEPDIR)/libraop_la-raop-util.Tpo -c -o modules/raop/libraop_la-raop-util.lo `test -f 'modules/raop/raop-util.c' || echo '$(srcdir)/'`modules/raop/raop-util.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/raop/$(DEPDIR)/libraop_la-raop-util.Tpo modules/raop/$(DEPDIR)/libraop_la-raop-util.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/raop/raop-util.c' object='modules/raop/libraop_la-raop-util.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libraop_la_CFLAGS) $(CFLAGS) -c -o modules/raop/libraop_la-raop-util.lo `test -f 'modules/raop/raop-util.c' || echo '$(srcdir)/'`modules/raop/raop-util.c + +modules/raop/libraop_la-raop-crypto.lo: modules/raop/raop-crypto.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libraop_la_CFLAGS) $(CFLAGS) -MT modules/raop/libraop_la-raop-crypto.lo -MD -MP -MF modules/raop/$(DEPDIR)/libraop_la-raop-crypto.Tpo -c -o modules/raop/libraop_la-raop-crypto.lo `test -f 'modules/raop/raop-crypto.c' || echo '$(srcdir)/'`modules/raop/raop-crypto.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/raop/$(DEPDIR)/libraop_la-raop-crypto.Tpo modules/raop/$(DEPDIR)/libraop_la-raop-crypto.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/raop/raop-crypto.c' object='modules/raop/libraop_la-raop-crypto.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libraop_la_CFLAGS) $(CFLAGS) -c -o modules/raop/libraop_la-raop-crypto.lo `test -f 'modules/raop/raop-crypto.c' || echo '$(srcdir)/'`modules/raop/raop-crypto.c + +modules/raop/libraop_la-raop-packet-buffer.lo: modules/raop/raop-packet-buffer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libraop_la_CFLAGS) $(CFLAGS) -MT modules/raop/libraop_la-raop-packet-buffer.lo -MD -MP -MF modules/raop/$(DEPDIR)/libraop_la-raop-packet-buffer.Tpo -c -o modules/raop/libraop_la-raop-packet-buffer.lo `test -f 'modules/raop/raop-packet-buffer.c' || echo '$(srcdir)/'`modules/raop/raop-packet-buffer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/raop/$(DEPDIR)/libraop_la-raop-packet-buffer.Tpo modules/raop/$(DEPDIR)/libraop_la-raop-packet-buffer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/raop/raop-packet-buffer.c' object='modules/raop/libraop_la-raop-packet-buffer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libraop_la_CFLAGS) $(CFLAGS) -c -o modules/raop/libraop_la-raop-packet-buffer.lo `test -f 'modules/raop/raop-packet-buffer.c' || echo '$(srcdir)/'`modules/raop/raop-packet-buffer.c + +modules/raop/libraop_la-raop-client.lo: modules/raop/raop-client.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libraop_la_CFLAGS) $(CFLAGS) -MT modules/raop/libraop_la-raop-client.lo -MD -MP -MF modules/raop/$(DEPDIR)/libraop_la-raop-client.Tpo -c -o modules/raop/libraop_la-raop-client.lo `test -f 'modules/raop/raop-client.c' || echo '$(srcdir)/'`modules/raop/raop-client.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/raop/$(DEPDIR)/libraop_la-raop-client.Tpo modules/raop/$(DEPDIR)/libraop_la-raop-client.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/raop/raop-client.c' object='modules/raop/libraop_la-raop-client.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libraop_la_CFLAGS) $(CFLAGS) -c -o modules/raop/libraop_la-raop-client.lo `test -f 'modules/raop/raop-client.c' || echo '$(srcdir)/'`modules/raop/raop-client.c + +modules/raop/libraop_la-raop-sink.lo: modules/raop/raop-sink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libraop_la_CFLAGS) $(CFLAGS) -MT modules/raop/libraop_la-raop-sink.lo -MD -MP -MF modules/raop/$(DEPDIR)/libraop_la-raop-sink.Tpo -c -o modules/raop/libraop_la-raop-sink.lo `test -f 'modules/raop/raop-sink.c' || echo '$(srcdir)/'`modules/raop/raop-sink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/raop/$(DEPDIR)/libraop_la-raop-sink.Tpo modules/raop/$(DEPDIR)/libraop_la-raop-sink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/raop/raop-sink.c' object='modules/raop/libraop_la-raop-sink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libraop_la_CFLAGS) $(CFLAGS) -c -o modules/raop/libraop_la-raop-sink.lo `test -f 'modules/raop/raop-sink.c' || echo '$(srcdir)/'`modules/raop/raop-sink.c + +modules/rtp/librtp_la-rtp-common.lo: modules/rtp/rtp-common.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(librtp_la_CFLAGS) $(CFLAGS) -MT modules/rtp/librtp_la-rtp-common.lo -MD -MP -MF modules/rtp/$(DEPDIR)/librtp_la-rtp-common.Tpo -c -o modules/rtp/librtp_la-rtp-common.lo `test -f 'modules/rtp/rtp-common.c' || echo '$(srcdir)/'`modules/rtp/rtp-common.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/rtp/$(DEPDIR)/librtp_la-rtp-common.Tpo modules/rtp/$(DEPDIR)/librtp_la-rtp-common.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/rtp/rtp-common.c' object='modules/rtp/librtp_la-rtp-common.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(librtp_la_CFLAGS) $(CFLAGS) -c -o modules/rtp/librtp_la-rtp-common.lo `test -f 'modules/rtp/rtp-common.c' || echo '$(srcdir)/'`modules/rtp/rtp-common.c + +modules/rtp/librtp_la-sdp.lo: modules/rtp/sdp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(librtp_la_CFLAGS) $(CFLAGS) -MT modules/rtp/librtp_la-sdp.lo -MD -MP -MF modules/rtp/$(DEPDIR)/librtp_la-sdp.Tpo -c -o modules/rtp/librtp_la-sdp.lo `test -f 'modules/rtp/sdp.c' || echo '$(srcdir)/'`modules/rtp/sdp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/rtp/$(DEPDIR)/librtp_la-sdp.Tpo modules/rtp/$(DEPDIR)/librtp_la-sdp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/rtp/sdp.c' object='modules/rtp/librtp_la-sdp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(librtp_la_CFLAGS) $(CFLAGS) -c -o modules/rtp/librtp_la-sdp.lo `test -f 'modules/rtp/sdp.c' || echo '$(srcdir)/'`modules/rtp/sdp.c + +modules/rtp/librtp_la-sap.lo: modules/rtp/sap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(librtp_la_CFLAGS) $(CFLAGS) -MT modules/rtp/librtp_la-sap.lo -MD -MP -MF modules/rtp/$(DEPDIR)/librtp_la-sap.Tpo -c -o modules/rtp/librtp_la-sap.lo `test -f 'modules/rtp/sap.c' || echo '$(srcdir)/'`modules/rtp/sap.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/rtp/$(DEPDIR)/librtp_la-sap.Tpo modules/rtp/$(DEPDIR)/librtp_la-sap.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/rtp/sap.c' object='modules/rtp/librtp_la-sap.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(librtp_la_CFLAGS) $(CFLAGS) -c -o modules/rtp/librtp_la-sap.lo `test -f 'modules/rtp/sap.c' || echo '$(srcdir)/'`modules/rtp/sap.c + +modules/rtp/librtp_la-rtsp_client.lo: modules/rtp/rtsp_client.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(librtp_la_CFLAGS) $(CFLAGS) -MT modules/rtp/librtp_la-rtsp_client.lo -MD -MP -MF modules/rtp/$(DEPDIR)/librtp_la-rtsp_client.Tpo -c -o modules/rtp/librtp_la-rtsp_client.lo `test -f 'modules/rtp/rtsp_client.c' || echo '$(srcdir)/'`modules/rtp/rtsp_client.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/rtp/$(DEPDIR)/librtp_la-rtsp_client.Tpo modules/rtp/$(DEPDIR)/librtp_la-rtsp_client.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/rtp/rtsp_client.c' object='modules/rtp/librtp_la-rtsp_client.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(librtp_la_CFLAGS) $(CFLAGS) -c -o modules/rtp/librtp_la-rtsp_client.lo `test -f 'modules/rtp/rtsp_client.c' || echo '$(srcdir)/'`modules/rtp/rtsp_client.c + +modules/rtp/librtp_la-headerlist.lo: modules/rtp/headerlist.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(librtp_la_CFLAGS) $(CFLAGS) -MT modules/rtp/librtp_la-headerlist.lo -MD -MP -MF modules/rtp/$(DEPDIR)/librtp_la-headerlist.Tpo -c -o modules/rtp/librtp_la-headerlist.lo `test -f 'modules/rtp/headerlist.c' || echo '$(srcdir)/'`modules/rtp/headerlist.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/rtp/$(DEPDIR)/librtp_la-headerlist.Tpo modules/rtp/$(DEPDIR)/librtp_la-headerlist.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/rtp/headerlist.c' object='modules/rtp/librtp_la-headerlist.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(librtp_la_CFLAGS) $(CFLAGS) -c -o modules/rtp/librtp_la-headerlist.lo `test -f 'modules/rtp/headerlist.c' || echo '$(srcdir)/'`modules/rtp/headerlist.c + +modules/rtp/librtp_la-rtp-gstreamer.lo: modules/rtp/rtp-gstreamer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(librtp_la_CFLAGS) $(CFLAGS) -MT modules/rtp/librtp_la-rtp-gstreamer.lo -MD -MP -MF modules/rtp/$(DEPDIR)/librtp_la-rtp-gstreamer.Tpo -c -o modules/rtp/librtp_la-rtp-gstreamer.lo `test -f 'modules/rtp/rtp-gstreamer.c' || echo '$(srcdir)/'`modules/rtp/rtp-gstreamer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/rtp/$(DEPDIR)/librtp_la-rtp-gstreamer.Tpo modules/rtp/$(DEPDIR)/librtp_la-rtp-gstreamer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/rtp/rtp-gstreamer.c' object='modules/rtp/librtp_la-rtp-gstreamer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(librtp_la_CFLAGS) $(CFLAGS) -c -o modules/rtp/librtp_la-rtp-gstreamer.lo `test -f 'modules/rtp/rtp-gstreamer.c' || echo '$(srcdir)/'`modules/rtp/rtp-gstreamer.c + +modules/rtp/librtp_la-rtp-native.lo: modules/rtp/rtp-native.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(librtp_la_CFLAGS) $(CFLAGS) -MT modules/rtp/librtp_la-rtp-native.lo -MD -MP -MF modules/rtp/$(DEPDIR)/librtp_la-rtp-native.Tpo -c -o modules/rtp/librtp_la-rtp-native.lo `test -f 'modules/rtp/rtp-native.c' || echo '$(srcdir)/'`modules/rtp/rtp-native.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/rtp/$(DEPDIR)/librtp_la-rtp-native.Tpo modules/rtp/$(DEPDIR)/librtp_la-rtp-native.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/rtp/rtp-native.c' object='modules/rtp/librtp_la-rtp-native.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(librtp_la_CFLAGS) $(CFLAGS) -c -o modules/rtp/librtp_la-rtp-native.lo `test -f 'modules/rtp/rtp-native.c' || echo '$(srcdir)/'`modules/rtp/rtp-native.c + +modules/module_allow_passthrough_la-module-allow-passthrough.lo: modules/module-allow-passthrough.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_allow_passthrough_la_CFLAGS) $(CFLAGS) -MT modules/module_allow_passthrough_la-module-allow-passthrough.lo -MD -MP -MF modules/$(DEPDIR)/module_allow_passthrough_la-module-allow-passthrough.Tpo -c -o modules/module_allow_passthrough_la-module-allow-passthrough.lo `test -f 'modules/module-allow-passthrough.c' || echo '$(srcdir)/'`modules/module-allow-passthrough.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_allow_passthrough_la-module-allow-passthrough.Tpo modules/$(DEPDIR)/module_allow_passthrough_la-module-allow-passthrough.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-allow-passthrough.c' object='modules/module_allow_passthrough_la-module-allow-passthrough.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_allow_passthrough_la_CFLAGS) $(CFLAGS) -c -o modules/module_allow_passthrough_la-module-allow-passthrough.lo `test -f 'modules/module-allow-passthrough.c' || echo '$(srcdir)/'`modules/module-allow-passthrough.c + +modules/alsa/module_alsa_card_la-module-alsa-card.lo: modules/alsa/module-alsa-card.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_alsa_card_la_CFLAGS) $(CFLAGS) -MT modules/alsa/module_alsa_card_la-module-alsa-card.lo -MD -MP -MF modules/alsa/$(DEPDIR)/module_alsa_card_la-module-alsa-card.Tpo -c -o modules/alsa/module_alsa_card_la-module-alsa-card.lo `test -f 'modules/alsa/module-alsa-card.c' || echo '$(srcdir)/'`modules/alsa/module-alsa-card.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/alsa/$(DEPDIR)/module_alsa_card_la-module-alsa-card.Tpo modules/alsa/$(DEPDIR)/module_alsa_card_la-module-alsa-card.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/alsa/module-alsa-card.c' object='modules/alsa/module_alsa_card_la-module-alsa-card.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_alsa_card_la_CFLAGS) $(CFLAGS) -c -o modules/alsa/module_alsa_card_la-module-alsa-card.lo `test -f 'modules/alsa/module-alsa-card.c' || echo '$(srcdir)/'`modules/alsa/module-alsa-card.c + +modules/alsa/module_alsa_sink_la-module-alsa-sink.lo: modules/alsa/module-alsa-sink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_alsa_sink_la_CFLAGS) $(CFLAGS) -MT modules/alsa/module_alsa_sink_la-module-alsa-sink.lo -MD -MP -MF modules/alsa/$(DEPDIR)/module_alsa_sink_la-module-alsa-sink.Tpo -c -o modules/alsa/module_alsa_sink_la-module-alsa-sink.lo `test -f 'modules/alsa/module-alsa-sink.c' || echo '$(srcdir)/'`modules/alsa/module-alsa-sink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/alsa/$(DEPDIR)/module_alsa_sink_la-module-alsa-sink.Tpo modules/alsa/$(DEPDIR)/module_alsa_sink_la-module-alsa-sink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/alsa/module-alsa-sink.c' object='modules/alsa/module_alsa_sink_la-module-alsa-sink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_alsa_sink_la_CFLAGS) $(CFLAGS) -c -o modules/alsa/module_alsa_sink_la-module-alsa-sink.lo `test -f 'modules/alsa/module-alsa-sink.c' || echo '$(srcdir)/'`modules/alsa/module-alsa-sink.c + +modules/alsa/module_alsa_source_la-module-alsa-source.lo: modules/alsa/module-alsa-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_alsa_source_la_CFLAGS) $(CFLAGS) -MT modules/alsa/module_alsa_source_la-module-alsa-source.lo -MD -MP -MF modules/alsa/$(DEPDIR)/module_alsa_source_la-module-alsa-source.Tpo -c -o modules/alsa/module_alsa_source_la-module-alsa-source.lo `test -f 'modules/alsa/module-alsa-source.c' || echo '$(srcdir)/'`modules/alsa/module-alsa-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/alsa/$(DEPDIR)/module_alsa_source_la-module-alsa-source.Tpo modules/alsa/$(DEPDIR)/module_alsa_source_la-module-alsa-source.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/alsa/module-alsa-source.c' object='modules/alsa/module_alsa_source_la-module-alsa-source.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_alsa_source_la_CFLAGS) $(CFLAGS) -c -o modules/alsa/module_alsa_source_la-module-alsa-source.lo `test -f 'modules/alsa/module-alsa-source.c' || echo '$(srcdir)/'`modules/alsa/module-alsa-source.c + +modules/module_always_sink_la-module-always-sink.lo: modules/module-always-sink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_always_sink_la_CFLAGS) $(CFLAGS) -MT modules/module_always_sink_la-module-always-sink.lo -MD -MP -MF modules/$(DEPDIR)/module_always_sink_la-module-always-sink.Tpo -c -o modules/module_always_sink_la-module-always-sink.lo `test -f 'modules/module-always-sink.c' || echo '$(srcdir)/'`modules/module-always-sink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_always_sink_la-module-always-sink.Tpo modules/$(DEPDIR)/module_always_sink_la-module-always-sink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-always-sink.c' object='modules/module_always_sink_la-module-always-sink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_always_sink_la_CFLAGS) $(CFLAGS) -c -o modules/module_always_sink_la-module-always-sink.lo `test -f 'modules/module-always-sink.c' || echo '$(srcdir)/'`modules/module-always-sink.c + +modules/module_always_source_la-module-always-source.lo: modules/module-always-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_always_source_la_CFLAGS) $(CFLAGS) -MT modules/module_always_source_la-module-always-source.lo -MD -MP -MF modules/$(DEPDIR)/module_always_source_la-module-always-source.Tpo -c -o modules/module_always_source_la-module-always-source.lo `test -f 'modules/module-always-source.c' || echo '$(srcdir)/'`modules/module-always-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_always_source_la-module-always-source.Tpo modules/$(DEPDIR)/module_always_source_la-module-always-source.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-always-source.c' object='modules/module_always_source_la-module-always-source.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_always_source_la_CFLAGS) $(CFLAGS) -c -o modules/module_always_source_la-module-always-source.lo `test -f 'modules/module-always-source.c' || echo '$(srcdir)/'`modules/module-always-source.c + +modules/module_augment_properties_la-module-augment-properties.lo: modules/module-augment-properties.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_augment_properties_la_CFLAGS) $(CFLAGS) -MT modules/module_augment_properties_la-module-augment-properties.lo -MD -MP -MF modules/$(DEPDIR)/module_augment_properties_la-module-augment-properties.Tpo -c -o modules/module_augment_properties_la-module-augment-properties.lo `test -f 'modules/module-augment-properties.c' || echo '$(srcdir)/'`modules/module-augment-properties.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_augment_properties_la-module-augment-properties.Tpo modules/$(DEPDIR)/module_augment_properties_la-module-augment-properties.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-augment-properties.c' object='modules/module_augment_properties_la-module-augment-properties.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_augment_properties_la_CFLAGS) $(CFLAGS) -c -o modules/module_augment_properties_la-module-augment-properties.lo `test -f 'modules/module-augment-properties.c' || echo '$(srcdir)/'`modules/module-augment-properties.c + +modules/bluetooth/module_bluetooth_discover_la-module-bluetooth-discover.lo: modules/bluetooth/module-bluetooth-discover.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_bluetooth_discover_la_CFLAGS) $(CFLAGS) -MT modules/bluetooth/module_bluetooth_discover_la-module-bluetooth-discover.lo -MD -MP -MF modules/bluetooth/$(DEPDIR)/module_bluetooth_discover_la-module-bluetooth-discover.Tpo -c -o modules/bluetooth/module_bluetooth_discover_la-module-bluetooth-discover.lo `test -f 'modules/bluetooth/module-bluetooth-discover.c' || echo '$(srcdir)/'`modules/bluetooth/module-bluetooth-discover.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/bluetooth/$(DEPDIR)/module_bluetooth_discover_la-module-bluetooth-discover.Tpo modules/bluetooth/$(DEPDIR)/module_bluetooth_discover_la-module-bluetooth-discover.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/bluetooth/module-bluetooth-discover.c' object='modules/bluetooth/module_bluetooth_discover_la-module-bluetooth-discover.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_bluetooth_discover_la_CFLAGS) $(CFLAGS) -c -o modules/bluetooth/module_bluetooth_discover_la-module-bluetooth-discover.lo `test -f 'modules/bluetooth/module-bluetooth-discover.c' || echo '$(srcdir)/'`modules/bluetooth/module-bluetooth-discover.c + +modules/bluetooth/module_bluetooth_policy_la-module-bluetooth-policy.lo: modules/bluetooth/module-bluetooth-policy.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_bluetooth_policy_la_CFLAGS) $(CFLAGS) -MT modules/bluetooth/module_bluetooth_policy_la-module-bluetooth-policy.lo -MD -MP -MF modules/bluetooth/$(DEPDIR)/module_bluetooth_policy_la-module-bluetooth-policy.Tpo -c -o modules/bluetooth/module_bluetooth_policy_la-module-bluetooth-policy.lo `test -f 'modules/bluetooth/module-bluetooth-policy.c' || echo '$(srcdir)/'`modules/bluetooth/module-bluetooth-policy.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/bluetooth/$(DEPDIR)/module_bluetooth_policy_la-module-bluetooth-policy.Tpo modules/bluetooth/$(DEPDIR)/module_bluetooth_policy_la-module-bluetooth-policy.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/bluetooth/module-bluetooth-policy.c' object='modules/bluetooth/module_bluetooth_policy_la-module-bluetooth-policy.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_bluetooth_policy_la_CFLAGS) $(CFLAGS) -c -o modules/bluetooth/module_bluetooth_policy_la-module-bluetooth-policy.lo `test -f 'modules/bluetooth/module-bluetooth-policy.c' || echo '$(srcdir)/'`modules/bluetooth/module-bluetooth-policy.c + +modules/bluetooth/module_bluez5_device_la-module-bluez5-device.lo: modules/bluetooth/module-bluez5-device.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_bluez5_device_la_CFLAGS) $(CFLAGS) -MT modules/bluetooth/module_bluez5_device_la-module-bluez5-device.lo -MD -MP -MF modules/bluetooth/$(DEPDIR)/module_bluez5_device_la-module-bluez5-device.Tpo -c -o modules/bluetooth/module_bluez5_device_la-module-bluez5-device.lo `test -f 'modules/bluetooth/module-bluez5-device.c' || echo '$(srcdir)/'`modules/bluetooth/module-bluez5-device.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/bluetooth/$(DEPDIR)/module_bluez5_device_la-module-bluez5-device.Tpo modules/bluetooth/$(DEPDIR)/module_bluez5_device_la-module-bluez5-device.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/bluetooth/module-bluez5-device.c' object='modules/bluetooth/module_bluez5_device_la-module-bluez5-device.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_bluez5_device_la_CFLAGS) $(CFLAGS) -c -o modules/bluetooth/module_bluez5_device_la-module-bluez5-device.lo `test -f 'modules/bluetooth/module-bluez5-device.c' || echo '$(srcdir)/'`modules/bluetooth/module-bluez5-device.c + +modules/bluetooth/module_bluez5_discover_la-module-bluez5-discover.lo: modules/bluetooth/module-bluez5-discover.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_bluez5_discover_la_CFLAGS) $(CFLAGS) -MT modules/bluetooth/module_bluez5_discover_la-module-bluez5-discover.lo -MD -MP -MF modules/bluetooth/$(DEPDIR)/module_bluez5_discover_la-module-bluez5-discover.Tpo -c -o modules/bluetooth/module_bluez5_discover_la-module-bluez5-discover.lo `test -f 'modules/bluetooth/module-bluez5-discover.c' || echo '$(srcdir)/'`modules/bluetooth/module-bluez5-discover.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/bluetooth/$(DEPDIR)/module_bluez5_discover_la-module-bluez5-discover.Tpo modules/bluetooth/$(DEPDIR)/module_bluez5_discover_la-module-bluez5-discover.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/bluetooth/module-bluez5-discover.c' object='modules/bluetooth/module_bluez5_discover_la-module-bluez5-discover.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_bluez5_discover_la_CFLAGS) $(CFLAGS) -c -o modules/bluetooth/module_bluez5_discover_la-module-bluez5-discover.lo `test -f 'modules/bluetooth/module-bluez5-discover.c' || echo '$(srcdir)/'`modules/bluetooth/module-bluez5-discover.c + +modules/macosx/module_bonjour_publish_la-module-bonjour-publish.lo: modules/macosx/module-bonjour-publish.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_bonjour_publish_la_CFLAGS) $(CFLAGS) -MT modules/macosx/module_bonjour_publish_la-module-bonjour-publish.lo -MD -MP -MF modules/macosx/$(DEPDIR)/module_bonjour_publish_la-module-bonjour-publish.Tpo -c -o modules/macosx/module_bonjour_publish_la-module-bonjour-publish.lo `test -f 'modules/macosx/module-bonjour-publish.c' || echo '$(srcdir)/'`modules/macosx/module-bonjour-publish.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/macosx/$(DEPDIR)/module_bonjour_publish_la-module-bonjour-publish.Tpo modules/macosx/$(DEPDIR)/module_bonjour_publish_la-module-bonjour-publish.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/macosx/module-bonjour-publish.c' object='modules/macosx/module_bonjour_publish_la-module-bonjour-publish.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_bonjour_publish_la_CFLAGS) $(CFLAGS) -c -o modules/macosx/module_bonjour_publish_la-module-bonjour-publish.lo `test -f 'modules/macosx/module-bonjour-publish.c' || echo '$(srcdir)/'`modules/macosx/module-bonjour-publish.c + +modules/module_card_restore_la-module-card-restore.lo: modules/module-card-restore.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_card_restore_la_CFLAGS) $(CFLAGS) -MT modules/module_card_restore_la-module-card-restore.lo -MD -MP -MF modules/$(DEPDIR)/module_card_restore_la-module-card-restore.Tpo -c -o modules/module_card_restore_la-module-card-restore.lo `test -f 'modules/module-card-restore.c' || echo '$(srcdir)/'`modules/module-card-restore.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_card_restore_la-module-card-restore.Tpo modules/$(DEPDIR)/module_card_restore_la-module-card-restore.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-card-restore.c' object='modules/module_card_restore_la-module-card-restore.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_card_restore_la_CFLAGS) $(CFLAGS) -c -o modules/module_card_restore_la-module-card-restore.lo `test -f 'modules/module-card-restore.c' || echo '$(srcdir)/'`modules/module-card-restore.c + +modules/module_cli_protocol_tcp_la-module-protocol-stub.lo: modules/module-protocol-stub.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_cli_protocol_tcp_la_CFLAGS) $(CFLAGS) -MT modules/module_cli_protocol_tcp_la-module-protocol-stub.lo -MD -MP -MF modules/$(DEPDIR)/module_cli_protocol_tcp_la-module-protocol-stub.Tpo -c -o modules/module_cli_protocol_tcp_la-module-protocol-stub.lo `test -f 'modules/module-protocol-stub.c' || echo '$(srcdir)/'`modules/module-protocol-stub.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_cli_protocol_tcp_la-module-protocol-stub.Tpo modules/$(DEPDIR)/module_cli_protocol_tcp_la-module-protocol-stub.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-protocol-stub.c' object='modules/module_cli_protocol_tcp_la-module-protocol-stub.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_cli_protocol_tcp_la_CFLAGS) $(CFLAGS) -c -o modules/module_cli_protocol_tcp_la-module-protocol-stub.lo `test -f 'modules/module-protocol-stub.c' || echo '$(srcdir)/'`modules/module-protocol-stub.c + +modules/module_cli_protocol_unix_la-module-protocol-stub.lo: modules/module-protocol-stub.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_cli_protocol_unix_la_CFLAGS) $(CFLAGS) -MT modules/module_cli_protocol_unix_la-module-protocol-stub.lo -MD -MP -MF modules/$(DEPDIR)/module_cli_protocol_unix_la-module-protocol-stub.Tpo -c -o modules/module_cli_protocol_unix_la-module-protocol-stub.lo `test -f 'modules/module-protocol-stub.c' || echo '$(srcdir)/'`modules/module-protocol-stub.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_cli_protocol_unix_la-module-protocol-stub.Tpo modules/$(DEPDIR)/module_cli_protocol_unix_la-module-protocol-stub.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-protocol-stub.c' object='modules/module_cli_protocol_unix_la-module-protocol-stub.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_cli_protocol_unix_la_CFLAGS) $(CFLAGS) -c -o modules/module_cli_protocol_unix_la-module-protocol-stub.lo `test -f 'modules/module-protocol-stub.c' || echo '$(srcdir)/'`modules/module-protocol-stub.c + +modules/module_cli_la-module-cli.lo: modules/module-cli.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_cli_la_CFLAGS) $(CFLAGS) -MT modules/module_cli_la-module-cli.lo -MD -MP -MF modules/$(DEPDIR)/module_cli_la-module-cli.Tpo -c -o modules/module_cli_la-module-cli.lo `test -f 'modules/module-cli.c' || echo '$(srcdir)/'`modules/module-cli.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_cli_la-module-cli.Tpo modules/$(DEPDIR)/module_cli_la-module-cli.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-cli.c' object='modules/module_cli_la-module-cli.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_cli_la_CFLAGS) $(CFLAGS) -c -o modules/module_cli_la-module-cli.lo `test -f 'modules/module-cli.c' || echo '$(srcdir)/'`modules/module-cli.c + +modules/module_combine_sink_la-module-combine-sink.lo: modules/module-combine-sink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_combine_sink_la_CFLAGS) $(CFLAGS) -MT modules/module_combine_sink_la-module-combine-sink.lo -MD -MP -MF modules/$(DEPDIR)/module_combine_sink_la-module-combine-sink.Tpo -c -o modules/module_combine_sink_la-module-combine-sink.lo `test -f 'modules/module-combine-sink.c' || echo '$(srcdir)/'`modules/module-combine-sink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_combine_sink_la-module-combine-sink.Tpo modules/$(DEPDIR)/module_combine_sink_la-module-combine-sink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-combine-sink.c' object='modules/module_combine_sink_la-module-combine-sink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_combine_sink_la_CFLAGS) $(CFLAGS) -c -o modules/module_combine_sink_la-module-combine-sink.lo `test -f 'modules/module-combine-sink.c' || echo '$(srcdir)/'`modules/module-combine-sink.c + +modules/module_combine_la-module-combine.lo: modules/module-combine.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_combine_la_CFLAGS) $(CFLAGS) -MT modules/module_combine_la-module-combine.lo -MD -MP -MF modules/$(DEPDIR)/module_combine_la-module-combine.Tpo -c -o modules/module_combine_la-module-combine.lo `test -f 'modules/module-combine.c' || echo '$(srcdir)/'`modules/module-combine.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_combine_la-module-combine.Tpo modules/$(DEPDIR)/module_combine_la-module-combine.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-combine.c' object='modules/module_combine_la-module-combine.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_combine_la_CFLAGS) $(CFLAGS) -c -o modules/module_combine_la-module-combine.lo `test -f 'modules/module-combine.c' || echo '$(srcdir)/'`modules/module-combine.c + +modules/module_console_kit_la-module-console-kit.lo: modules/module-console-kit.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_console_kit_la_CFLAGS) $(CFLAGS) -MT modules/module_console_kit_la-module-console-kit.lo -MD -MP -MF modules/$(DEPDIR)/module_console_kit_la-module-console-kit.Tpo -c -o modules/module_console_kit_la-module-console-kit.lo `test -f 'modules/module-console-kit.c' || echo '$(srcdir)/'`modules/module-console-kit.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_console_kit_la-module-console-kit.Tpo modules/$(DEPDIR)/module_console_kit_la-module-console-kit.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-console-kit.c' object='modules/module_console_kit_la-module-console-kit.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_console_kit_la_CFLAGS) $(CFLAGS) -c -o modules/module_console_kit_la-module-console-kit.lo `test -f 'modules/module-console-kit.c' || echo '$(srcdir)/'`modules/module-console-kit.c + +modules/macosx/module_coreaudio_detect_la-module-coreaudio-detect.lo: modules/macosx/module-coreaudio-detect.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_coreaudio_detect_la_CFLAGS) $(CFLAGS) -MT modules/macosx/module_coreaudio_detect_la-module-coreaudio-detect.lo -MD -MP -MF modules/macosx/$(DEPDIR)/module_coreaudio_detect_la-module-coreaudio-detect.Tpo -c -o modules/macosx/module_coreaudio_detect_la-module-coreaudio-detect.lo `test -f 'modules/macosx/module-coreaudio-detect.c' || echo '$(srcdir)/'`modules/macosx/module-coreaudio-detect.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/macosx/$(DEPDIR)/module_coreaudio_detect_la-module-coreaudio-detect.Tpo modules/macosx/$(DEPDIR)/module_coreaudio_detect_la-module-coreaudio-detect.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/macosx/module-coreaudio-detect.c' object='modules/macosx/module_coreaudio_detect_la-module-coreaudio-detect.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_coreaudio_detect_la_CFLAGS) $(CFLAGS) -c -o modules/macosx/module_coreaudio_detect_la-module-coreaudio-detect.lo `test -f 'modules/macosx/module-coreaudio-detect.c' || echo '$(srcdir)/'`modules/macosx/module-coreaudio-detect.c + +modules/macosx/module_coreaudio_device_la-module-coreaudio-device.lo: modules/macosx/module-coreaudio-device.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_coreaudio_device_la_CFLAGS) $(CFLAGS) -MT modules/macosx/module_coreaudio_device_la-module-coreaudio-device.lo -MD -MP -MF modules/macosx/$(DEPDIR)/module_coreaudio_device_la-module-coreaudio-device.Tpo -c -o modules/macosx/module_coreaudio_device_la-module-coreaudio-device.lo `test -f 'modules/macosx/module-coreaudio-device.c' || echo '$(srcdir)/'`modules/macosx/module-coreaudio-device.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/macosx/$(DEPDIR)/module_coreaudio_device_la-module-coreaudio-device.Tpo modules/macosx/$(DEPDIR)/module_coreaudio_device_la-module-coreaudio-device.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/macosx/module-coreaudio-device.c' object='modules/macosx/module_coreaudio_device_la-module-coreaudio-device.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_coreaudio_device_la_CFLAGS) $(CFLAGS) -c -o modules/macosx/module_coreaudio_device_la-module-coreaudio-device.lo `test -f 'modules/macosx/module-coreaudio-device.c' || echo '$(srcdir)/'`modules/macosx/module-coreaudio-device.c + +modules/dbus/module_dbus_protocol_la-iface-card.lo: modules/dbus/iface-card.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_dbus_protocol_la_CFLAGS) $(CFLAGS) -MT modules/dbus/module_dbus_protocol_la-iface-card.lo -MD -MP -MF modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-card.Tpo -c -o modules/dbus/module_dbus_protocol_la-iface-card.lo `test -f 'modules/dbus/iface-card.c' || echo '$(srcdir)/'`modules/dbus/iface-card.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-card.Tpo modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-card.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/dbus/iface-card.c' object='modules/dbus/module_dbus_protocol_la-iface-card.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_dbus_protocol_la_CFLAGS) $(CFLAGS) -c -o modules/dbus/module_dbus_protocol_la-iface-card.lo `test -f 'modules/dbus/iface-card.c' || echo '$(srcdir)/'`modules/dbus/iface-card.c + +modules/dbus/module_dbus_protocol_la-iface-card-profile.lo: modules/dbus/iface-card-profile.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_dbus_protocol_la_CFLAGS) $(CFLAGS) -MT modules/dbus/module_dbus_protocol_la-iface-card-profile.lo -MD -MP -MF modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-card-profile.Tpo -c -o modules/dbus/module_dbus_protocol_la-iface-card-profile.lo `test -f 'modules/dbus/iface-card-profile.c' || echo '$(srcdir)/'`modules/dbus/iface-card-profile.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-card-profile.Tpo modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-card-profile.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/dbus/iface-card-profile.c' object='modules/dbus/module_dbus_protocol_la-iface-card-profile.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_dbus_protocol_la_CFLAGS) $(CFLAGS) -c -o modules/dbus/module_dbus_protocol_la-iface-card-profile.lo `test -f 'modules/dbus/iface-card-profile.c' || echo '$(srcdir)/'`modules/dbus/iface-card-profile.c + +modules/dbus/module_dbus_protocol_la-iface-client.lo: modules/dbus/iface-client.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_dbus_protocol_la_CFLAGS) $(CFLAGS) -MT modules/dbus/module_dbus_protocol_la-iface-client.lo -MD -MP -MF modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-client.Tpo -c -o modules/dbus/module_dbus_protocol_la-iface-client.lo `test -f 'modules/dbus/iface-client.c' || echo '$(srcdir)/'`modules/dbus/iface-client.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-client.Tpo modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-client.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/dbus/iface-client.c' object='modules/dbus/module_dbus_protocol_la-iface-client.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_dbus_protocol_la_CFLAGS) $(CFLAGS) -c -o modules/dbus/module_dbus_protocol_la-iface-client.lo `test -f 'modules/dbus/iface-client.c' || echo '$(srcdir)/'`modules/dbus/iface-client.c + +modules/dbus/module_dbus_protocol_la-iface-core.lo: modules/dbus/iface-core.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_dbus_protocol_la_CFLAGS) $(CFLAGS) -MT modules/dbus/module_dbus_protocol_la-iface-core.lo -MD -MP -MF modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-core.Tpo -c -o modules/dbus/module_dbus_protocol_la-iface-core.lo `test -f 'modules/dbus/iface-core.c' || echo '$(srcdir)/'`modules/dbus/iface-core.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-core.Tpo modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-core.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/dbus/iface-core.c' object='modules/dbus/module_dbus_protocol_la-iface-core.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_dbus_protocol_la_CFLAGS) $(CFLAGS) -c -o modules/dbus/module_dbus_protocol_la-iface-core.lo `test -f 'modules/dbus/iface-core.c' || echo '$(srcdir)/'`modules/dbus/iface-core.c + +modules/dbus/module_dbus_protocol_la-iface-device.lo: modules/dbus/iface-device.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_dbus_protocol_la_CFLAGS) $(CFLAGS) -MT modules/dbus/module_dbus_protocol_la-iface-device.lo -MD -MP -MF modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-device.Tpo -c -o modules/dbus/module_dbus_protocol_la-iface-device.lo `test -f 'modules/dbus/iface-device.c' || echo '$(srcdir)/'`modules/dbus/iface-device.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-device.Tpo modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-device.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/dbus/iface-device.c' object='modules/dbus/module_dbus_protocol_la-iface-device.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_dbus_protocol_la_CFLAGS) $(CFLAGS) -c -o modules/dbus/module_dbus_protocol_la-iface-device.lo `test -f 'modules/dbus/iface-device.c' || echo '$(srcdir)/'`modules/dbus/iface-device.c + +modules/dbus/module_dbus_protocol_la-iface-device-port.lo: modules/dbus/iface-device-port.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_dbus_protocol_la_CFLAGS) $(CFLAGS) -MT modules/dbus/module_dbus_protocol_la-iface-device-port.lo -MD -MP -MF modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-device-port.Tpo -c -o modules/dbus/module_dbus_protocol_la-iface-device-port.lo `test -f 'modules/dbus/iface-device-port.c' || echo '$(srcdir)/'`modules/dbus/iface-device-port.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-device-port.Tpo modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-device-port.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/dbus/iface-device-port.c' object='modules/dbus/module_dbus_protocol_la-iface-device-port.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_dbus_protocol_la_CFLAGS) $(CFLAGS) -c -o modules/dbus/module_dbus_protocol_la-iface-device-port.lo `test -f 'modules/dbus/iface-device-port.c' || echo '$(srcdir)/'`modules/dbus/iface-device-port.c + +modules/dbus/module_dbus_protocol_la-iface-memstats.lo: modules/dbus/iface-memstats.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_dbus_protocol_la_CFLAGS) $(CFLAGS) -MT modules/dbus/module_dbus_protocol_la-iface-memstats.lo -MD -MP -MF modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-memstats.Tpo -c -o modules/dbus/module_dbus_protocol_la-iface-memstats.lo `test -f 'modules/dbus/iface-memstats.c' || echo '$(srcdir)/'`modules/dbus/iface-memstats.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-memstats.Tpo modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-memstats.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/dbus/iface-memstats.c' object='modules/dbus/module_dbus_protocol_la-iface-memstats.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_dbus_protocol_la_CFLAGS) $(CFLAGS) -c -o modules/dbus/module_dbus_protocol_la-iface-memstats.lo `test -f 'modules/dbus/iface-memstats.c' || echo '$(srcdir)/'`modules/dbus/iface-memstats.c + +modules/dbus/module_dbus_protocol_la-iface-module.lo: modules/dbus/iface-module.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_dbus_protocol_la_CFLAGS) $(CFLAGS) -MT modules/dbus/module_dbus_protocol_la-iface-module.lo -MD -MP -MF modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-module.Tpo -c -o modules/dbus/module_dbus_protocol_la-iface-module.lo `test -f 'modules/dbus/iface-module.c' || echo '$(srcdir)/'`modules/dbus/iface-module.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-module.Tpo modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-module.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/dbus/iface-module.c' object='modules/dbus/module_dbus_protocol_la-iface-module.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_dbus_protocol_la_CFLAGS) $(CFLAGS) -c -o modules/dbus/module_dbus_protocol_la-iface-module.lo `test -f 'modules/dbus/iface-module.c' || echo '$(srcdir)/'`modules/dbus/iface-module.c + +modules/dbus/module_dbus_protocol_la-iface-sample.lo: modules/dbus/iface-sample.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_dbus_protocol_la_CFLAGS) $(CFLAGS) -MT modules/dbus/module_dbus_protocol_la-iface-sample.lo -MD -MP -MF modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-sample.Tpo -c -o modules/dbus/module_dbus_protocol_la-iface-sample.lo `test -f 'modules/dbus/iface-sample.c' || echo '$(srcdir)/'`modules/dbus/iface-sample.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-sample.Tpo modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-sample.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/dbus/iface-sample.c' object='modules/dbus/module_dbus_protocol_la-iface-sample.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_dbus_protocol_la_CFLAGS) $(CFLAGS) -c -o modules/dbus/module_dbus_protocol_la-iface-sample.lo `test -f 'modules/dbus/iface-sample.c' || echo '$(srcdir)/'`modules/dbus/iface-sample.c + +modules/dbus/module_dbus_protocol_la-iface-stream.lo: modules/dbus/iface-stream.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_dbus_protocol_la_CFLAGS) $(CFLAGS) -MT modules/dbus/module_dbus_protocol_la-iface-stream.lo -MD -MP -MF modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-stream.Tpo -c -o modules/dbus/module_dbus_protocol_la-iface-stream.lo `test -f 'modules/dbus/iface-stream.c' || echo '$(srcdir)/'`modules/dbus/iface-stream.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-stream.Tpo modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-stream.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/dbus/iface-stream.c' object='modules/dbus/module_dbus_protocol_la-iface-stream.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_dbus_protocol_la_CFLAGS) $(CFLAGS) -c -o modules/dbus/module_dbus_protocol_la-iface-stream.lo `test -f 'modules/dbus/iface-stream.c' || echo '$(srcdir)/'`modules/dbus/iface-stream.c + +modules/dbus/module_dbus_protocol_la-module-dbus-protocol.lo: modules/dbus/module-dbus-protocol.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_dbus_protocol_la_CFLAGS) $(CFLAGS) -MT modules/dbus/module_dbus_protocol_la-module-dbus-protocol.lo -MD -MP -MF modules/dbus/$(DEPDIR)/module_dbus_protocol_la-module-dbus-protocol.Tpo -c -o modules/dbus/module_dbus_protocol_la-module-dbus-protocol.lo `test -f 'modules/dbus/module-dbus-protocol.c' || echo '$(srcdir)/'`modules/dbus/module-dbus-protocol.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/dbus/$(DEPDIR)/module_dbus_protocol_la-module-dbus-protocol.Tpo modules/dbus/$(DEPDIR)/module_dbus_protocol_la-module-dbus-protocol.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/dbus/module-dbus-protocol.c' object='modules/dbus/module_dbus_protocol_la-module-dbus-protocol.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_dbus_protocol_la_CFLAGS) $(CFLAGS) -c -o modules/dbus/module_dbus_protocol_la-module-dbus-protocol.lo `test -f 'modules/dbus/module-dbus-protocol.c' || echo '$(srcdir)/'`modules/dbus/module-dbus-protocol.c + +modules/module_default_device_restore_la-module-default-device-restore.lo: modules/module-default-device-restore.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_default_device_restore_la_CFLAGS) $(CFLAGS) -MT modules/module_default_device_restore_la-module-default-device-restore.lo -MD -MP -MF modules/$(DEPDIR)/module_default_device_restore_la-module-default-device-restore.Tpo -c -o modules/module_default_device_restore_la-module-default-device-restore.lo `test -f 'modules/module-default-device-restore.c' || echo '$(srcdir)/'`modules/module-default-device-restore.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_default_device_restore_la-module-default-device-restore.Tpo modules/$(DEPDIR)/module_default_device_restore_la-module-default-device-restore.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-default-device-restore.c' object='modules/module_default_device_restore_la-module-default-device-restore.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_default_device_restore_la_CFLAGS) $(CFLAGS) -c -o modules/module_default_device_restore_la-module-default-device-restore.lo `test -f 'modules/module-default-device-restore.c' || echo '$(srcdir)/'`modules/module-default-device-restore.c + +modules/module_detect_la-module-detect.lo: modules/module-detect.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_detect_la_CFLAGS) $(CFLAGS) -MT modules/module_detect_la-module-detect.lo -MD -MP -MF modules/$(DEPDIR)/module_detect_la-module-detect.Tpo -c -o modules/module_detect_la-module-detect.lo `test -f 'modules/module-detect.c' || echo '$(srcdir)/'`modules/module-detect.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_detect_la-module-detect.Tpo modules/$(DEPDIR)/module_detect_la-module-detect.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-detect.c' object='modules/module_detect_la-module-detect.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_detect_la_CFLAGS) $(CFLAGS) -c -o modules/module_detect_la-module-detect.lo `test -f 'modules/module-detect.c' || echo '$(srcdir)/'`modules/module-detect.c + +modules/module_device_manager_la-module-device-manager.lo: modules/module-device-manager.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_device_manager_la_CFLAGS) $(CFLAGS) -MT modules/module_device_manager_la-module-device-manager.lo -MD -MP -MF modules/$(DEPDIR)/module_device_manager_la-module-device-manager.Tpo -c -o modules/module_device_manager_la-module-device-manager.lo `test -f 'modules/module-device-manager.c' || echo '$(srcdir)/'`modules/module-device-manager.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_device_manager_la-module-device-manager.Tpo modules/$(DEPDIR)/module_device_manager_la-module-device-manager.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-device-manager.c' object='modules/module_device_manager_la-module-device-manager.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_device_manager_la_CFLAGS) $(CFLAGS) -c -o modules/module_device_manager_la-module-device-manager.lo `test -f 'modules/module-device-manager.c' || echo '$(srcdir)/'`modules/module-device-manager.c + +modules/module_device_restore_la-module-device-restore.lo: modules/module-device-restore.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_device_restore_la_CFLAGS) $(CFLAGS) -MT modules/module_device_restore_la-module-device-restore.lo -MD -MP -MF modules/$(DEPDIR)/module_device_restore_la-module-device-restore.Tpo -c -o modules/module_device_restore_la-module-device-restore.lo `test -f 'modules/module-device-restore.c' || echo '$(srcdir)/'`modules/module-device-restore.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_device_restore_la-module-device-restore.Tpo modules/$(DEPDIR)/module_device_restore_la-module-device-restore.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-device-restore.c' object='modules/module_device_restore_la-module-device-restore.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_device_restore_la_CFLAGS) $(CFLAGS) -c -o modules/module_device_restore_la-module-device-restore.lo `test -f 'modules/module-device-restore.c' || echo '$(srcdir)/'`modules/module-device-restore.c + +modules/echo-cancel/module_echo_cancel_la-module-echo-cancel.lo: modules/echo-cancel/module-echo-cancel.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_echo_cancel_la_CFLAGS) $(CFLAGS) -MT modules/echo-cancel/module_echo_cancel_la-module-echo-cancel.lo -MD -MP -MF modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-module-echo-cancel.Tpo -c -o modules/echo-cancel/module_echo_cancel_la-module-echo-cancel.lo `test -f 'modules/echo-cancel/module-echo-cancel.c' || echo '$(srcdir)/'`modules/echo-cancel/module-echo-cancel.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-module-echo-cancel.Tpo modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-module-echo-cancel.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/echo-cancel/module-echo-cancel.c' object='modules/echo-cancel/module_echo_cancel_la-module-echo-cancel.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_echo_cancel_la_CFLAGS) $(CFLAGS) -c -o modules/echo-cancel/module_echo_cancel_la-module-echo-cancel.lo `test -f 'modules/echo-cancel/module-echo-cancel.c' || echo '$(srcdir)/'`modules/echo-cancel/module-echo-cancel.c + +modules/echo-cancel/module_echo_cancel_la-null.lo: modules/echo-cancel/null.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_echo_cancel_la_CFLAGS) $(CFLAGS) -MT modules/echo-cancel/module_echo_cancel_la-null.lo -MD -MP -MF modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-null.Tpo -c -o modules/echo-cancel/module_echo_cancel_la-null.lo `test -f 'modules/echo-cancel/null.c' || echo '$(srcdir)/'`modules/echo-cancel/null.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-null.Tpo modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-null.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/echo-cancel/null.c' object='modules/echo-cancel/module_echo_cancel_la-null.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_echo_cancel_la_CFLAGS) $(CFLAGS) -c -o modules/echo-cancel/module_echo_cancel_la-null.lo `test -f 'modules/echo-cancel/null.c' || echo '$(srcdir)/'`modules/echo-cancel/null.c + +modules/echo-cancel/module_echo_cancel_la-adrian-aec.lo: modules/echo-cancel/adrian-aec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_echo_cancel_la_CFLAGS) $(CFLAGS) -MT modules/echo-cancel/module_echo_cancel_la-adrian-aec.lo -MD -MP -MF modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-adrian-aec.Tpo -c -o modules/echo-cancel/module_echo_cancel_la-adrian-aec.lo `test -f 'modules/echo-cancel/adrian-aec.c' || echo '$(srcdir)/'`modules/echo-cancel/adrian-aec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-adrian-aec.Tpo modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-adrian-aec.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/echo-cancel/adrian-aec.c' object='modules/echo-cancel/module_echo_cancel_la-adrian-aec.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_echo_cancel_la_CFLAGS) $(CFLAGS) -c -o modules/echo-cancel/module_echo_cancel_la-adrian-aec.lo `test -f 'modules/echo-cancel/adrian-aec.c' || echo '$(srcdir)/'`modules/echo-cancel/adrian-aec.c + +modules/echo-cancel/module_echo_cancel_la-adrian.lo: modules/echo-cancel/adrian.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_echo_cancel_la_CFLAGS) $(CFLAGS) -MT modules/echo-cancel/module_echo_cancel_la-adrian.lo -MD -MP -MF modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-adrian.Tpo -c -o modules/echo-cancel/module_echo_cancel_la-adrian.lo `test -f 'modules/echo-cancel/adrian.c' || echo '$(srcdir)/'`modules/echo-cancel/adrian.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-adrian.Tpo modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-adrian.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/echo-cancel/adrian.c' object='modules/echo-cancel/module_echo_cancel_la-adrian.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_echo_cancel_la_CFLAGS) $(CFLAGS) -c -o modules/echo-cancel/module_echo_cancel_la-adrian.lo `test -f 'modules/echo-cancel/adrian.c' || echo '$(srcdir)/'`modules/echo-cancel/adrian.c + +modules/echo-cancel/module_echo_cancel_la-speex.lo: modules/echo-cancel/speex.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_echo_cancel_la_CFLAGS) $(CFLAGS) -MT modules/echo-cancel/module_echo_cancel_la-speex.lo -MD -MP -MF modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-speex.Tpo -c -o modules/echo-cancel/module_echo_cancel_la-speex.lo `test -f 'modules/echo-cancel/speex.c' || echo '$(srcdir)/'`modules/echo-cancel/speex.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-speex.Tpo modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-speex.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/echo-cancel/speex.c' object='modules/echo-cancel/module_echo_cancel_la-speex.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_echo_cancel_la_CFLAGS) $(CFLAGS) -c -o modules/echo-cancel/module_echo_cancel_la-speex.lo `test -f 'modules/echo-cancel/speex.c' || echo '$(srcdir)/'`modules/echo-cancel/speex.c + +modules/echo-cancel/module_echo_cancel_la-adrian-aec-orc-gen.lo: modules/echo-cancel/adrian-aec-orc-gen.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_echo_cancel_la_CFLAGS) $(CFLAGS) -MT modules/echo-cancel/module_echo_cancel_la-adrian-aec-orc-gen.lo -MD -MP -MF modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-adrian-aec-orc-gen.Tpo -c -o modules/echo-cancel/module_echo_cancel_la-adrian-aec-orc-gen.lo `test -f 'modules/echo-cancel/adrian-aec-orc-gen.c' || echo '$(srcdir)/'`modules/echo-cancel/adrian-aec-orc-gen.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-adrian-aec-orc-gen.Tpo modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-adrian-aec-orc-gen.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/echo-cancel/adrian-aec-orc-gen.c' object='modules/echo-cancel/module_echo_cancel_la-adrian-aec-orc-gen.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_echo_cancel_la_CFLAGS) $(CFLAGS) -c -o modules/echo-cancel/module_echo_cancel_la-adrian-aec-orc-gen.lo `test -f 'modules/echo-cancel/adrian-aec-orc-gen.c' || echo '$(srcdir)/'`modules/echo-cancel/adrian-aec-orc-gen.c + +modules/module_equalizer_sink_la-module-equalizer-sink.lo: modules/module-equalizer-sink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_equalizer_sink_la_CFLAGS) $(CFLAGS) -MT modules/module_equalizer_sink_la-module-equalizer-sink.lo -MD -MP -MF modules/$(DEPDIR)/module_equalizer_sink_la-module-equalizer-sink.Tpo -c -o modules/module_equalizer_sink_la-module-equalizer-sink.lo `test -f 'modules/module-equalizer-sink.c' || echo '$(srcdir)/'`modules/module-equalizer-sink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_equalizer_sink_la-module-equalizer-sink.Tpo modules/$(DEPDIR)/module_equalizer_sink_la-module-equalizer-sink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-equalizer-sink.c' object='modules/module_equalizer_sink_la-module-equalizer-sink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_equalizer_sink_la_CFLAGS) $(CFLAGS) -c -o modules/module_equalizer_sink_la-module-equalizer-sink.lo `test -f 'modules/module-equalizer-sink.c' || echo '$(srcdir)/'`modules/module-equalizer-sink.c + +modules/module_esound_compat_spawnfd_la-module-esound-compat-spawnfd.lo: modules/module-esound-compat-spawnfd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_esound_compat_spawnfd_la_CFLAGS) $(CFLAGS) -MT modules/module_esound_compat_spawnfd_la-module-esound-compat-spawnfd.lo -MD -MP -MF modules/$(DEPDIR)/module_esound_compat_spawnfd_la-module-esound-compat-spawnfd.Tpo -c -o modules/module_esound_compat_spawnfd_la-module-esound-compat-spawnfd.lo `test -f 'modules/module-esound-compat-spawnfd.c' || echo '$(srcdir)/'`modules/module-esound-compat-spawnfd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_esound_compat_spawnfd_la-module-esound-compat-spawnfd.Tpo modules/$(DEPDIR)/module_esound_compat_spawnfd_la-module-esound-compat-spawnfd.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-esound-compat-spawnfd.c' object='modules/module_esound_compat_spawnfd_la-module-esound-compat-spawnfd.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_esound_compat_spawnfd_la_CFLAGS) $(CFLAGS) -c -o modules/module_esound_compat_spawnfd_la-module-esound-compat-spawnfd.lo `test -f 'modules/module-esound-compat-spawnfd.c' || echo '$(srcdir)/'`modules/module-esound-compat-spawnfd.c + +modules/module_esound_compat_spawnpid_la-module-esound-compat-spawnpid.lo: modules/module-esound-compat-spawnpid.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_esound_compat_spawnpid_la_CFLAGS) $(CFLAGS) -MT modules/module_esound_compat_spawnpid_la-module-esound-compat-spawnpid.lo -MD -MP -MF modules/$(DEPDIR)/module_esound_compat_spawnpid_la-module-esound-compat-spawnpid.Tpo -c -o modules/module_esound_compat_spawnpid_la-module-esound-compat-spawnpid.lo `test -f 'modules/module-esound-compat-spawnpid.c' || echo '$(srcdir)/'`modules/module-esound-compat-spawnpid.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_esound_compat_spawnpid_la-module-esound-compat-spawnpid.Tpo modules/$(DEPDIR)/module_esound_compat_spawnpid_la-module-esound-compat-spawnpid.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-esound-compat-spawnpid.c' object='modules/module_esound_compat_spawnpid_la-module-esound-compat-spawnpid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_esound_compat_spawnpid_la_CFLAGS) $(CFLAGS) -c -o modules/module_esound_compat_spawnpid_la-module-esound-compat-spawnpid.lo `test -f 'modules/module-esound-compat-spawnpid.c' || echo '$(srcdir)/'`modules/module-esound-compat-spawnpid.c + +modules/module_esound_protocol_tcp_la-module-protocol-stub.lo: modules/module-protocol-stub.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_esound_protocol_tcp_la_CFLAGS) $(CFLAGS) -MT modules/module_esound_protocol_tcp_la-module-protocol-stub.lo -MD -MP -MF modules/$(DEPDIR)/module_esound_protocol_tcp_la-module-protocol-stub.Tpo -c -o modules/module_esound_protocol_tcp_la-module-protocol-stub.lo `test -f 'modules/module-protocol-stub.c' || echo '$(srcdir)/'`modules/module-protocol-stub.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_esound_protocol_tcp_la-module-protocol-stub.Tpo modules/$(DEPDIR)/module_esound_protocol_tcp_la-module-protocol-stub.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-protocol-stub.c' object='modules/module_esound_protocol_tcp_la-module-protocol-stub.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_esound_protocol_tcp_la_CFLAGS) $(CFLAGS) -c -o modules/module_esound_protocol_tcp_la-module-protocol-stub.lo `test -f 'modules/module-protocol-stub.c' || echo '$(srcdir)/'`modules/module-protocol-stub.c + +modules/module_esound_protocol_unix_la-module-protocol-stub.lo: modules/module-protocol-stub.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_esound_protocol_unix_la_CFLAGS) $(CFLAGS) -MT modules/module_esound_protocol_unix_la-module-protocol-stub.lo -MD -MP -MF modules/$(DEPDIR)/module_esound_protocol_unix_la-module-protocol-stub.Tpo -c -o modules/module_esound_protocol_unix_la-module-protocol-stub.lo `test -f 'modules/module-protocol-stub.c' || echo '$(srcdir)/'`modules/module-protocol-stub.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_esound_protocol_unix_la-module-protocol-stub.Tpo modules/$(DEPDIR)/module_esound_protocol_unix_la-module-protocol-stub.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-protocol-stub.c' object='modules/module_esound_protocol_unix_la-module-protocol-stub.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_esound_protocol_unix_la_CFLAGS) $(CFLAGS) -c -o modules/module_esound_protocol_unix_la-module-protocol-stub.lo `test -f 'modules/module-protocol-stub.c' || echo '$(srcdir)/'`modules/module-protocol-stub.c + +modules/module_esound_sink_la-module-esound-sink.lo: modules/module-esound-sink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_esound_sink_la_CFLAGS) $(CFLAGS) -MT modules/module_esound_sink_la-module-esound-sink.lo -MD -MP -MF modules/$(DEPDIR)/module_esound_sink_la-module-esound-sink.Tpo -c -o modules/module_esound_sink_la-module-esound-sink.lo `test -f 'modules/module-esound-sink.c' || echo '$(srcdir)/'`modules/module-esound-sink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_esound_sink_la-module-esound-sink.Tpo modules/$(DEPDIR)/module_esound_sink_la-module-esound-sink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-esound-sink.c' object='modules/module_esound_sink_la-module-esound-sink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_esound_sink_la_CFLAGS) $(CFLAGS) -c -o modules/module_esound_sink_la-module-esound-sink.lo `test -f 'modules/module-esound-sink.c' || echo '$(srcdir)/'`modules/module-esound-sink.c + +modules/module_filter_apply_la-module-filter-apply.lo: modules/module-filter-apply.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_filter_apply_la_CFLAGS) $(CFLAGS) -MT modules/module_filter_apply_la-module-filter-apply.lo -MD -MP -MF modules/$(DEPDIR)/module_filter_apply_la-module-filter-apply.Tpo -c -o modules/module_filter_apply_la-module-filter-apply.lo `test -f 'modules/module-filter-apply.c' || echo '$(srcdir)/'`modules/module-filter-apply.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_filter_apply_la-module-filter-apply.Tpo modules/$(DEPDIR)/module_filter_apply_la-module-filter-apply.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-filter-apply.c' object='modules/module_filter_apply_la-module-filter-apply.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_filter_apply_la_CFLAGS) $(CFLAGS) -c -o modules/module_filter_apply_la-module-filter-apply.lo `test -f 'modules/module-filter-apply.c' || echo '$(srcdir)/'`modules/module-filter-apply.c + +modules/module_filter_heuristics_la-module-filter-heuristics.lo: modules/module-filter-heuristics.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_filter_heuristics_la_CFLAGS) $(CFLAGS) -MT modules/module_filter_heuristics_la-module-filter-heuristics.lo -MD -MP -MF modules/$(DEPDIR)/module_filter_heuristics_la-module-filter-heuristics.Tpo -c -o modules/module_filter_heuristics_la-module-filter-heuristics.lo `test -f 'modules/module-filter-heuristics.c' || echo '$(srcdir)/'`modules/module-filter-heuristics.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_filter_heuristics_la-module-filter-heuristics.Tpo modules/$(DEPDIR)/module_filter_heuristics_la-module-filter-heuristics.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-filter-heuristics.c' object='modules/module_filter_heuristics_la-module-filter-heuristics.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_filter_heuristics_la_CFLAGS) $(CFLAGS) -c -o modules/module_filter_heuristics_la-module-filter-heuristics.lo `test -f 'modules/module-filter-heuristics.c' || echo '$(srcdir)/'`modules/module-filter-heuristics.c + +modules/module_gconf_la-stdin-util.lo: modules/stdin-util.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_gconf_la_CFLAGS) $(CFLAGS) -MT modules/module_gconf_la-stdin-util.lo -MD -MP -MF modules/$(DEPDIR)/module_gconf_la-stdin-util.Tpo -c -o modules/module_gconf_la-stdin-util.lo `test -f 'modules/stdin-util.c' || echo '$(srcdir)/'`modules/stdin-util.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_gconf_la-stdin-util.Tpo modules/$(DEPDIR)/module_gconf_la-stdin-util.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/stdin-util.c' object='modules/module_gconf_la-stdin-util.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_gconf_la_CFLAGS) $(CFLAGS) -c -o modules/module_gconf_la-stdin-util.lo `test -f 'modules/stdin-util.c' || echo '$(srcdir)/'`modules/stdin-util.c + +modules/gconf/module_gconf_la-module-gconf.lo: modules/gconf/module-gconf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_gconf_la_CFLAGS) $(CFLAGS) -MT modules/gconf/module_gconf_la-module-gconf.lo -MD -MP -MF modules/gconf/$(DEPDIR)/module_gconf_la-module-gconf.Tpo -c -o modules/gconf/module_gconf_la-module-gconf.lo `test -f 'modules/gconf/module-gconf.c' || echo '$(srcdir)/'`modules/gconf/module-gconf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/gconf/$(DEPDIR)/module_gconf_la-module-gconf.Tpo modules/gconf/$(DEPDIR)/module_gconf_la-module-gconf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/gconf/module-gconf.c' object='modules/gconf/module_gconf_la-module-gconf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_gconf_la_CFLAGS) $(CFLAGS) -c -o modules/gconf/module_gconf_la-module-gconf.lo `test -f 'modules/gconf/module-gconf.c' || echo '$(srcdir)/'`modules/gconf/module-gconf.c + +modules/module_gsettings_la-stdin-util.lo: modules/stdin-util.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_gsettings_la_CFLAGS) $(CFLAGS) -MT modules/module_gsettings_la-stdin-util.lo -MD -MP -MF modules/$(DEPDIR)/module_gsettings_la-stdin-util.Tpo -c -o modules/module_gsettings_la-stdin-util.lo `test -f 'modules/stdin-util.c' || echo '$(srcdir)/'`modules/stdin-util.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_gsettings_la-stdin-util.Tpo modules/$(DEPDIR)/module_gsettings_la-stdin-util.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/stdin-util.c' object='modules/module_gsettings_la-stdin-util.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_gsettings_la_CFLAGS) $(CFLAGS) -c -o modules/module_gsettings_la-stdin-util.lo `test -f 'modules/stdin-util.c' || echo '$(srcdir)/'`modules/stdin-util.c + +modules/gsettings/module_gsettings_la-module-gsettings.lo: modules/gsettings/module-gsettings.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_gsettings_la_CFLAGS) $(CFLAGS) -MT modules/gsettings/module_gsettings_la-module-gsettings.lo -MD -MP -MF modules/gsettings/$(DEPDIR)/module_gsettings_la-module-gsettings.Tpo -c -o modules/gsettings/module_gsettings_la-module-gsettings.lo `test -f 'modules/gsettings/module-gsettings.c' || echo '$(srcdir)/'`modules/gsettings/module-gsettings.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/gsettings/$(DEPDIR)/module_gsettings_la-module-gsettings.Tpo modules/gsettings/$(DEPDIR)/module_gsettings_la-module-gsettings.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/gsettings/module-gsettings.c' object='modules/gsettings/module_gsettings_la-module-gsettings.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_gsettings_la_CFLAGS) $(CFLAGS) -c -o modules/gsettings/module_gsettings_la-module-gsettings.lo `test -f 'modules/gsettings/module-gsettings.c' || echo '$(srcdir)/'`modules/gsettings/module-gsettings.c + +modules/module_hal_detect_la-module-hal-detect-compat.lo: modules/module-hal-detect-compat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_hal_detect_la_CFLAGS) $(CFLAGS) -MT modules/module_hal_detect_la-module-hal-detect-compat.lo -MD -MP -MF modules/$(DEPDIR)/module_hal_detect_la-module-hal-detect-compat.Tpo -c -o modules/module_hal_detect_la-module-hal-detect-compat.lo `test -f 'modules/module-hal-detect-compat.c' || echo '$(srcdir)/'`modules/module-hal-detect-compat.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_hal_detect_la-module-hal-detect-compat.Tpo modules/$(DEPDIR)/module_hal_detect_la-module-hal-detect-compat.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-hal-detect-compat.c' object='modules/module_hal_detect_la-module-hal-detect-compat.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_hal_detect_la_CFLAGS) $(CFLAGS) -c -o modules/module_hal_detect_la-module-hal-detect-compat.lo `test -f 'modules/module-hal-detect-compat.c' || echo '$(srcdir)/'`modules/module-hal-detect-compat.c + +modules/module_http_protocol_tcp_la-module-protocol-stub.lo: modules/module-protocol-stub.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_http_protocol_tcp_la_CFLAGS) $(CFLAGS) -MT modules/module_http_protocol_tcp_la-module-protocol-stub.lo -MD -MP -MF modules/$(DEPDIR)/module_http_protocol_tcp_la-module-protocol-stub.Tpo -c -o modules/module_http_protocol_tcp_la-module-protocol-stub.lo `test -f 'modules/module-protocol-stub.c' || echo '$(srcdir)/'`modules/module-protocol-stub.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_http_protocol_tcp_la-module-protocol-stub.Tpo modules/$(DEPDIR)/module_http_protocol_tcp_la-module-protocol-stub.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-protocol-stub.c' object='modules/module_http_protocol_tcp_la-module-protocol-stub.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_http_protocol_tcp_la_CFLAGS) $(CFLAGS) -c -o modules/module_http_protocol_tcp_la-module-protocol-stub.lo `test -f 'modules/module-protocol-stub.c' || echo '$(srcdir)/'`modules/module-protocol-stub.c + +modules/module_http_protocol_unix_la-module-protocol-stub.lo: modules/module-protocol-stub.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_http_protocol_unix_la_CFLAGS) $(CFLAGS) -MT modules/module_http_protocol_unix_la-module-protocol-stub.lo -MD -MP -MF modules/$(DEPDIR)/module_http_protocol_unix_la-module-protocol-stub.Tpo -c -o modules/module_http_protocol_unix_la-module-protocol-stub.lo `test -f 'modules/module-protocol-stub.c' || echo '$(srcdir)/'`modules/module-protocol-stub.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_http_protocol_unix_la-module-protocol-stub.Tpo modules/$(DEPDIR)/module_http_protocol_unix_la-module-protocol-stub.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-protocol-stub.c' object='modules/module_http_protocol_unix_la-module-protocol-stub.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_http_protocol_unix_la_CFLAGS) $(CFLAGS) -c -o modules/module_http_protocol_unix_la-module-protocol-stub.lo `test -f 'modules/module-protocol-stub.c' || echo '$(srcdir)/'`modules/module-protocol-stub.c + +modules/module_intended_roles_la-module-intended-roles.lo: modules/module-intended-roles.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_intended_roles_la_CFLAGS) $(CFLAGS) -MT modules/module_intended_roles_la-module-intended-roles.lo -MD -MP -MF modules/$(DEPDIR)/module_intended_roles_la-module-intended-roles.Tpo -c -o modules/module_intended_roles_la-module-intended-roles.lo `test -f 'modules/module-intended-roles.c' || echo '$(srcdir)/'`modules/module-intended-roles.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_intended_roles_la-module-intended-roles.Tpo modules/$(DEPDIR)/module_intended_roles_la-module-intended-roles.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-intended-roles.c' object='modules/module_intended_roles_la-module-intended-roles.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_intended_roles_la_CFLAGS) $(CFLAGS) -c -o modules/module_intended_roles_la-module-intended-roles.lo `test -f 'modules/module-intended-roles.c' || echo '$(srcdir)/'`modules/module-intended-roles.c + +modules/jack/module_jack_sink_la-module-jack-sink.lo: modules/jack/module-jack-sink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_jack_sink_la_CFLAGS) $(CFLAGS) -MT modules/jack/module_jack_sink_la-module-jack-sink.lo -MD -MP -MF modules/jack/$(DEPDIR)/module_jack_sink_la-module-jack-sink.Tpo -c -o modules/jack/module_jack_sink_la-module-jack-sink.lo `test -f 'modules/jack/module-jack-sink.c' || echo '$(srcdir)/'`modules/jack/module-jack-sink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/jack/$(DEPDIR)/module_jack_sink_la-module-jack-sink.Tpo modules/jack/$(DEPDIR)/module_jack_sink_la-module-jack-sink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/jack/module-jack-sink.c' object='modules/jack/module_jack_sink_la-module-jack-sink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_jack_sink_la_CFLAGS) $(CFLAGS) -c -o modules/jack/module_jack_sink_la-module-jack-sink.lo `test -f 'modules/jack/module-jack-sink.c' || echo '$(srcdir)/'`modules/jack/module-jack-sink.c + +modules/jack/module_jack_source_la-module-jack-source.lo: modules/jack/module-jack-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_jack_source_la_CFLAGS) $(CFLAGS) -MT modules/jack/module_jack_source_la-module-jack-source.lo -MD -MP -MF modules/jack/$(DEPDIR)/module_jack_source_la-module-jack-source.Tpo -c -o modules/jack/module_jack_source_la-module-jack-source.lo `test -f 'modules/jack/module-jack-source.c' || echo '$(srcdir)/'`modules/jack/module-jack-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/jack/$(DEPDIR)/module_jack_source_la-module-jack-source.Tpo modules/jack/$(DEPDIR)/module_jack_source_la-module-jack-source.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/jack/module-jack-source.c' object='modules/jack/module_jack_source_la-module-jack-source.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_jack_source_la_CFLAGS) $(CFLAGS) -c -o modules/jack/module_jack_source_la-module-jack-source.lo `test -f 'modules/jack/module-jack-source.c' || echo '$(srcdir)/'`modules/jack/module-jack-source.c + +modules/jack/module_jackdbus_detect_la-module-jackdbus-detect.lo: modules/jack/module-jackdbus-detect.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_jackdbus_detect_la_CFLAGS) $(CFLAGS) -MT modules/jack/module_jackdbus_detect_la-module-jackdbus-detect.lo -MD -MP -MF modules/jack/$(DEPDIR)/module_jackdbus_detect_la-module-jackdbus-detect.Tpo -c -o modules/jack/module_jackdbus_detect_la-module-jackdbus-detect.lo `test -f 'modules/jack/module-jackdbus-detect.c' || echo '$(srcdir)/'`modules/jack/module-jackdbus-detect.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/jack/$(DEPDIR)/module_jackdbus_detect_la-module-jackdbus-detect.Tpo modules/jack/$(DEPDIR)/module_jackdbus_detect_la-module-jackdbus-detect.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/jack/module-jackdbus-detect.c' object='modules/jack/module_jackdbus_detect_la-module-jackdbus-detect.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_jackdbus_detect_la_CFLAGS) $(CFLAGS) -c -o modules/jack/module_jackdbus_detect_la-module-jackdbus-detect.lo `test -f 'modules/jack/module-jackdbus-detect.c' || echo '$(srcdir)/'`modules/jack/module-jackdbus-detect.c + +modules/module_ladspa_sink_la-module-ladspa-sink.lo: modules/module-ladspa-sink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_ladspa_sink_la_CFLAGS) $(CFLAGS) -MT modules/module_ladspa_sink_la-module-ladspa-sink.lo -MD -MP -MF modules/$(DEPDIR)/module_ladspa_sink_la-module-ladspa-sink.Tpo -c -o modules/module_ladspa_sink_la-module-ladspa-sink.lo `test -f 'modules/module-ladspa-sink.c' || echo '$(srcdir)/'`modules/module-ladspa-sink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_ladspa_sink_la-module-ladspa-sink.Tpo modules/$(DEPDIR)/module_ladspa_sink_la-module-ladspa-sink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-ladspa-sink.c' object='modules/module_ladspa_sink_la-module-ladspa-sink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_ladspa_sink_la_CFLAGS) $(CFLAGS) -c -o modules/module_ladspa_sink_la-module-ladspa-sink.lo `test -f 'modules/module-ladspa-sink.c' || echo '$(srcdir)/'`modules/module-ladspa-sink.c + +modules/module_lirc_la-module-lirc.lo: modules/module-lirc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_lirc_la_CFLAGS) $(CFLAGS) -MT modules/module_lirc_la-module-lirc.lo -MD -MP -MF modules/$(DEPDIR)/module_lirc_la-module-lirc.Tpo -c -o modules/module_lirc_la-module-lirc.lo `test -f 'modules/module-lirc.c' || echo '$(srcdir)/'`modules/module-lirc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_lirc_la-module-lirc.Tpo modules/$(DEPDIR)/module_lirc_la-module-lirc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-lirc.c' object='modules/module_lirc_la-module-lirc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_lirc_la_CFLAGS) $(CFLAGS) -c -o modules/module_lirc_la-module-lirc.lo `test -f 'modules/module-lirc.c' || echo '$(srcdir)/'`modules/module-lirc.c + +modules/module_loopback_la-module-loopback.lo: modules/module-loopback.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_loopback_la_CFLAGS) $(CFLAGS) -MT modules/module_loopback_la-module-loopback.lo -MD -MP -MF modules/$(DEPDIR)/module_loopback_la-module-loopback.Tpo -c -o modules/module_loopback_la-module-loopback.lo `test -f 'modules/module-loopback.c' || echo '$(srcdir)/'`modules/module-loopback.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_loopback_la-module-loopback.Tpo modules/$(DEPDIR)/module_loopback_la-module-loopback.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-loopback.c' object='modules/module_loopback_la-module-loopback.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_loopback_la_CFLAGS) $(CFLAGS) -c -o modules/module_loopback_la-module-loopback.lo `test -f 'modules/module-loopback.c' || echo '$(srcdir)/'`modules/module-loopback.c + +modules/module_match_la-module-match.lo: modules/module-match.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_match_la_CFLAGS) $(CFLAGS) -MT modules/module_match_la-module-match.lo -MD -MP -MF modules/$(DEPDIR)/module_match_la-module-match.Tpo -c -o modules/module_match_la-module-match.lo `test -f 'modules/module-match.c' || echo '$(srcdir)/'`modules/module-match.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_match_la-module-match.Tpo modules/$(DEPDIR)/module_match_la-module-match.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-match.c' object='modules/module_match_la-module-match.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_match_la_CFLAGS) $(CFLAGS) -c -o modules/module_match_la-module-match.lo `test -f 'modules/module-match.c' || echo '$(srcdir)/'`modules/module-match.c + +modules/module_mmkbd_evdev_la-module-mmkbd-evdev.lo: modules/module-mmkbd-evdev.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_mmkbd_evdev_la_CFLAGS) $(CFLAGS) -MT modules/module_mmkbd_evdev_la-module-mmkbd-evdev.lo -MD -MP -MF modules/$(DEPDIR)/module_mmkbd_evdev_la-module-mmkbd-evdev.Tpo -c -o modules/module_mmkbd_evdev_la-module-mmkbd-evdev.lo `test -f 'modules/module-mmkbd-evdev.c' || echo '$(srcdir)/'`modules/module-mmkbd-evdev.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_mmkbd_evdev_la-module-mmkbd-evdev.Tpo modules/$(DEPDIR)/module_mmkbd_evdev_la-module-mmkbd-evdev.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-mmkbd-evdev.c' object='modules/module_mmkbd_evdev_la-module-mmkbd-evdev.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_mmkbd_evdev_la_CFLAGS) $(CFLAGS) -c -o modules/module_mmkbd_evdev_la-module-mmkbd-evdev.lo `test -f 'modules/module-mmkbd-evdev.c' || echo '$(srcdir)/'`modules/module-mmkbd-evdev.c + +modules/module_native_protocol_fd_la-module-native-protocol-fd.lo: modules/module-native-protocol-fd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_native_protocol_fd_la_CFLAGS) $(CFLAGS) -MT modules/module_native_protocol_fd_la-module-native-protocol-fd.lo -MD -MP -MF modules/$(DEPDIR)/module_native_protocol_fd_la-module-native-protocol-fd.Tpo -c -o modules/module_native_protocol_fd_la-module-native-protocol-fd.lo `test -f 'modules/module-native-protocol-fd.c' || echo '$(srcdir)/'`modules/module-native-protocol-fd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_native_protocol_fd_la-module-native-protocol-fd.Tpo modules/$(DEPDIR)/module_native_protocol_fd_la-module-native-protocol-fd.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-native-protocol-fd.c' object='modules/module_native_protocol_fd_la-module-native-protocol-fd.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_native_protocol_fd_la_CFLAGS) $(CFLAGS) -c -o modules/module_native_protocol_fd_la-module-native-protocol-fd.lo `test -f 'modules/module-native-protocol-fd.c' || echo '$(srcdir)/'`modules/module-native-protocol-fd.c + +modules/module_native_protocol_tcp_la-module-protocol-stub.lo: modules/module-protocol-stub.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_native_protocol_tcp_la_CFLAGS) $(CFLAGS) -MT modules/module_native_protocol_tcp_la-module-protocol-stub.lo -MD -MP -MF modules/$(DEPDIR)/module_native_protocol_tcp_la-module-protocol-stub.Tpo -c -o modules/module_native_protocol_tcp_la-module-protocol-stub.lo `test -f 'modules/module-protocol-stub.c' || echo '$(srcdir)/'`modules/module-protocol-stub.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_native_protocol_tcp_la-module-protocol-stub.Tpo modules/$(DEPDIR)/module_native_protocol_tcp_la-module-protocol-stub.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-protocol-stub.c' object='modules/module_native_protocol_tcp_la-module-protocol-stub.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_native_protocol_tcp_la_CFLAGS) $(CFLAGS) -c -o modules/module_native_protocol_tcp_la-module-protocol-stub.lo `test -f 'modules/module-protocol-stub.c' || echo '$(srcdir)/'`modules/module-protocol-stub.c + +modules/module_native_protocol_unix_la-module-protocol-stub.lo: modules/module-protocol-stub.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_native_protocol_unix_la_CFLAGS) $(CFLAGS) -MT modules/module_native_protocol_unix_la-module-protocol-stub.lo -MD -MP -MF modules/$(DEPDIR)/module_native_protocol_unix_la-module-protocol-stub.Tpo -c -o modules/module_native_protocol_unix_la-module-protocol-stub.lo `test -f 'modules/module-protocol-stub.c' || echo '$(srcdir)/'`modules/module-protocol-stub.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_native_protocol_unix_la-module-protocol-stub.Tpo modules/$(DEPDIR)/module_native_protocol_unix_la-module-protocol-stub.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-protocol-stub.c' object='modules/module_native_protocol_unix_la-module-protocol-stub.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_native_protocol_unix_la_CFLAGS) $(CFLAGS) -c -o modules/module_native_protocol_unix_la-module-protocol-stub.lo `test -f 'modules/module-protocol-stub.c' || echo '$(srcdir)/'`modules/module-protocol-stub.c + +modules/module_null_sink_la-module-null-sink.lo: modules/module-null-sink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_null_sink_la_CFLAGS) $(CFLAGS) -MT modules/module_null_sink_la-module-null-sink.lo -MD -MP -MF modules/$(DEPDIR)/module_null_sink_la-module-null-sink.Tpo -c -o modules/module_null_sink_la-module-null-sink.lo `test -f 'modules/module-null-sink.c' || echo '$(srcdir)/'`modules/module-null-sink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_null_sink_la-module-null-sink.Tpo modules/$(DEPDIR)/module_null_sink_la-module-null-sink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-null-sink.c' object='modules/module_null_sink_la-module-null-sink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_null_sink_la_CFLAGS) $(CFLAGS) -c -o modules/module_null_sink_la-module-null-sink.lo `test -f 'modules/module-null-sink.c' || echo '$(srcdir)/'`modules/module-null-sink.c + +modules/module_null_source_la-module-null-source.lo: modules/module-null-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_null_source_la_CFLAGS) $(CFLAGS) -MT modules/module_null_source_la-module-null-source.lo -MD -MP -MF modules/$(DEPDIR)/module_null_source_la-module-null-source.Tpo -c -o modules/module_null_source_la-module-null-source.lo `test -f 'modules/module-null-source.c' || echo '$(srcdir)/'`modules/module-null-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_null_source_la-module-null-source.Tpo modules/$(DEPDIR)/module_null_source_la-module-null-source.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-null-source.c' object='modules/module_null_source_la-module-null-source.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_null_source_la_CFLAGS) $(CFLAGS) -c -o modules/module_null_source_la-module-null-source.lo `test -f 'modules/module-null-source.c' || echo '$(srcdir)/'`modules/module-null-source.c + +modules/oss/module_oss_la-module-oss.lo: modules/oss/module-oss.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_oss_la_CFLAGS) $(CFLAGS) -MT modules/oss/module_oss_la-module-oss.lo -MD -MP -MF modules/oss/$(DEPDIR)/module_oss_la-module-oss.Tpo -c -o modules/oss/module_oss_la-module-oss.lo `test -f 'modules/oss/module-oss.c' || echo '$(srcdir)/'`modules/oss/module-oss.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/oss/$(DEPDIR)/module_oss_la-module-oss.Tpo modules/oss/$(DEPDIR)/module_oss_la-module-oss.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/oss/module-oss.c' object='modules/oss/module_oss_la-module-oss.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_oss_la_CFLAGS) $(CFLAGS) -c -o modules/oss/module_oss_la-module-oss.lo `test -f 'modules/oss/module-oss.c' || echo '$(srcdir)/'`modules/oss/module-oss.c + +modules/module_pipe_sink_la-module-pipe-sink.lo: modules/module-pipe-sink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_pipe_sink_la_CFLAGS) $(CFLAGS) -MT modules/module_pipe_sink_la-module-pipe-sink.lo -MD -MP -MF modules/$(DEPDIR)/module_pipe_sink_la-module-pipe-sink.Tpo -c -o modules/module_pipe_sink_la-module-pipe-sink.lo `test -f 'modules/module-pipe-sink.c' || echo '$(srcdir)/'`modules/module-pipe-sink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_pipe_sink_la-module-pipe-sink.Tpo modules/$(DEPDIR)/module_pipe_sink_la-module-pipe-sink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-pipe-sink.c' object='modules/module_pipe_sink_la-module-pipe-sink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_pipe_sink_la_CFLAGS) $(CFLAGS) -c -o modules/module_pipe_sink_la-module-pipe-sink.lo `test -f 'modules/module-pipe-sink.c' || echo '$(srcdir)/'`modules/module-pipe-sink.c + +modules/module_pipe_source_la-module-pipe-source.lo: modules/module-pipe-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_pipe_source_la_CFLAGS) $(CFLAGS) -MT modules/module_pipe_source_la-module-pipe-source.lo -MD -MP -MF modules/$(DEPDIR)/module_pipe_source_la-module-pipe-source.Tpo -c -o modules/module_pipe_source_la-module-pipe-source.lo `test -f 'modules/module-pipe-source.c' || echo '$(srcdir)/'`modules/module-pipe-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_pipe_source_la-module-pipe-source.Tpo modules/$(DEPDIR)/module_pipe_source_la-module-pipe-source.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-pipe-source.c' object='modules/module_pipe_source_la-module-pipe-source.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_pipe_source_la_CFLAGS) $(CFLAGS) -c -o modules/module_pipe_source_la-module-pipe-source.lo `test -f 'modules/module-pipe-source.c' || echo '$(srcdir)/'`modules/module-pipe-source.c + +modules/module_position_event_sounds_la-module-position-event-sounds.lo: modules/module-position-event-sounds.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_position_event_sounds_la_CFLAGS) $(CFLAGS) -MT modules/module_position_event_sounds_la-module-position-event-sounds.lo -MD -MP -MF modules/$(DEPDIR)/module_position_event_sounds_la-module-position-event-sounds.Tpo -c -o modules/module_position_event_sounds_la-module-position-event-sounds.lo `test -f 'modules/module-position-event-sounds.c' || echo '$(srcdir)/'`modules/module-position-event-sounds.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_position_event_sounds_la-module-position-event-sounds.Tpo modules/$(DEPDIR)/module_position_event_sounds_la-module-position-event-sounds.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-position-event-sounds.c' object='modules/module_position_event_sounds_la-module-position-event-sounds.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_position_event_sounds_la_CFLAGS) $(CFLAGS) -c -o modules/module_position_event_sounds_la-module-position-event-sounds.lo `test -f 'modules/module-position-event-sounds.c' || echo '$(srcdir)/'`modules/module-position-event-sounds.c + +modules/raop/module_raop_discover_la-module-raop-discover.lo: modules/raop/module-raop-discover.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_raop_discover_la_CFLAGS) $(CFLAGS) -MT modules/raop/module_raop_discover_la-module-raop-discover.lo -MD -MP -MF modules/raop/$(DEPDIR)/module_raop_discover_la-module-raop-discover.Tpo -c -o modules/raop/module_raop_discover_la-module-raop-discover.lo `test -f 'modules/raop/module-raop-discover.c' || echo '$(srcdir)/'`modules/raop/module-raop-discover.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/raop/$(DEPDIR)/module_raop_discover_la-module-raop-discover.Tpo modules/raop/$(DEPDIR)/module_raop_discover_la-module-raop-discover.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/raop/module-raop-discover.c' object='modules/raop/module_raop_discover_la-module-raop-discover.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_raop_discover_la_CFLAGS) $(CFLAGS) -c -o modules/raop/module_raop_discover_la-module-raop-discover.lo `test -f 'modules/raop/module-raop-discover.c' || echo '$(srcdir)/'`modules/raop/module-raop-discover.c + +modules/raop/module_raop_sink_la-module-raop-sink.lo: modules/raop/module-raop-sink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_raop_sink_la_CFLAGS) $(CFLAGS) -MT modules/raop/module_raop_sink_la-module-raop-sink.lo -MD -MP -MF modules/raop/$(DEPDIR)/module_raop_sink_la-module-raop-sink.Tpo -c -o modules/raop/module_raop_sink_la-module-raop-sink.lo `test -f 'modules/raop/module-raop-sink.c' || echo '$(srcdir)/'`modules/raop/module-raop-sink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/raop/$(DEPDIR)/module_raop_sink_la-module-raop-sink.Tpo modules/raop/$(DEPDIR)/module_raop_sink_la-module-raop-sink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/raop/module-raop-sink.c' object='modules/raop/module_raop_sink_la-module-raop-sink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_raop_sink_la_CFLAGS) $(CFLAGS) -c -o modules/raop/module_raop_sink_la-module-raop-sink.lo `test -f 'modules/raop/module-raop-sink.c' || echo '$(srcdir)/'`modules/raop/module-raop-sink.c + +modules/module_remap_sink_la-module-remap-sink.lo: modules/module-remap-sink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_remap_sink_la_CFLAGS) $(CFLAGS) -MT modules/module_remap_sink_la-module-remap-sink.lo -MD -MP -MF modules/$(DEPDIR)/module_remap_sink_la-module-remap-sink.Tpo -c -o modules/module_remap_sink_la-module-remap-sink.lo `test -f 'modules/module-remap-sink.c' || echo '$(srcdir)/'`modules/module-remap-sink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_remap_sink_la-module-remap-sink.Tpo modules/$(DEPDIR)/module_remap_sink_la-module-remap-sink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-remap-sink.c' object='modules/module_remap_sink_la-module-remap-sink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_remap_sink_la_CFLAGS) $(CFLAGS) -c -o modules/module_remap_sink_la-module-remap-sink.lo `test -f 'modules/module-remap-sink.c' || echo '$(srcdir)/'`modules/module-remap-sink.c + +modules/module_remap_source_la-module-remap-source.lo: modules/module-remap-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_remap_source_la_CFLAGS) $(CFLAGS) -MT modules/module_remap_source_la-module-remap-source.lo -MD -MP -MF modules/$(DEPDIR)/module_remap_source_la-module-remap-source.Tpo -c -o modules/module_remap_source_la-module-remap-source.lo `test -f 'modules/module-remap-source.c' || echo '$(srcdir)/'`modules/module-remap-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_remap_source_la-module-remap-source.Tpo modules/$(DEPDIR)/module_remap_source_la-module-remap-source.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-remap-source.c' object='modules/module_remap_source_la-module-remap-source.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_remap_source_la_CFLAGS) $(CFLAGS) -c -o modules/module_remap_source_la-module-remap-source.lo `test -f 'modules/module-remap-source.c' || echo '$(srcdir)/'`modules/module-remap-source.c + +modules/module_rescue_streams_la-module-rescue-streams.lo: modules/module-rescue-streams.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_rescue_streams_la_CFLAGS) $(CFLAGS) -MT modules/module_rescue_streams_la-module-rescue-streams.lo -MD -MP -MF modules/$(DEPDIR)/module_rescue_streams_la-module-rescue-streams.Tpo -c -o modules/module_rescue_streams_la-module-rescue-streams.lo `test -f 'modules/module-rescue-streams.c' || echo '$(srcdir)/'`modules/module-rescue-streams.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_rescue_streams_la-module-rescue-streams.Tpo modules/$(DEPDIR)/module_rescue_streams_la-module-rescue-streams.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-rescue-streams.c' object='modules/module_rescue_streams_la-module-rescue-streams.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_rescue_streams_la_CFLAGS) $(CFLAGS) -c -o modules/module_rescue_streams_la-module-rescue-streams.lo `test -f 'modules/module-rescue-streams.c' || echo '$(srcdir)/'`modules/module-rescue-streams.c + +modules/module_role_cork_la-module-role-cork.lo: modules/module-role-cork.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_role_cork_la_CFLAGS) $(CFLAGS) -MT modules/module_role_cork_la-module-role-cork.lo -MD -MP -MF modules/$(DEPDIR)/module_role_cork_la-module-role-cork.Tpo -c -o modules/module_role_cork_la-module-role-cork.lo `test -f 'modules/module-role-cork.c' || echo '$(srcdir)/'`modules/module-role-cork.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_role_cork_la-module-role-cork.Tpo modules/$(DEPDIR)/module_role_cork_la-module-role-cork.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-role-cork.c' object='modules/module_role_cork_la-module-role-cork.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_role_cork_la_CFLAGS) $(CFLAGS) -c -o modules/module_role_cork_la-module-role-cork.lo `test -f 'modules/module-role-cork.c' || echo '$(srcdir)/'`modules/module-role-cork.c + +modules/module_role_cork_la-stream-interaction.lo: modules/stream-interaction.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_role_cork_la_CFLAGS) $(CFLAGS) -MT modules/module_role_cork_la-stream-interaction.lo -MD -MP -MF modules/$(DEPDIR)/module_role_cork_la-stream-interaction.Tpo -c -o modules/module_role_cork_la-stream-interaction.lo `test -f 'modules/stream-interaction.c' || echo '$(srcdir)/'`modules/stream-interaction.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_role_cork_la-stream-interaction.Tpo modules/$(DEPDIR)/module_role_cork_la-stream-interaction.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/stream-interaction.c' object='modules/module_role_cork_la-stream-interaction.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_role_cork_la_CFLAGS) $(CFLAGS) -c -o modules/module_role_cork_la-stream-interaction.lo `test -f 'modules/stream-interaction.c' || echo '$(srcdir)/'`modules/stream-interaction.c + +modules/module_role_ducking_la-module-role-ducking.lo: modules/module-role-ducking.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_role_ducking_la_CFLAGS) $(CFLAGS) -MT modules/module_role_ducking_la-module-role-ducking.lo -MD -MP -MF modules/$(DEPDIR)/module_role_ducking_la-module-role-ducking.Tpo -c -o modules/module_role_ducking_la-module-role-ducking.lo `test -f 'modules/module-role-ducking.c' || echo '$(srcdir)/'`modules/module-role-ducking.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_role_ducking_la-module-role-ducking.Tpo modules/$(DEPDIR)/module_role_ducking_la-module-role-ducking.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-role-ducking.c' object='modules/module_role_ducking_la-module-role-ducking.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_role_ducking_la_CFLAGS) $(CFLAGS) -c -o modules/module_role_ducking_la-module-role-ducking.lo `test -f 'modules/module-role-ducking.c' || echo '$(srcdir)/'`modules/module-role-ducking.c + +modules/module_role_ducking_la-stream-interaction.lo: modules/stream-interaction.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_role_ducking_la_CFLAGS) $(CFLAGS) -MT modules/module_role_ducking_la-stream-interaction.lo -MD -MP -MF modules/$(DEPDIR)/module_role_ducking_la-stream-interaction.Tpo -c -o modules/module_role_ducking_la-stream-interaction.lo `test -f 'modules/stream-interaction.c' || echo '$(srcdir)/'`modules/stream-interaction.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_role_ducking_la-stream-interaction.Tpo modules/$(DEPDIR)/module_role_ducking_la-stream-interaction.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/stream-interaction.c' object='modules/module_role_ducking_la-stream-interaction.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_role_ducking_la_CFLAGS) $(CFLAGS) -c -o modules/module_role_ducking_la-stream-interaction.lo `test -f 'modules/stream-interaction.c' || echo '$(srcdir)/'`modules/stream-interaction.c + +modules/rtp/module_rtp_recv_la-module-rtp-recv.lo: modules/rtp/module-rtp-recv.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_rtp_recv_la_CFLAGS) $(CFLAGS) -MT modules/rtp/module_rtp_recv_la-module-rtp-recv.lo -MD -MP -MF modules/rtp/$(DEPDIR)/module_rtp_recv_la-module-rtp-recv.Tpo -c -o modules/rtp/module_rtp_recv_la-module-rtp-recv.lo `test -f 'modules/rtp/module-rtp-recv.c' || echo '$(srcdir)/'`modules/rtp/module-rtp-recv.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/rtp/$(DEPDIR)/module_rtp_recv_la-module-rtp-recv.Tpo modules/rtp/$(DEPDIR)/module_rtp_recv_la-module-rtp-recv.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/rtp/module-rtp-recv.c' object='modules/rtp/module_rtp_recv_la-module-rtp-recv.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_rtp_recv_la_CFLAGS) $(CFLAGS) -c -o modules/rtp/module_rtp_recv_la-module-rtp-recv.lo `test -f 'modules/rtp/module-rtp-recv.c' || echo '$(srcdir)/'`modules/rtp/module-rtp-recv.c + +modules/rtp/module_rtp_send_la-module-rtp-send.lo: modules/rtp/module-rtp-send.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_rtp_send_la_CFLAGS) $(CFLAGS) -MT modules/rtp/module_rtp_send_la-module-rtp-send.lo -MD -MP -MF modules/rtp/$(DEPDIR)/module_rtp_send_la-module-rtp-send.Tpo -c -o modules/rtp/module_rtp_send_la-module-rtp-send.lo `test -f 'modules/rtp/module-rtp-send.c' || echo '$(srcdir)/'`modules/rtp/module-rtp-send.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/rtp/$(DEPDIR)/module_rtp_send_la-module-rtp-send.Tpo modules/rtp/$(DEPDIR)/module_rtp_send_la-module-rtp-send.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/rtp/module-rtp-send.c' object='modules/rtp/module_rtp_send_la-module-rtp-send.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_rtp_send_la_CFLAGS) $(CFLAGS) -c -o modules/rtp/module_rtp_send_la-module-rtp-send.lo `test -f 'modules/rtp/module-rtp-send.c' || echo '$(srcdir)/'`modules/rtp/module-rtp-send.c + +modules/module_rygel_media_server_la-module-rygel-media-server.lo: modules/module-rygel-media-server.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_rygel_media_server_la_CFLAGS) $(CFLAGS) -MT modules/module_rygel_media_server_la-module-rygel-media-server.lo -MD -MP -MF modules/$(DEPDIR)/module_rygel_media_server_la-module-rygel-media-server.Tpo -c -o modules/module_rygel_media_server_la-module-rygel-media-server.lo `test -f 'modules/module-rygel-media-server.c' || echo '$(srcdir)/'`modules/module-rygel-media-server.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_rygel_media_server_la-module-rygel-media-server.Tpo modules/$(DEPDIR)/module_rygel_media_server_la-module-rygel-media-server.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-rygel-media-server.c' object='modules/module_rygel_media_server_la-module-rygel-media-server.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_rygel_media_server_la_CFLAGS) $(CFLAGS) -c -o modules/module_rygel_media_server_la-module-rygel-media-server.lo `test -f 'modules/module-rygel-media-server.c' || echo '$(srcdir)/'`modules/module-rygel-media-server.c + +modules/module_simple_protocol_tcp_la-module-protocol-stub.lo: modules/module-protocol-stub.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_simple_protocol_tcp_la_CFLAGS) $(CFLAGS) -MT modules/module_simple_protocol_tcp_la-module-protocol-stub.lo -MD -MP -MF modules/$(DEPDIR)/module_simple_protocol_tcp_la-module-protocol-stub.Tpo -c -o modules/module_simple_protocol_tcp_la-module-protocol-stub.lo `test -f 'modules/module-protocol-stub.c' || echo '$(srcdir)/'`modules/module-protocol-stub.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_simple_protocol_tcp_la-module-protocol-stub.Tpo modules/$(DEPDIR)/module_simple_protocol_tcp_la-module-protocol-stub.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-protocol-stub.c' object='modules/module_simple_protocol_tcp_la-module-protocol-stub.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_simple_protocol_tcp_la_CFLAGS) $(CFLAGS) -c -o modules/module_simple_protocol_tcp_la-module-protocol-stub.lo `test -f 'modules/module-protocol-stub.c' || echo '$(srcdir)/'`modules/module-protocol-stub.c + +modules/module_simple_protocol_unix_la-module-protocol-stub.lo: modules/module-protocol-stub.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_simple_protocol_unix_la_CFLAGS) $(CFLAGS) -MT modules/module_simple_protocol_unix_la-module-protocol-stub.lo -MD -MP -MF modules/$(DEPDIR)/module_simple_protocol_unix_la-module-protocol-stub.Tpo -c -o modules/module_simple_protocol_unix_la-module-protocol-stub.lo `test -f 'modules/module-protocol-stub.c' || echo '$(srcdir)/'`modules/module-protocol-stub.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_simple_protocol_unix_la-module-protocol-stub.Tpo modules/$(DEPDIR)/module_simple_protocol_unix_la-module-protocol-stub.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-protocol-stub.c' object='modules/module_simple_protocol_unix_la-module-protocol-stub.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_simple_protocol_unix_la_CFLAGS) $(CFLAGS) -c -o modules/module_simple_protocol_unix_la-module-protocol-stub.lo `test -f 'modules/module-protocol-stub.c' || echo '$(srcdir)/'`modules/module-protocol-stub.c + +modules/module_sine_source_la-module-sine-source.lo: modules/module-sine-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_sine_source_la_CFLAGS) $(CFLAGS) -MT modules/module_sine_source_la-module-sine-source.lo -MD -MP -MF modules/$(DEPDIR)/module_sine_source_la-module-sine-source.Tpo -c -o modules/module_sine_source_la-module-sine-source.lo `test -f 'modules/module-sine-source.c' || echo '$(srcdir)/'`modules/module-sine-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_sine_source_la-module-sine-source.Tpo modules/$(DEPDIR)/module_sine_source_la-module-sine-source.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-sine-source.c' object='modules/module_sine_source_la-module-sine-source.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_sine_source_la_CFLAGS) $(CFLAGS) -c -o modules/module_sine_source_la-module-sine-source.lo `test -f 'modules/module-sine-source.c' || echo '$(srcdir)/'`modules/module-sine-source.c + +modules/module_sine_la-module-sine.lo: modules/module-sine.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_sine_la_CFLAGS) $(CFLAGS) -MT modules/module_sine_la-module-sine.lo -MD -MP -MF modules/$(DEPDIR)/module_sine_la-module-sine.Tpo -c -o modules/module_sine_la-module-sine.lo `test -f 'modules/module-sine.c' || echo '$(srcdir)/'`modules/module-sine.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_sine_la-module-sine.Tpo modules/$(DEPDIR)/module_sine_la-module-sine.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-sine.c' object='modules/module_sine_la-module-sine.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_sine_la_CFLAGS) $(CFLAGS) -c -o modules/module_sine_la-module-sine.lo `test -f 'modules/module-sine.c' || echo '$(srcdir)/'`modules/module-sine.c + +modules/module_solaris_la-module-solaris.lo: modules/module-solaris.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_solaris_la_CFLAGS) $(CFLAGS) -MT modules/module_solaris_la-module-solaris.lo -MD -MP -MF modules/$(DEPDIR)/module_solaris_la-module-solaris.Tpo -c -o modules/module_solaris_la-module-solaris.lo `test -f 'modules/module-solaris.c' || echo '$(srcdir)/'`modules/module-solaris.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_solaris_la-module-solaris.Tpo modules/$(DEPDIR)/module_solaris_la-module-solaris.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-solaris.c' object='modules/module_solaris_la-module-solaris.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_solaris_la_CFLAGS) $(CFLAGS) -c -o modules/module_solaris_la-module-solaris.lo `test -f 'modules/module-solaris.c' || echo '$(srcdir)/'`modules/module-solaris.c + +modules/module_stream_restore_la-module-stream-restore.lo: modules/module-stream-restore.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_stream_restore_la_CFLAGS) $(CFLAGS) -MT modules/module_stream_restore_la-module-stream-restore.lo -MD -MP -MF modules/$(DEPDIR)/module_stream_restore_la-module-stream-restore.Tpo -c -o modules/module_stream_restore_la-module-stream-restore.lo `test -f 'modules/module-stream-restore.c' || echo '$(srcdir)/'`modules/module-stream-restore.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_stream_restore_la-module-stream-restore.Tpo modules/$(DEPDIR)/module_stream_restore_la-module-stream-restore.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-stream-restore.c' object='modules/module_stream_restore_la-module-stream-restore.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_stream_restore_la_CFLAGS) $(CFLAGS) -c -o modules/module_stream_restore_la-module-stream-restore.lo `test -f 'modules/module-stream-restore.c' || echo '$(srcdir)/'`modules/module-stream-restore.c + +modules/module_suspend_on_idle_la-module-suspend-on-idle.lo: modules/module-suspend-on-idle.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_suspend_on_idle_la_CFLAGS) $(CFLAGS) -MT modules/module_suspend_on_idle_la-module-suspend-on-idle.lo -MD -MP -MF modules/$(DEPDIR)/module_suspend_on_idle_la-module-suspend-on-idle.Tpo -c -o modules/module_suspend_on_idle_la-module-suspend-on-idle.lo `test -f 'modules/module-suspend-on-idle.c' || echo '$(srcdir)/'`modules/module-suspend-on-idle.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_suspend_on_idle_la-module-suspend-on-idle.Tpo modules/$(DEPDIR)/module_suspend_on_idle_la-module-suspend-on-idle.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-suspend-on-idle.c' object='modules/module_suspend_on_idle_la-module-suspend-on-idle.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_suspend_on_idle_la_CFLAGS) $(CFLAGS) -c -o modules/module_suspend_on_idle_la-module-suspend-on-idle.lo `test -f 'modules/module-suspend-on-idle.c' || echo '$(srcdir)/'`modules/module-suspend-on-idle.c + +modules/module_switch_on_connect_la-module-switch-on-connect.lo: modules/module-switch-on-connect.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_switch_on_connect_la_CFLAGS) $(CFLAGS) -MT modules/module_switch_on_connect_la-module-switch-on-connect.lo -MD -MP -MF modules/$(DEPDIR)/module_switch_on_connect_la-module-switch-on-connect.Tpo -c -o modules/module_switch_on_connect_la-module-switch-on-connect.lo `test -f 'modules/module-switch-on-connect.c' || echo '$(srcdir)/'`modules/module-switch-on-connect.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_switch_on_connect_la-module-switch-on-connect.Tpo modules/$(DEPDIR)/module_switch_on_connect_la-module-switch-on-connect.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-switch-on-connect.c' object='modules/module_switch_on_connect_la-module-switch-on-connect.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_switch_on_connect_la_CFLAGS) $(CFLAGS) -c -o modules/module_switch_on_connect_la-module-switch-on-connect.lo `test -f 'modules/module-switch-on-connect.c' || echo '$(srcdir)/'`modules/module-switch-on-connect.c + +modules/module_switch_on_port_available_la-module-switch-on-port-available.lo: modules/module-switch-on-port-available.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_switch_on_port_available_la_CFLAGS) $(CFLAGS) -MT modules/module_switch_on_port_available_la-module-switch-on-port-available.lo -MD -MP -MF modules/$(DEPDIR)/module_switch_on_port_available_la-module-switch-on-port-available.Tpo -c -o modules/module_switch_on_port_available_la-module-switch-on-port-available.lo `test -f 'modules/module-switch-on-port-available.c' || echo '$(srcdir)/'`modules/module-switch-on-port-available.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_switch_on_port_available_la-module-switch-on-port-available.Tpo modules/$(DEPDIR)/module_switch_on_port_available_la-module-switch-on-port-available.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-switch-on-port-available.c' object='modules/module_switch_on_port_available_la-module-switch-on-port-available.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_switch_on_port_available_la_CFLAGS) $(CFLAGS) -c -o modules/module_switch_on_port_available_la-module-switch-on-port-available.lo `test -f 'modules/module-switch-on-port-available.c' || echo '$(srcdir)/'`modules/module-switch-on-port-available.c + +modules/module_systemd_login_la-module-systemd-login.lo: modules/module-systemd-login.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_systemd_login_la_CFLAGS) $(CFLAGS) -MT modules/module_systemd_login_la-module-systemd-login.lo -MD -MP -MF modules/$(DEPDIR)/module_systemd_login_la-module-systemd-login.Tpo -c -o modules/module_systemd_login_la-module-systemd-login.lo `test -f 'modules/module-systemd-login.c' || echo '$(srcdir)/'`modules/module-systemd-login.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_systemd_login_la-module-systemd-login.Tpo modules/$(DEPDIR)/module_systemd_login_la-module-systemd-login.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-systemd-login.c' object='modules/module_systemd_login_la-module-systemd-login.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_systemd_login_la_CFLAGS) $(CFLAGS) -c -o modules/module_systemd_login_la-module-systemd-login.lo `test -f 'modules/module-systemd-login.c' || echo '$(srcdir)/'`modules/module-systemd-login.c + +modules/module_tunnel_sink_new_la-module-tunnel-sink-new.lo: modules/module-tunnel-sink-new.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_tunnel_sink_new_la_CFLAGS) $(CFLAGS) -MT modules/module_tunnel_sink_new_la-module-tunnel-sink-new.lo -MD -MP -MF modules/$(DEPDIR)/module_tunnel_sink_new_la-module-tunnel-sink-new.Tpo -c -o modules/module_tunnel_sink_new_la-module-tunnel-sink-new.lo `test -f 'modules/module-tunnel-sink-new.c' || echo '$(srcdir)/'`modules/module-tunnel-sink-new.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_tunnel_sink_new_la-module-tunnel-sink-new.Tpo modules/$(DEPDIR)/module_tunnel_sink_new_la-module-tunnel-sink-new.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-tunnel-sink-new.c' object='modules/module_tunnel_sink_new_la-module-tunnel-sink-new.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_tunnel_sink_new_la_CFLAGS) $(CFLAGS) -c -o modules/module_tunnel_sink_new_la-module-tunnel-sink-new.lo `test -f 'modules/module-tunnel-sink-new.c' || echo '$(srcdir)/'`modules/module-tunnel-sink-new.c + +modules/module_tunnel_sink_la-module-tunnel.lo: modules/module-tunnel.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_tunnel_sink_la_CFLAGS) $(CFLAGS) -MT modules/module_tunnel_sink_la-module-tunnel.lo -MD -MP -MF modules/$(DEPDIR)/module_tunnel_sink_la-module-tunnel.Tpo -c -o modules/module_tunnel_sink_la-module-tunnel.lo `test -f 'modules/module-tunnel.c' || echo '$(srcdir)/'`modules/module-tunnel.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_tunnel_sink_la-module-tunnel.Tpo modules/$(DEPDIR)/module_tunnel_sink_la-module-tunnel.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-tunnel.c' object='modules/module_tunnel_sink_la-module-tunnel.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_tunnel_sink_la_CFLAGS) $(CFLAGS) -c -o modules/module_tunnel_sink_la-module-tunnel.lo `test -f 'modules/module-tunnel.c' || echo '$(srcdir)/'`modules/module-tunnel.c + +modules/module_tunnel_source_new_la-module-tunnel-source-new.lo: modules/module-tunnel-source-new.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_tunnel_source_new_la_CFLAGS) $(CFLAGS) -MT modules/module_tunnel_source_new_la-module-tunnel-source-new.lo -MD -MP -MF modules/$(DEPDIR)/module_tunnel_source_new_la-module-tunnel-source-new.Tpo -c -o modules/module_tunnel_source_new_la-module-tunnel-source-new.lo `test -f 'modules/module-tunnel-source-new.c' || echo '$(srcdir)/'`modules/module-tunnel-source-new.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_tunnel_source_new_la-module-tunnel-source-new.Tpo modules/$(DEPDIR)/module_tunnel_source_new_la-module-tunnel-source-new.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-tunnel-source-new.c' object='modules/module_tunnel_source_new_la-module-tunnel-source-new.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_tunnel_source_new_la_CFLAGS) $(CFLAGS) -c -o modules/module_tunnel_source_new_la-module-tunnel-source-new.lo `test -f 'modules/module-tunnel-source-new.c' || echo '$(srcdir)/'`modules/module-tunnel-source-new.c + +modules/module_tunnel_source_la-module-tunnel.lo: modules/module-tunnel.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_tunnel_source_la_CFLAGS) $(CFLAGS) -MT modules/module_tunnel_source_la-module-tunnel.lo -MD -MP -MF modules/$(DEPDIR)/module_tunnel_source_la-module-tunnel.Tpo -c -o modules/module_tunnel_source_la-module-tunnel.lo `test -f 'modules/module-tunnel.c' || echo '$(srcdir)/'`modules/module-tunnel.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_tunnel_source_la-module-tunnel.Tpo modules/$(DEPDIR)/module_tunnel_source_la-module-tunnel.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-tunnel.c' object='modules/module_tunnel_source_la-module-tunnel.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_tunnel_source_la_CFLAGS) $(CFLAGS) -c -o modules/module_tunnel_source_la-module-tunnel.lo `test -f 'modules/module-tunnel.c' || echo '$(srcdir)/'`modules/module-tunnel.c + +modules/module_udev_detect_la-module-udev-detect.lo: modules/module-udev-detect.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_udev_detect_la_CFLAGS) $(CFLAGS) -MT modules/module_udev_detect_la-module-udev-detect.lo -MD -MP -MF modules/$(DEPDIR)/module_udev_detect_la-module-udev-detect.Tpo -c -o modules/module_udev_detect_la-module-udev-detect.lo `test -f 'modules/module-udev-detect.c' || echo '$(srcdir)/'`modules/module-udev-detect.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_udev_detect_la-module-udev-detect.Tpo modules/$(DEPDIR)/module_udev_detect_la-module-udev-detect.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-udev-detect.c' object='modules/module_udev_detect_la-module-udev-detect.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_udev_detect_la_CFLAGS) $(CFLAGS) -c -o modules/module_udev_detect_la-module-udev-detect.lo `test -f 'modules/module-udev-detect.c' || echo '$(srcdir)/'`modules/module-udev-detect.c + +modules/module_virtual_sink_la-module-virtual-sink.lo: modules/module-virtual-sink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_virtual_sink_la_CFLAGS) $(CFLAGS) -MT modules/module_virtual_sink_la-module-virtual-sink.lo -MD -MP -MF modules/$(DEPDIR)/module_virtual_sink_la-module-virtual-sink.Tpo -c -o modules/module_virtual_sink_la-module-virtual-sink.lo `test -f 'modules/module-virtual-sink.c' || echo '$(srcdir)/'`modules/module-virtual-sink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_virtual_sink_la-module-virtual-sink.Tpo modules/$(DEPDIR)/module_virtual_sink_la-module-virtual-sink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-virtual-sink.c' object='modules/module_virtual_sink_la-module-virtual-sink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_virtual_sink_la_CFLAGS) $(CFLAGS) -c -o modules/module_virtual_sink_la-module-virtual-sink.lo `test -f 'modules/module-virtual-sink.c' || echo '$(srcdir)/'`modules/module-virtual-sink.c + +modules/module_virtual_source_la-module-virtual-source.lo: modules/module-virtual-source.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_virtual_source_la_CFLAGS) $(CFLAGS) -MT modules/module_virtual_source_la-module-virtual-source.lo -MD -MP -MF modules/$(DEPDIR)/module_virtual_source_la-module-virtual-source.Tpo -c -o modules/module_virtual_source_la-module-virtual-source.lo `test -f 'modules/module-virtual-source.c' || echo '$(srcdir)/'`modules/module-virtual-source.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_virtual_source_la-module-virtual-source.Tpo modules/$(DEPDIR)/module_virtual_source_la-module-virtual-source.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-virtual-source.c' object='modules/module_virtual_source_la-module-virtual-source.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_virtual_source_la_CFLAGS) $(CFLAGS) -c -o modules/module_virtual_source_la-module-virtual-source.lo `test -f 'modules/module-virtual-source.c' || echo '$(srcdir)/'`modules/module-virtual-source.c + +modules/module_virtual_surround_sink_la-module-virtual-surround-sink.lo: modules/module-virtual-surround-sink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_virtual_surround_sink_la_CFLAGS) $(CFLAGS) -MT modules/module_virtual_surround_sink_la-module-virtual-surround-sink.lo -MD -MP -MF modules/$(DEPDIR)/module_virtual_surround_sink_la-module-virtual-surround-sink.Tpo -c -o modules/module_virtual_surround_sink_la-module-virtual-surround-sink.lo `test -f 'modules/module-virtual-surround-sink.c' || echo '$(srcdir)/'`modules/module-virtual-surround-sink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_virtual_surround_sink_la-module-virtual-surround-sink.Tpo modules/$(DEPDIR)/module_virtual_surround_sink_la-module-virtual-surround-sink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-virtual-surround-sink.c' object='modules/module_virtual_surround_sink_la-module-virtual-surround-sink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_virtual_surround_sink_la_CFLAGS) $(CFLAGS) -c -o modules/module_virtual_surround_sink_la-module-virtual-surround-sink.lo `test -f 'modules/module-virtual-surround-sink.c' || echo '$(srcdir)/'`modules/module-virtual-surround-sink.c + +modules/module_volume_restore_la-module-volume-restore.lo: modules/module-volume-restore.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_volume_restore_la_CFLAGS) $(CFLAGS) -MT modules/module_volume_restore_la-module-volume-restore.lo -MD -MP -MF modules/$(DEPDIR)/module_volume_restore_la-module-volume-restore.Tpo -c -o modules/module_volume_restore_la-module-volume-restore.lo `test -f 'modules/module-volume-restore.c' || echo '$(srcdir)/'`modules/module-volume-restore.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_volume_restore_la-module-volume-restore.Tpo modules/$(DEPDIR)/module_volume_restore_la-module-volume-restore.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-volume-restore.c' object='modules/module_volume_restore_la-module-volume-restore.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_volume_restore_la_CFLAGS) $(CFLAGS) -c -o modules/module_volume_restore_la-module-volume-restore.lo `test -f 'modules/module-volume-restore.c' || echo '$(srcdir)/'`modules/module-volume-restore.c + +modules/module_waveout_la-module-waveout.lo: modules/module-waveout.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_waveout_la_CFLAGS) $(CFLAGS) -MT modules/module_waveout_la-module-waveout.lo -MD -MP -MF modules/$(DEPDIR)/module_waveout_la-module-waveout.Tpo -c -o modules/module_waveout_la-module-waveout.lo `test -f 'modules/module-waveout.c' || echo '$(srcdir)/'`modules/module-waveout.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_waveout_la-module-waveout.Tpo modules/$(DEPDIR)/module_waveout_la-module-waveout.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-waveout.c' object='modules/module_waveout_la-module-waveout.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_waveout_la_CFLAGS) $(CFLAGS) -c -o modules/module_waveout_la-module-waveout.lo `test -f 'modules/module-waveout.c' || echo '$(srcdir)/'`modules/module-waveout.c + +modules/x11/module_x11_bell_la-module-x11-bell.lo: modules/x11/module-x11-bell.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_x11_bell_la_CFLAGS) $(CFLAGS) -MT modules/x11/module_x11_bell_la-module-x11-bell.lo -MD -MP -MF modules/x11/$(DEPDIR)/module_x11_bell_la-module-x11-bell.Tpo -c -o modules/x11/module_x11_bell_la-module-x11-bell.lo `test -f 'modules/x11/module-x11-bell.c' || echo '$(srcdir)/'`modules/x11/module-x11-bell.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/x11/$(DEPDIR)/module_x11_bell_la-module-x11-bell.Tpo modules/x11/$(DEPDIR)/module_x11_bell_la-module-x11-bell.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/x11/module-x11-bell.c' object='modules/x11/module_x11_bell_la-module-x11-bell.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_x11_bell_la_CFLAGS) $(CFLAGS) -c -o modules/x11/module_x11_bell_la-module-x11-bell.lo `test -f 'modules/x11/module-x11-bell.c' || echo '$(srcdir)/'`modules/x11/module-x11-bell.c + +modules/x11/module_x11_cork_request_la-module-x11-cork-request.lo: modules/x11/module-x11-cork-request.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_x11_cork_request_la_CFLAGS) $(CFLAGS) -MT modules/x11/module_x11_cork_request_la-module-x11-cork-request.lo -MD -MP -MF modules/x11/$(DEPDIR)/module_x11_cork_request_la-module-x11-cork-request.Tpo -c -o modules/x11/module_x11_cork_request_la-module-x11-cork-request.lo `test -f 'modules/x11/module-x11-cork-request.c' || echo '$(srcdir)/'`modules/x11/module-x11-cork-request.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/x11/$(DEPDIR)/module_x11_cork_request_la-module-x11-cork-request.Tpo modules/x11/$(DEPDIR)/module_x11_cork_request_la-module-x11-cork-request.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/x11/module-x11-cork-request.c' object='modules/x11/module_x11_cork_request_la-module-x11-cork-request.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_x11_cork_request_la_CFLAGS) $(CFLAGS) -c -o modules/x11/module_x11_cork_request_la-module-x11-cork-request.lo `test -f 'modules/x11/module-x11-cork-request.c' || echo '$(srcdir)/'`modules/x11/module-x11-cork-request.c + +modules/x11/module_x11_publish_la-module-x11-publish.lo: modules/x11/module-x11-publish.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_x11_publish_la_CFLAGS) $(CFLAGS) -MT modules/x11/module_x11_publish_la-module-x11-publish.lo -MD -MP -MF modules/x11/$(DEPDIR)/module_x11_publish_la-module-x11-publish.Tpo -c -o modules/x11/module_x11_publish_la-module-x11-publish.lo `test -f 'modules/x11/module-x11-publish.c' || echo '$(srcdir)/'`modules/x11/module-x11-publish.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/x11/$(DEPDIR)/module_x11_publish_la-module-x11-publish.Tpo modules/x11/$(DEPDIR)/module_x11_publish_la-module-x11-publish.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/x11/module-x11-publish.c' object='modules/x11/module_x11_publish_la-module-x11-publish.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_x11_publish_la_CFLAGS) $(CFLAGS) -c -o modules/x11/module_x11_publish_la-module-x11-publish.lo `test -f 'modules/x11/module-x11-publish.c' || echo '$(srcdir)/'`modules/x11/module-x11-publish.c + +modules/x11/module_x11_xsmp_la-module-x11-xsmp.lo: modules/x11/module-x11-xsmp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_x11_xsmp_la_CFLAGS) $(CFLAGS) -MT modules/x11/module_x11_xsmp_la-module-x11-xsmp.lo -MD -MP -MF modules/x11/$(DEPDIR)/module_x11_xsmp_la-module-x11-xsmp.Tpo -c -o modules/x11/module_x11_xsmp_la-module-x11-xsmp.lo `test -f 'modules/x11/module-x11-xsmp.c' || echo '$(srcdir)/'`modules/x11/module-x11-xsmp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/x11/$(DEPDIR)/module_x11_xsmp_la-module-x11-xsmp.Tpo modules/x11/$(DEPDIR)/module_x11_xsmp_la-module-x11-xsmp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/x11/module-x11-xsmp.c' object='modules/x11/module_x11_xsmp_la-module-x11-xsmp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_x11_xsmp_la_CFLAGS) $(CFLAGS) -c -o modules/x11/module_x11_xsmp_la-module-x11-xsmp.lo `test -f 'modules/x11/module-x11-xsmp.c' || echo '$(srcdir)/'`modules/x11/module-x11-xsmp.c + +modules/module_zeroconf_discover_la-module-zeroconf-discover.lo: modules/module-zeroconf-discover.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_zeroconf_discover_la_CFLAGS) $(CFLAGS) -MT modules/module_zeroconf_discover_la-module-zeroconf-discover.lo -MD -MP -MF modules/$(DEPDIR)/module_zeroconf_discover_la-module-zeroconf-discover.Tpo -c -o modules/module_zeroconf_discover_la-module-zeroconf-discover.lo `test -f 'modules/module-zeroconf-discover.c' || echo '$(srcdir)/'`modules/module-zeroconf-discover.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_zeroconf_discover_la-module-zeroconf-discover.Tpo modules/$(DEPDIR)/module_zeroconf_discover_la-module-zeroconf-discover.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-zeroconf-discover.c' object='modules/module_zeroconf_discover_la-module-zeroconf-discover.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_zeroconf_discover_la_CFLAGS) $(CFLAGS) -c -o modules/module_zeroconf_discover_la-module-zeroconf-discover.lo `test -f 'modules/module-zeroconf-discover.c' || echo '$(srcdir)/'`modules/module-zeroconf-discover.c + +modules/module_zeroconf_publish_la-module-zeroconf-publish.lo: modules/module-zeroconf-publish.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_zeroconf_publish_la_CFLAGS) $(CFLAGS) -MT modules/module_zeroconf_publish_la-module-zeroconf-publish.lo -MD -MP -MF modules/$(DEPDIR)/module_zeroconf_publish_la-module-zeroconf-publish.Tpo -c -o modules/module_zeroconf_publish_la-module-zeroconf-publish.lo `test -f 'modules/module-zeroconf-publish.c' || echo '$(srcdir)/'`modules/module-zeroconf-publish.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_zeroconf_publish_la-module-zeroconf-publish.Tpo modules/$(DEPDIR)/module_zeroconf_publish_la-module-zeroconf-publish.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/module-zeroconf-publish.c' object='modules/module_zeroconf_publish_la-module-zeroconf-publish.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_zeroconf_publish_la_CFLAGS) $(CFLAGS) -c -o modules/module_zeroconf_publish_la-module-zeroconf-publish.lo `test -f 'modules/module-zeroconf-publish.c' || echo '$(srcdir)/'`modules/module-zeroconf-publish.c + +tests/alsa_mixer_path_test-alsa-mixer-path-test.o: tests/alsa-mixer-path-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alsa_mixer_path_test_CFLAGS) $(CFLAGS) -MT tests/alsa_mixer_path_test-alsa-mixer-path-test.o -MD -MP -MF tests/$(DEPDIR)/alsa_mixer_path_test-alsa-mixer-path-test.Tpo -c -o tests/alsa_mixer_path_test-alsa-mixer-path-test.o `test -f 'tests/alsa-mixer-path-test.c' || echo '$(srcdir)/'`tests/alsa-mixer-path-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/alsa_mixer_path_test-alsa-mixer-path-test.Tpo tests/$(DEPDIR)/alsa_mixer_path_test-alsa-mixer-path-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/alsa-mixer-path-test.c' object='tests/alsa_mixer_path_test-alsa-mixer-path-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alsa_mixer_path_test_CFLAGS) $(CFLAGS) -c -o tests/alsa_mixer_path_test-alsa-mixer-path-test.o `test -f 'tests/alsa-mixer-path-test.c' || echo '$(srcdir)/'`tests/alsa-mixer-path-test.c + +tests/alsa_mixer_path_test-alsa-mixer-path-test.obj: tests/alsa-mixer-path-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alsa_mixer_path_test_CFLAGS) $(CFLAGS) -MT tests/alsa_mixer_path_test-alsa-mixer-path-test.obj -MD -MP -MF tests/$(DEPDIR)/alsa_mixer_path_test-alsa-mixer-path-test.Tpo -c -o tests/alsa_mixer_path_test-alsa-mixer-path-test.obj `if test -f 'tests/alsa-mixer-path-test.c'; then $(CYGPATH_W) 'tests/alsa-mixer-path-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/alsa-mixer-path-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/alsa_mixer_path_test-alsa-mixer-path-test.Tpo tests/$(DEPDIR)/alsa_mixer_path_test-alsa-mixer-path-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/alsa-mixer-path-test.c' object='tests/alsa_mixer_path_test-alsa-mixer-path-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alsa_mixer_path_test_CFLAGS) $(CFLAGS) -c -o tests/alsa_mixer_path_test-alsa-mixer-path-test.obj `if test -f 'tests/alsa-mixer-path-test.c'; then $(CYGPATH_W) 'tests/alsa-mixer-path-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/alsa-mixer-path-test.c'; fi` + +tests/alsa_time_test-alsa-time-test.o: tests/alsa-time-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alsa_time_test_CFLAGS) $(CFLAGS) -MT tests/alsa_time_test-alsa-time-test.o -MD -MP -MF tests/$(DEPDIR)/alsa_time_test-alsa-time-test.Tpo -c -o tests/alsa_time_test-alsa-time-test.o `test -f 'tests/alsa-time-test.c' || echo '$(srcdir)/'`tests/alsa-time-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/alsa_time_test-alsa-time-test.Tpo tests/$(DEPDIR)/alsa_time_test-alsa-time-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/alsa-time-test.c' object='tests/alsa_time_test-alsa-time-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alsa_time_test_CFLAGS) $(CFLAGS) -c -o tests/alsa_time_test-alsa-time-test.o `test -f 'tests/alsa-time-test.c' || echo '$(srcdir)/'`tests/alsa-time-test.c + +tests/alsa_time_test-alsa-time-test.obj: tests/alsa-time-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alsa_time_test_CFLAGS) $(CFLAGS) -MT tests/alsa_time_test-alsa-time-test.obj -MD -MP -MF tests/$(DEPDIR)/alsa_time_test-alsa-time-test.Tpo -c -o tests/alsa_time_test-alsa-time-test.obj `if test -f 'tests/alsa-time-test.c'; then $(CYGPATH_W) 'tests/alsa-time-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/alsa-time-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/alsa_time_test-alsa-time-test.Tpo tests/$(DEPDIR)/alsa_time_test-alsa-time-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/alsa-time-test.c' object='tests/alsa_time_test-alsa-time-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(alsa_time_test_CFLAGS) $(CFLAGS) -c -o tests/alsa_time_test-alsa-time-test.obj `if test -f 'tests/alsa-time-test.c'; then $(CYGPATH_W) 'tests/alsa-time-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/alsa-time-test.c'; fi` + +tests/asyncmsgq_test-asyncmsgq-test.o: tests/asyncmsgq-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(asyncmsgq_test_CFLAGS) $(CFLAGS) -MT tests/asyncmsgq_test-asyncmsgq-test.o -MD -MP -MF tests/$(DEPDIR)/asyncmsgq_test-asyncmsgq-test.Tpo -c -o tests/asyncmsgq_test-asyncmsgq-test.o `test -f 'tests/asyncmsgq-test.c' || echo '$(srcdir)/'`tests/asyncmsgq-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/asyncmsgq_test-asyncmsgq-test.Tpo tests/$(DEPDIR)/asyncmsgq_test-asyncmsgq-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/asyncmsgq-test.c' object='tests/asyncmsgq_test-asyncmsgq-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(asyncmsgq_test_CFLAGS) $(CFLAGS) -c -o tests/asyncmsgq_test-asyncmsgq-test.o `test -f 'tests/asyncmsgq-test.c' || echo '$(srcdir)/'`tests/asyncmsgq-test.c + +tests/asyncmsgq_test-asyncmsgq-test.obj: tests/asyncmsgq-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(asyncmsgq_test_CFLAGS) $(CFLAGS) -MT tests/asyncmsgq_test-asyncmsgq-test.obj -MD -MP -MF tests/$(DEPDIR)/asyncmsgq_test-asyncmsgq-test.Tpo -c -o tests/asyncmsgq_test-asyncmsgq-test.obj `if test -f 'tests/asyncmsgq-test.c'; then $(CYGPATH_W) 'tests/asyncmsgq-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/asyncmsgq-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/asyncmsgq_test-asyncmsgq-test.Tpo tests/$(DEPDIR)/asyncmsgq_test-asyncmsgq-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/asyncmsgq-test.c' object='tests/asyncmsgq_test-asyncmsgq-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(asyncmsgq_test_CFLAGS) $(CFLAGS) -c -o tests/asyncmsgq_test-asyncmsgq-test.obj `if test -f 'tests/asyncmsgq-test.c'; then $(CYGPATH_W) 'tests/asyncmsgq-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/asyncmsgq-test.c'; fi` + +tests/asyncq_test-asyncq-test.o: tests/asyncq-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(asyncq_test_CFLAGS) $(CFLAGS) -MT tests/asyncq_test-asyncq-test.o -MD -MP -MF tests/$(DEPDIR)/asyncq_test-asyncq-test.Tpo -c -o tests/asyncq_test-asyncq-test.o `test -f 'tests/asyncq-test.c' || echo '$(srcdir)/'`tests/asyncq-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/asyncq_test-asyncq-test.Tpo tests/$(DEPDIR)/asyncq_test-asyncq-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/asyncq-test.c' object='tests/asyncq_test-asyncq-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(asyncq_test_CFLAGS) $(CFLAGS) -c -o tests/asyncq_test-asyncq-test.o `test -f 'tests/asyncq-test.c' || echo '$(srcdir)/'`tests/asyncq-test.c + +tests/asyncq_test-asyncq-test.obj: tests/asyncq-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(asyncq_test_CFLAGS) $(CFLAGS) -MT tests/asyncq_test-asyncq-test.obj -MD -MP -MF tests/$(DEPDIR)/asyncq_test-asyncq-test.Tpo -c -o tests/asyncq_test-asyncq-test.obj `if test -f 'tests/asyncq-test.c'; then $(CYGPATH_W) 'tests/asyncq-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/asyncq-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/asyncq_test-asyncq-test.Tpo tests/$(DEPDIR)/asyncq_test-asyncq-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/asyncq-test.c' object='tests/asyncq_test-asyncq-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(asyncq_test_CFLAGS) $(CFLAGS) -c -o tests/asyncq_test-asyncq-test.obj `if test -f 'tests/asyncq-test.c'; then $(CYGPATH_W) 'tests/asyncq-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/asyncq-test.c'; fi` + +tests/atomic_test-atomic-test.o: tests/atomic-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(atomic_test_CFLAGS) $(CFLAGS) -MT tests/atomic_test-atomic-test.o -MD -MP -MF tests/$(DEPDIR)/atomic_test-atomic-test.Tpo -c -o tests/atomic_test-atomic-test.o `test -f 'tests/atomic-test.c' || echo '$(srcdir)/'`tests/atomic-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/atomic_test-atomic-test.Tpo tests/$(DEPDIR)/atomic_test-atomic-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/atomic-test.c' object='tests/atomic_test-atomic-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(atomic_test_CFLAGS) $(CFLAGS) -c -o tests/atomic_test-atomic-test.o `test -f 'tests/atomic-test.c' || echo '$(srcdir)/'`tests/atomic-test.c + +tests/atomic_test-atomic-test.obj: tests/atomic-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(atomic_test_CFLAGS) $(CFLAGS) -MT tests/atomic_test-atomic-test.obj -MD -MP -MF tests/$(DEPDIR)/atomic_test-atomic-test.Tpo -c -o tests/atomic_test-atomic-test.obj `if test -f 'tests/atomic-test.c'; then $(CYGPATH_W) 'tests/atomic-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/atomic-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/atomic_test-atomic-test.Tpo tests/$(DEPDIR)/atomic_test-atomic-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/atomic-test.c' object='tests/atomic_test-atomic-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(atomic_test_CFLAGS) $(CFLAGS) -c -o tests/atomic_test-atomic-test.obj `if test -f 'tests/atomic-test.c'; then $(CYGPATH_W) 'tests/atomic-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/atomic-test.c'; fi` + +tests/channelmap_test-channelmap-test.o: tests/channelmap-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(channelmap_test_CFLAGS) $(CFLAGS) -MT tests/channelmap_test-channelmap-test.o -MD -MP -MF tests/$(DEPDIR)/channelmap_test-channelmap-test.Tpo -c -o tests/channelmap_test-channelmap-test.o `test -f 'tests/channelmap-test.c' || echo '$(srcdir)/'`tests/channelmap-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/channelmap_test-channelmap-test.Tpo tests/$(DEPDIR)/channelmap_test-channelmap-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/channelmap-test.c' object='tests/channelmap_test-channelmap-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(channelmap_test_CFLAGS) $(CFLAGS) -c -o tests/channelmap_test-channelmap-test.o `test -f 'tests/channelmap-test.c' || echo '$(srcdir)/'`tests/channelmap-test.c + +tests/channelmap_test-channelmap-test.obj: tests/channelmap-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(channelmap_test_CFLAGS) $(CFLAGS) -MT tests/channelmap_test-channelmap-test.obj -MD -MP -MF tests/$(DEPDIR)/channelmap_test-channelmap-test.Tpo -c -o tests/channelmap_test-channelmap-test.obj `if test -f 'tests/channelmap-test.c'; then $(CYGPATH_W) 'tests/channelmap-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/channelmap-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/channelmap_test-channelmap-test.Tpo tests/$(DEPDIR)/channelmap_test-channelmap-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/channelmap-test.c' object='tests/channelmap_test-channelmap-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(channelmap_test_CFLAGS) $(CFLAGS) -c -o tests/channelmap_test-channelmap-test.obj `if test -f 'tests/channelmap-test.c'; then $(CYGPATH_W) 'tests/channelmap-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/channelmap-test.c'; fi` + +tests/close_test-close-test.o: tests/close-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(close_test_CFLAGS) $(CFLAGS) -MT tests/close_test-close-test.o -MD -MP -MF tests/$(DEPDIR)/close_test-close-test.Tpo -c -o tests/close_test-close-test.o `test -f 'tests/close-test.c' || echo '$(srcdir)/'`tests/close-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/close_test-close-test.Tpo tests/$(DEPDIR)/close_test-close-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/close-test.c' object='tests/close_test-close-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(close_test_CFLAGS) $(CFLAGS) -c -o tests/close_test-close-test.o `test -f 'tests/close-test.c' || echo '$(srcdir)/'`tests/close-test.c + +tests/close_test-close-test.obj: tests/close-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(close_test_CFLAGS) $(CFLAGS) -MT tests/close_test-close-test.obj -MD -MP -MF tests/$(DEPDIR)/close_test-close-test.Tpo -c -o tests/close_test-close-test.obj `if test -f 'tests/close-test.c'; then $(CYGPATH_W) 'tests/close-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/close-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/close_test-close-test.Tpo tests/$(DEPDIR)/close_test-close-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/close-test.c' object='tests/close_test-close-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(close_test_CFLAGS) $(CFLAGS) -c -o tests/close_test-close-test.obj `if test -f 'tests/close-test.c'; then $(CYGPATH_W) 'tests/close-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/close-test.c'; fi` + +tests/connect_stress-connect-stress.o: tests/connect-stress.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(connect_stress_CFLAGS) $(CFLAGS) -MT tests/connect_stress-connect-stress.o -MD -MP -MF tests/$(DEPDIR)/connect_stress-connect-stress.Tpo -c -o tests/connect_stress-connect-stress.o `test -f 'tests/connect-stress.c' || echo '$(srcdir)/'`tests/connect-stress.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/connect_stress-connect-stress.Tpo tests/$(DEPDIR)/connect_stress-connect-stress.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/connect-stress.c' object='tests/connect_stress-connect-stress.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(connect_stress_CFLAGS) $(CFLAGS) -c -o tests/connect_stress-connect-stress.o `test -f 'tests/connect-stress.c' || echo '$(srcdir)/'`tests/connect-stress.c + +tests/connect_stress-connect-stress.obj: tests/connect-stress.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(connect_stress_CFLAGS) $(CFLAGS) -MT tests/connect_stress-connect-stress.obj -MD -MP -MF tests/$(DEPDIR)/connect_stress-connect-stress.Tpo -c -o tests/connect_stress-connect-stress.obj `if test -f 'tests/connect-stress.c'; then $(CYGPATH_W) 'tests/connect-stress.c'; else $(CYGPATH_W) '$(srcdir)/tests/connect-stress.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/connect_stress-connect-stress.Tpo tests/$(DEPDIR)/connect_stress-connect-stress.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/connect-stress.c' object='tests/connect_stress-connect-stress.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(connect_stress_CFLAGS) $(CFLAGS) -c -o tests/connect_stress-connect-stress.obj `if test -f 'tests/connect-stress.c'; then $(CYGPATH_W) 'tests/connect-stress.c'; else $(CYGPATH_W) '$(srcdir)/tests/connect-stress.c'; fi` + +tests/core_util_test-core-util-test.o: tests/core-util-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(core_util_test_CFLAGS) $(CFLAGS) -MT tests/core_util_test-core-util-test.o -MD -MP -MF tests/$(DEPDIR)/core_util_test-core-util-test.Tpo -c -o tests/core_util_test-core-util-test.o `test -f 'tests/core-util-test.c' || echo '$(srcdir)/'`tests/core-util-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/core_util_test-core-util-test.Tpo tests/$(DEPDIR)/core_util_test-core-util-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/core-util-test.c' object='tests/core_util_test-core-util-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(core_util_test_CFLAGS) $(CFLAGS) -c -o tests/core_util_test-core-util-test.o `test -f 'tests/core-util-test.c' || echo '$(srcdir)/'`tests/core-util-test.c + +tests/core_util_test-core-util-test.obj: tests/core-util-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(core_util_test_CFLAGS) $(CFLAGS) -MT tests/core_util_test-core-util-test.obj -MD -MP -MF tests/$(DEPDIR)/core_util_test-core-util-test.Tpo -c -o tests/core_util_test-core-util-test.obj `if test -f 'tests/core-util-test.c'; then $(CYGPATH_W) 'tests/core-util-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/core-util-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/core_util_test-core-util-test.Tpo tests/$(DEPDIR)/core_util_test-core-util-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/core-util-test.c' object='tests/core_util_test-core-util-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(core_util_test_CFLAGS) $(CFLAGS) -c -o tests/core_util_test-core-util-test.obj `if test -f 'tests/core-util-test.c'; then $(CYGPATH_W) 'tests/core-util-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/core-util-test.c'; fi` + +tests/cpu_mix_test-cpu-mix-test.o: tests/cpu-mix-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpu_mix_test_CFLAGS) $(CFLAGS) -MT tests/cpu_mix_test-cpu-mix-test.o -MD -MP -MF tests/$(DEPDIR)/cpu_mix_test-cpu-mix-test.Tpo -c -o tests/cpu_mix_test-cpu-mix-test.o `test -f 'tests/cpu-mix-test.c' || echo '$(srcdir)/'`tests/cpu-mix-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/cpu_mix_test-cpu-mix-test.Tpo tests/$(DEPDIR)/cpu_mix_test-cpu-mix-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/cpu-mix-test.c' object='tests/cpu_mix_test-cpu-mix-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpu_mix_test_CFLAGS) $(CFLAGS) -c -o tests/cpu_mix_test-cpu-mix-test.o `test -f 'tests/cpu-mix-test.c' || echo '$(srcdir)/'`tests/cpu-mix-test.c + +tests/cpu_mix_test-cpu-mix-test.obj: tests/cpu-mix-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpu_mix_test_CFLAGS) $(CFLAGS) -MT tests/cpu_mix_test-cpu-mix-test.obj -MD -MP -MF tests/$(DEPDIR)/cpu_mix_test-cpu-mix-test.Tpo -c -o tests/cpu_mix_test-cpu-mix-test.obj `if test -f 'tests/cpu-mix-test.c'; then $(CYGPATH_W) 'tests/cpu-mix-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/cpu-mix-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/cpu_mix_test-cpu-mix-test.Tpo tests/$(DEPDIR)/cpu_mix_test-cpu-mix-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/cpu-mix-test.c' object='tests/cpu_mix_test-cpu-mix-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpu_mix_test_CFLAGS) $(CFLAGS) -c -o tests/cpu_mix_test-cpu-mix-test.obj `if test -f 'tests/cpu-mix-test.c'; then $(CYGPATH_W) 'tests/cpu-mix-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/cpu-mix-test.c'; fi` + +tests/cpu_remap_test-cpu-remap-test.o: tests/cpu-remap-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpu_remap_test_CFLAGS) $(CFLAGS) -MT tests/cpu_remap_test-cpu-remap-test.o -MD -MP -MF tests/$(DEPDIR)/cpu_remap_test-cpu-remap-test.Tpo -c -o tests/cpu_remap_test-cpu-remap-test.o `test -f 'tests/cpu-remap-test.c' || echo '$(srcdir)/'`tests/cpu-remap-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/cpu_remap_test-cpu-remap-test.Tpo tests/$(DEPDIR)/cpu_remap_test-cpu-remap-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/cpu-remap-test.c' object='tests/cpu_remap_test-cpu-remap-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpu_remap_test_CFLAGS) $(CFLAGS) -c -o tests/cpu_remap_test-cpu-remap-test.o `test -f 'tests/cpu-remap-test.c' || echo '$(srcdir)/'`tests/cpu-remap-test.c + +tests/cpu_remap_test-cpu-remap-test.obj: tests/cpu-remap-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpu_remap_test_CFLAGS) $(CFLAGS) -MT tests/cpu_remap_test-cpu-remap-test.obj -MD -MP -MF tests/$(DEPDIR)/cpu_remap_test-cpu-remap-test.Tpo -c -o tests/cpu_remap_test-cpu-remap-test.obj `if test -f 'tests/cpu-remap-test.c'; then $(CYGPATH_W) 'tests/cpu-remap-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/cpu-remap-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/cpu_remap_test-cpu-remap-test.Tpo tests/$(DEPDIR)/cpu_remap_test-cpu-remap-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/cpu-remap-test.c' object='tests/cpu_remap_test-cpu-remap-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpu_remap_test_CFLAGS) $(CFLAGS) -c -o tests/cpu_remap_test-cpu-remap-test.obj `if test -f 'tests/cpu-remap-test.c'; then $(CYGPATH_W) 'tests/cpu-remap-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/cpu-remap-test.c'; fi` + +tests/cpu_sconv_test-cpu-sconv-test.o: tests/cpu-sconv-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpu_sconv_test_CFLAGS) $(CFLAGS) -MT tests/cpu_sconv_test-cpu-sconv-test.o -MD -MP -MF tests/$(DEPDIR)/cpu_sconv_test-cpu-sconv-test.Tpo -c -o tests/cpu_sconv_test-cpu-sconv-test.o `test -f 'tests/cpu-sconv-test.c' || echo '$(srcdir)/'`tests/cpu-sconv-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/cpu_sconv_test-cpu-sconv-test.Tpo tests/$(DEPDIR)/cpu_sconv_test-cpu-sconv-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/cpu-sconv-test.c' object='tests/cpu_sconv_test-cpu-sconv-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpu_sconv_test_CFLAGS) $(CFLAGS) -c -o tests/cpu_sconv_test-cpu-sconv-test.o `test -f 'tests/cpu-sconv-test.c' || echo '$(srcdir)/'`tests/cpu-sconv-test.c + +tests/cpu_sconv_test-cpu-sconv-test.obj: tests/cpu-sconv-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpu_sconv_test_CFLAGS) $(CFLAGS) -MT tests/cpu_sconv_test-cpu-sconv-test.obj -MD -MP -MF tests/$(DEPDIR)/cpu_sconv_test-cpu-sconv-test.Tpo -c -o tests/cpu_sconv_test-cpu-sconv-test.obj `if test -f 'tests/cpu-sconv-test.c'; then $(CYGPATH_W) 'tests/cpu-sconv-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/cpu-sconv-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/cpu_sconv_test-cpu-sconv-test.Tpo tests/$(DEPDIR)/cpu_sconv_test-cpu-sconv-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/cpu-sconv-test.c' object='tests/cpu_sconv_test-cpu-sconv-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpu_sconv_test_CFLAGS) $(CFLAGS) -c -o tests/cpu_sconv_test-cpu-sconv-test.obj `if test -f 'tests/cpu-sconv-test.c'; then $(CYGPATH_W) 'tests/cpu-sconv-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/cpu-sconv-test.c'; fi` + +tests/cpu_volume_test-cpu-volume-test.o: tests/cpu-volume-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpu_volume_test_CFLAGS) $(CFLAGS) -MT tests/cpu_volume_test-cpu-volume-test.o -MD -MP -MF tests/$(DEPDIR)/cpu_volume_test-cpu-volume-test.Tpo -c -o tests/cpu_volume_test-cpu-volume-test.o `test -f 'tests/cpu-volume-test.c' || echo '$(srcdir)/'`tests/cpu-volume-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/cpu_volume_test-cpu-volume-test.Tpo tests/$(DEPDIR)/cpu_volume_test-cpu-volume-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/cpu-volume-test.c' object='tests/cpu_volume_test-cpu-volume-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpu_volume_test_CFLAGS) $(CFLAGS) -c -o tests/cpu_volume_test-cpu-volume-test.o `test -f 'tests/cpu-volume-test.c' || echo '$(srcdir)/'`tests/cpu-volume-test.c + +tests/cpu_volume_test-cpu-volume-test.obj: tests/cpu-volume-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpu_volume_test_CFLAGS) $(CFLAGS) -MT tests/cpu_volume_test-cpu-volume-test.obj -MD -MP -MF tests/$(DEPDIR)/cpu_volume_test-cpu-volume-test.Tpo -c -o tests/cpu_volume_test-cpu-volume-test.obj `if test -f 'tests/cpu-volume-test.c'; then $(CYGPATH_W) 'tests/cpu-volume-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/cpu-volume-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/cpu_volume_test-cpu-volume-test.Tpo tests/$(DEPDIR)/cpu_volume_test-cpu-volume-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/cpu-volume-test.c' object='tests/cpu_volume_test-cpu-volume-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpu_volume_test_CFLAGS) $(CFLAGS) -c -o tests/cpu_volume_test-cpu-volume-test.obj `if test -f 'tests/cpu-volume-test.c'; then $(CYGPATH_W) 'tests/cpu-volume-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/cpu-volume-test.c'; fi` + +tests/cpulimit_test-cpulimit-test.o: tests/cpulimit-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpulimit_test_CFLAGS) $(CFLAGS) -MT tests/cpulimit_test-cpulimit-test.o -MD -MP -MF tests/$(DEPDIR)/cpulimit_test-cpulimit-test.Tpo -c -o tests/cpulimit_test-cpulimit-test.o `test -f 'tests/cpulimit-test.c' || echo '$(srcdir)/'`tests/cpulimit-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/cpulimit_test-cpulimit-test.Tpo tests/$(DEPDIR)/cpulimit_test-cpulimit-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/cpulimit-test.c' object='tests/cpulimit_test-cpulimit-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpulimit_test_CFLAGS) $(CFLAGS) -c -o tests/cpulimit_test-cpulimit-test.o `test -f 'tests/cpulimit-test.c' || echo '$(srcdir)/'`tests/cpulimit-test.c + +tests/cpulimit_test-cpulimit-test.obj: tests/cpulimit-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpulimit_test_CFLAGS) $(CFLAGS) -MT tests/cpulimit_test-cpulimit-test.obj -MD -MP -MF tests/$(DEPDIR)/cpulimit_test-cpulimit-test.Tpo -c -o tests/cpulimit_test-cpulimit-test.obj `if test -f 'tests/cpulimit-test.c'; then $(CYGPATH_W) 'tests/cpulimit-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/cpulimit-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/cpulimit_test-cpulimit-test.Tpo tests/$(DEPDIR)/cpulimit_test-cpulimit-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/cpulimit-test.c' object='tests/cpulimit_test-cpulimit-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpulimit_test_CFLAGS) $(CFLAGS) -c -o tests/cpulimit_test-cpulimit-test.obj `if test -f 'tests/cpulimit-test.c'; then $(CYGPATH_W) 'tests/cpulimit-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/cpulimit-test.c'; fi` + +daemon/cpulimit_test-cpulimit.o: daemon/cpulimit.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpulimit_test_CFLAGS) $(CFLAGS) -MT daemon/cpulimit_test-cpulimit.o -MD -MP -MF daemon/$(DEPDIR)/cpulimit_test-cpulimit.Tpo -c -o daemon/cpulimit_test-cpulimit.o `test -f 'daemon/cpulimit.c' || echo '$(srcdir)/'`daemon/cpulimit.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) daemon/$(DEPDIR)/cpulimit_test-cpulimit.Tpo daemon/$(DEPDIR)/cpulimit_test-cpulimit.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemon/cpulimit.c' object='daemon/cpulimit_test-cpulimit.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpulimit_test_CFLAGS) $(CFLAGS) -c -o daemon/cpulimit_test-cpulimit.o `test -f 'daemon/cpulimit.c' || echo '$(srcdir)/'`daemon/cpulimit.c + +daemon/cpulimit_test-cpulimit.obj: daemon/cpulimit.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpulimit_test_CFLAGS) $(CFLAGS) -MT daemon/cpulimit_test-cpulimit.obj -MD -MP -MF daemon/$(DEPDIR)/cpulimit_test-cpulimit.Tpo -c -o daemon/cpulimit_test-cpulimit.obj `if test -f 'daemon/cpulimit.c'; then $(CYGPATH_W) 'daemon/cpulimit.c'; else $(CYGPATH_W) '$(srcdir)/daemon/cpulimit.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) daemon/$(DEPDIR)/cpulimit_test-cpulimit.Tpo daemon/$(DEPDIR)/cpulimit_test-cpulimit.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemon/cpulimit.c' object='daemon/cpulimit_test-cpulimit.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpulimit_test_CFLAGS) $(CFLAGS) -c -o daemon/cpulimit_test-cpulimit.obj `if test -f 'daemon/cpulimit.c'; then $(CYGPATH_W) 'daemon/cpulimit.c'; else $(CYGPATH_W) '$(srcdir)/daemon/cpulimit.c'; fi` + +tests/cpulimit_test2-cpulimit-test.o: tests/cpulimit-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpulimit_test2_CFLAGS) $(CFLAGS) -MT tests/cpulimit_test2-cpulimit-test.o -MD -MP -MF tests/$(DEPDIR)/cpulimit_test2-cpulimit-test.Tpo -c -o tests/cpulimit_test2-cpulimit-test.o `test -f 'tests/cpulimit-test.c' || echo '$(srcdir)/'`tests/cpulimit-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/cpulimit_test2-cpulimit-test.Tpo tests/$(DEPDIR)/cpulimit_test2-cpulimit-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/cpulimit-test.c' object='tests/cpulimit_test2-cpulimit-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpulimit_test2_CFLAGS) $(CFLAGS) -c -o tests/cpulimit_test2-cpulimit-test.o `test -f 'tests/cpulimit-test.c' || echo '$(srcdir)/'`tests/cpulimit-test.c + +tests/cpulimit_test2-cpulimit-test.obj: tests/cpulimit-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpulimit_test2_CFLAGS) $(CFLAGS) -MT tests/cpulimit_test2-cpulimit-test.obj -MD -MP -MF tests/$(DEPDIR)/cpulimit_test2-cpulimit-test.Tpo -c -o tests/cpulimit_test2-cpulimit-test.obj `if test -f 'tests/cpulimit-test.c'; then $(CYGPATH_W) 'tests/cpulimit-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/cpulimit-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/cpulimit_test2-cpulimit-test.Tpo tests/$(DEPDIR)/cpulimit_test2-cpulimit-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/cpulimit-test.c' object='tests/cpulimit_test2-cpulimit-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpulimit_test2_CFLAGS) $(CFLAGS) -c -o tests/cpulimit_test2-cpulimit-test.obj `if test -f 'tests/cpulimit-test.c'; then $(CYGPATH_W) 'tests/cpulimit-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/cpulimit-test.c'; fi` + +daemon/cpulimit_test2-cpulimit.o: daemon/cpulimit.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpulimit_test2_CFLAGS) $(CFLAGS) -MT daemon/cpulimit_test2-cpulimit.o -MD -MP -MF daemon/$(DEPDIR)/cpulimit_test2-cpulimit.Tpo -c -o daemon/cpulimit_test2-cpulimit.o `test -f 'daemon/cpulimit.c' || echo '$(srcdir)/'`daemon/cpulimit.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) daemon/$(DEPDIR)/cpulimit_test2-cpulimit.Tpo daemon/$(DEPDIR)/cpulimit_test2-cpulimit.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemon/cpulimit.c' object='daemon/cpulimit_test2-cpulimit.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpulimit_test2_CFLAGS) $(CFLAGS) -c -o daemon/cpulimit_test2-cpulimit.o `test -f 'daemon/cpulimit.c' || echo '$(srcdir)/'`daemon/cpulimit.c + +daemon/cpulimit_test2-cpulimit.obj: daemon/cpulimit.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpulimit_test2_CFLAGS) $(CFLAGS) -MT daemon/cpulimit_test2-cpulimit.obj -MD -MP -MF daemon/$(DEPDIR)/cpulimit_test2-cpulimit.Tpo -c -o daemon/cpulimit_test2-cpulimit.obj `if test -f 'daemon/cpulimit.c'; then $(CYGPATH_W) 'daemon/cpulimit.c'; else $(CYGPATH_W) '$(srcdir)/daemon/cpulimit.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) daemon/$(DEPDIR)/cpulimit_test2-cpulimit.Tpo daemon/$(DEPDIR)/cpulimit_test2-cpulimit.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemon/cpulimit.c' object='daemon/cpulimit_test2-cpulimit.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(cpulimit_test2_CFLAGS) $(CFLAGS) -c -o daemon/cpulimit_test2-cpulimit.obj `if test -f 'daemon/cpulimit.c'; then $(CYGPATH_W) 'daemon/cpulimit.c'; else $(CYGPATH_W) '$(srcdir)/daemon/cpulimit.c'; fi` + +modules/echo-cancel/echo_cancel_test-module-echo-cancel.o: modules/echo-cancel/module-echo-cancel.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(echo_cancel_test_CFLAGS) $(CFLAGS) -MT modules/echo-cancel/echo_cancel_test-module-echo-cancel.o -MD -MP -MF modules/echo-cancel/$(DEPDIR)/echo_cancel_test-module-echo-cancel.Tpo -c -o modules/echo-cancel/echo_cancel_test-module-echo-cancel.o `test -f 'modules/echo-cancel/module-echo-cancel.c' || echo '$(srcdir)/'`modules/echo-cancel/module-echo-cancel.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/echo-cancel/$(DEPDIR)/echo_cancel_test-module-echo-cancel.Tpo modules/echo-cancel/$(DEPDIR)/echo_cancel_test-module-echo-cancel.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/echo-cancel/module-echo-cancel.c' object='modules/echo-cancel/echo_cancel_test-module-echo-cancel.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(echo_cancel_test_CFLAGS) $(CFLAGS) -c -o modules/echo-cancel/echo_cancel_test-module-echo-cancel.o `test -f 'modules/echo-cancel/module-echo-cancel.c' || echo '$(srcdir)/'`modules/echo-cancel/module-echo-cancel.c + +modules/echo-cancel/echo_cancel_test-module-echo-cancel.obj: modules/echo-cancel/module-echo-cancel.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(echo_cancel_test_CFLAGS) $(CFLAGS) -MT modules/echo-cancel/echo_cancel_test-module-echo-cancel.obj -MD -MP -MF modules/echo-cancel/$(DEPDIR)/echo_cancel_test-module-echo-cancel.Tpo -c -o modules/echo-cancel/echo_cancel_test-module-echo-cancel.obj `if test -f 'modules/echo-cancel/module-echo-cancel.c'; then $(CYGPATH_W) 'modules/echo-cancel/module-echo-cancel.c'; else $(CYGPATH_W) '$(srcdir)/modules/echo-cancel/module-echo-cancel.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/echo-cancel/$(DEPDIR)/echo_cancel_test-module-echo-cancel.Tpo modules/echo-cancel/$(DEPDIR)/echo_cancel_test-module-echo-cancel.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/echo-cancel/module-echo-cancel.c' object='modules/echo-cancel/echo_cancel_test-module-echo-cancel.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(echo_cancel_test_CFLAGS) $(CFLAGS) -c -o modules/echo-cancel/echo_cancel_test-module-echo-cancel.obj `if test -f 'modules/echo-cancel/module-echo-cancel.c'; then $(CYGPATH_W) 'modules/echo-cancel/module-echo-cancel.c'; else $(CYGPATH_W) '$(srcdir)/modules/echo-cancel/module-echo-cancel.c'; fi` + +modules/echo-cancel/echo_cancel_test-null.o: modules/echo-cancel/null.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(echo_cancel_test_CFLAGS) $(CFLAGS) -MT modules/echo-cancel/echo_cancel_test-null.o -MD -MP -MF modules/echo-cancel/$(DEPDIR)/echo_cancel_test-null.Tpo -c -o modules/echo-cancel/echo_cancel_test-null.o `test -f 'modules/echo-cancel/null.c' || echo '$(srcdir)/'`modules/echo-cancel/null.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/echo-cancel/$(DEPDIR)/echo_cancel_test-null.Tpo modules/echo-cancel/$(DEPDIR)/echo_cancel_test-null.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/echo-cancel/null.c' object='modules/echo-cancel/echo_cancel_test-null.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(echo_cancel_test_CFLAGS) $(CFLAGS) -c -o modules/echo-cancel/echo_cancel_test-null.o `test -f 'modules/echo-cancel/null.c' || echo '$(srcdir)/'`modules/echo-cancel/null.c + +modules/echo-cancel/echo_cancel_test-null.obj: modules/echo-cancel/null.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(echo_cancel_test_CFLAGS) $(CFLAGS) -MT modules/echo-cancel/echo_cancel_test-null.obj -MD -MP -MF modules/echo-cancel/$(DEPDIR)/echo_cancel_test-null.Tpo -c -o modules/echo-cancel/echo_cancel_test-null.obj `if test -f 'modules/echo-cancel/null.c'; then $(CYGPATH_W) 'modules/echo-cancel/null.c'; else $(CYGPATH_W) '$(srcdir)/modules/echo-cancel/null.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/echo-cancel/$(DEPDIR)/echo_cancel_test-null.Tpo modules/echo-cancel/$(DEPDIR)/echo_cancel_test-null.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/echo-cancel/null.c' object='modules/echo-cancel/echo_cancel_test-null.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(echo_cancel_test_CFLAGS) $(CFLAGS) -c -o modules/echo-cancel/echo_cancel_test-null.obj `if test -f 'modules/echo-cancel/null.c'; then $(CYGPATH_W) 'modules/echo-cancel/null.c'; else $(CYGPATH_W) '$(srcdir)/modules/echo-cancel/null.c'; fi` + +modules/echo-cancel/echo_cancel_test-adrian-aec.o: modules/echo-cancel/adrian-aec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(echo_cancel_test_CFLAGS) $(CFLAGS) -MT modules/echo-cancel/echo_cancel_test-adrian-aec.o -MD -MP -MF modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian-aec.Tpo -c -o modules/echo-cancel/echo_cancel_test-adrian-aec.o `test -f 'modules/echo-cancel/adrian-aec.c' || echo '$(srcdir)/'`modules/echo-cancel/adrian-aec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian-aec.Tpo modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian-aec.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/echo-cancel/adrian-aec.c' object='modules/echo-cancel/echo_cancel_test-adrian-aec.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(echo_cancel_test_CFLAGS) $(CFLAGS) -c -o modules/echo-cancel/echo_cancel_test-adrian-aec.o `test -f 'modules/echo-cancel/adrian-aec.c' || echo '$(srcdir)/'`modules/echo-cancel/adrian-aec.c + +modules/echo-cancel/echo_cancel_test-adrian-aec.obj: modules/echo-cancel/adrian-aec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(echo_cancel_test_CFLAGS) $(CFLAGS) -MT modules/echo-cancel/echo_cancel_test-adrian-aec.obj -MD -MP -MF modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian-aec.Tpo -c -o modules/echo-cancel/echo_cancel_test-adrian-aec.obj `if test -f 'modules/echo-cancel/adrian-aec.c'; then $(CYGPATH_W) 'modules/echo-cancel/adrian-aec.c'; else $(CYGPATH_W) '$(srcdir)/modules/echo-cancel/adrian-aec.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian-aec.Tpo modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian-aec.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/echo-cancel/adrian-aec.c' object='modules/echo-cancel/echo_cancel_test-adrian-aec.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(echo_cancel_test_CFLAGS) $(CFLAGS) -c -o modules/echo-cancel/echo_cancel_test-adrian-aec.obj `if test -f 'modules/echo-cancel/adrian-aec.c'; then $(CYGPATH_W) 'modules/echo-cancel/adrian-aec.c'; else $(CYGPATH_W) '$(srcdir)/modules/echo-cancel/adrian-aec.c'; fi` + +modules/echo-cancel/echo_cancel_test-adrian.o: modules/echo-cancel/adrian.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(echo_cancel_test_CFLAGS) $(CFLAGS) -MT modules/echo-cancel/echo_cancel_test-adrian.o -MD -MP -MF modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian.Tpo -c -o modules/echo-cancel/echo_cancel_test-adrian.o `test -f 'modules/echo-cancel/adrian.c' || echo '$(srcdir)/'`modules/echo-cancel/adrian.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian.Tpo modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/echo-cancel/adrian.c' object='modules/echo-cancel/echo_cancel_test-adrian.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(echo_cancel_test_CFLAGS) $(CFLAGS) -c -o modules/echo-cancel/echo_cancel_test-adrian.o `test -f 'modules/echo-cancel/adrian.c' || echo '$(srcdir)/'`modules/echo-cancel/adrian.c + +modules/echo-cancel/echo_cancel_test-adrian.obj: modules/echo-cancel/adrian.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(echo_cancel_test_CFLAGS) $(CFLAGS) -MT modules/echo-cancel/echo_cancel_test-adrian.obj -MD -MP -MF modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian.Tpo -c -o modules/echo-cancel/echo_cancel_test-adrian.obj `if test -f 'modules/echo-cancel/adrian.c'; then $(CYGPATH_W) 'modules/echo-cancel/adrian.c'; else $(CYGPATH_W) '$(srcdir)/modules/echo-cancel/adrian.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian.Tpo modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/echo-cancel/adrian.c' object='modules/echo-cancel/echo_cancel_test-adrian.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(echo_cancel_test_CFLAGS) $(CFLAGS) -c -o modules/echo-cancel/echo_cancel_test-adrian.obj `if test -f 'modules/echo-cancel/adrian.c'; then $(CYGPATH_W) 'modules/echo-cancel/adrian.c'; else $(CYGPATH_W) '$(srcdir)/modules/echo-cancel/adrian.c'; fi` + +modules/echo-cancel/echo_cancel_test-speex.o: modules/echo-cancel/speex.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(echo_cancel_test_CFLAGS) $(CFLAGS) -MT modules/echo-cancel/echo_cancel_test-speex.o -MD -MP -MF modules/echo-cancel/$(DEPDIR)/echo_cancel_test-speex.Tpo -c -o modules/echo-cancel/echo_cancel_test-speex.o `test -f 'modules/echo-cancel/speex.c' || echo '$(srcdir)/'`modules/echo-cancel/speex.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/echo-cancel/$(DEPDIR)/echo_cancel_test-speex.Tpo modules/echo-cancel/$(DEPDIR)/echo_cancel_test-speex.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/echo-cancel/speex.c' object='modules/echo-cancel/echo_cancel_test-speex.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(echo_cancel_test_CFLAGS) $(CFLAGS) -c -o modules/echo-cancel/echo_cancel_test-speex.o `test -f 'modules/echo-cancel/speex.c' || echo '$(srcdir)/'`modules/echo-cancel/speex.c + +modules/echo-cancel/echo_cancel_test-speex.obj: modules/echo-cancel/speex.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(echo_cancel_test_CFLAGS) $(CFLAGS) -MT modules/echo-cancel/echo_cancel_test-speex.obj -MD -MP -MF modules/echo-cancel/$(DEPDIR)/echo_cancel_test-speex.Tpo -c -o modules/echo-cancel/echo_cancel_test-speex.obj `if test -f 'modules/echo-cancel/speex.c'; then $(CYGPATH_W) 'modules/echo-cancel/speex.c'; else $(CYGPATH_W) '$(srcdir)/modules/echo-cancel/speex.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/echo-cancel/$(DEPDIR)/echo_cancel_test-speex.Tpo modules/echo-cancel/$(DEPDIR)/echo_cancel_test-speex.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/echo-cancel/speex.c' object='modules/echo-cancel/echo_cancel_test-speex.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(echo_cancel_test_CFLAGS) $(CFLAGS) -c -o modules/echo-cancel/echo_cancel_test-speex.obj `if test -f 'modules/echo-cancel/speex.c'; then $(CYGPATH_W) 'modules/echo-cancel/speex.c'; else $(CYGPATH_W) '$(srcdir)/modules/echo-cancel/speex.c'; fi` + +modules/echo-cancel/echo_cancel_test-adrian-aec-orc-gen.o: modules/echo-cancel/adrian-aec-orc-gen.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(echo_cancel_test_CFLAGS) $(CFLAGS) -MT modules/echo-cancel/echo_cancel_test-adrian-aec-orc-gen.o -MD -MP -MF modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian-aec-orc-gen.Tpo -c -o modules/echo-cancel/echo_cancel_test-adrian-aec-orc-gen.o `test -f 'modules/echo-cancel/adrian-aec-orc-gen.c' || echo '$(srcdir)/'`modules/echo-cancel/adrian-aec-orc-gen.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian-aec-orc-gen.Tpo modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian-aec-orc-gen.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/echo-cancel/adrian-aec-orc-gen.c' object='modules/echo-cancel/echo_cancel_test-adrian-aec-orc-gen.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(echo_cancel_test_CFLAGS) $(CFLAGS) -c -o modules/echo-cancel/echo_cancel_test-adrian-aec-orc-gen.o `test -f 'modules/echo-cancel/adrian-aec-orc-gen.c' || echo '$(srcdir)/'`modules/echo-cancel/adrian-aec-orc-gen.c + +modules/echo-cancel/echo_cancel_test-adrian-aec-orc-gen.obj: modules/echo-cancel/adrian-aec-orc-gen.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(echo_cancel_test_CFLAGS) $(CFLAGS) -MT modules/echo-cancel/echo_cancel_test-adrian-aec-orc-gen.obj -MD -MP -MF modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian-aec-orc-gen.Tpo -c -o modules/echo-cancel/echo_cancel_test-adrian-aec-orc-gen.obj `if test -f 'modules/echo-cancel/adrian-aec-orc-gen.c'; then $(CYGPATH_W) 'modules/echo-cancel/adrian-aec-orc-gen.c'; else $(CYGPATH_W) '$(srcdir)/modules/echo-cancel/adrian-aec-orc-gen.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian-aec-orc-gen.Tpo modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian-aec-orc-gen.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/echo-cancel/adrian-aec-orc-gen.c' object='modules/echo-cancel/echo_cancel_test-adrian-aec-orc-gen.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(echo_cancel_test_CFLAGS) $(CFLAGS) -c -o modules/echo-cancel/echo_cancel_test-adrian-aec-orc-gen.obj `if test -f 'modules/echo-cancel/adrian-aec-orc-gen.c'; then $(CYGPATH_W) 'modules/echo-cancel/adrian-aec-orc-gen.c'; else $(CYGPATH_W) '$(srcdir)/modules/echo-cancel/adrian-aec-orc-gen.c'; fi` + +tests/extended_test-extended-test.o: tests/extended-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(extended_test_CFLAGS) $(CFLAGS) -MT tests/extended_test-extended-test.o -MD -MP -MF tests/$(DEPDIR)/extended_test-extended-test.Tpo -c -o tests/extended_test-extended-test.o `test -f 'tests/extended-test.c' || echo '$(srcdir)/'`tests/extended-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/extended_test-extended-test.Tpo tests/$(DEPDIR)/extended_test-extended-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/extended-test.c' object='tests/extended_test-extended-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(extended_test_CFLAGS) $(CFLAGS) -c -o tests/extended_test-extended-test.o `test -f 'tests/extended-test.c' || echo '$(srcdir)/'`tests/extended-test.c + +tests/extended_test-extended-test.obj: tests/extended-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(extended_test_CFLAGS) $(CFLAGS) -MT tests/extended_test-extended-test.obj -MD -MP -MF tests/$(DEPDIR)/extended_test-extended-test.Tpo -c -o tests/extended_test-extended-test.obj `if test -f 'tests/extended-test.c'; then $(CYGPATH_W) 'tests/extended-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/extended-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/extended_test-extended-test.Tpo tests/$(DEPDIR)/extended_test-extended-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/extended-test.c' object='tests/extended_test-extended-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(extended_test_CFLAGS) $(CFLAGS) -c -o tests/extended_test-extended-test.obj `if test -f 'tests/extended-test.c'; then $(CYGPATH_W) 'tests/extended-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/extended-test.c'; fi` + +tests/flist_test-flist-test.o: tests/flist-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(flist_test_CFLAGS) $(CFLAGS) -MT tests/flist_test-flist-test.o -MD -MP -MF tests/$(DEPDIR)/flist_test-flist-test.Tpo -c -o tests/flist_test-flist-test.o `test -f 'tests/flist-test.c' || echo '$(srcdir)/'`tests/flist-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/flist_test-flist-test.Tpo tests/$(DEPDIR)/flist_test-flist-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/flist-test.c' object='tests/flist_test-flist-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(flist_test_CFLAGS) $(CFLAGS) -c -o tests/flist_test-flist-test.o `test -f 'tests/flist-test.c' || echo '$(srcdir)/'`tests/flist-test.c + +tests/flist_test-flist-test.obj: tests/flist-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(flist_test_CFLAGS) $(CFLAGS) -MT tests/flist_test-flist-test.obj -MD -MP -MF tests/$(DEPDIR)/flist_test-flist-test.Tpo -c -o tests/flist_test-flist-test.obj `if test -f 'tests/flist-test.c'; then $(CYGPATH_W) 'tests/flist-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/flist-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/flist_test-flist-test.Tpo tests/$(DEPDIR)/flist_test-flist-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/flist-test.c' object='tests/flist_test-flist-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(flist_test_CFLAGS) $(CFLAGS) -c -o tests/flist_test-flist-test.obj `if test -f 'tests/flist-test.c'; then $(CYGPATH_W) 'tests/flist-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/flist-test.c'; fi` + +tests/format_test-format-test.o: tests/format-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(format_test_CFLAGS) $(CFLAGS) -MT tests/format_test-format-test.o -MD -MP -MF tests/$(DEPDIR)/format_test-format-test.Tpo -c -o tests/format_test-format-test.o `test -f 'tests/format-test.c' || echo '$(srcdir)/'`tests/format-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/format_test-format-test.Tpo tests/$(DEPDIR)/format_test-format-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/format-test.c' object='tests/format_test-format-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(format_test_CFLAGS) $(CFLAGS) -c -o tests/format_test-format-test.o `test -f 'tests/format-test.c' || echo '$(srcdir)/'`tests/format-test.c + +tests/format_test-format-test.obj: tests/format-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(format_test_CFLAGS) $(CFLAGS) -MT tests/format_test-format-test.obj -MD -MP -MF tests/$(DEPDIR)/format_test-format-test.Tpo -c -o tests/format_test-format-test.obj `if test -f 'tests/format-test.c'; then $(CYGPATH_W) 'tests/format-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/format-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/format_test-format-test.Tpo tests/$(DEPDIR)/format_test-format-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/format-test.c' object='tests/format_test-format-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(format_test_CFLAGS) $(CFLAGS) -c -o tests/format_test-format-test.obj `if test -f 'tests/format-test.c'; then $(CYGPATH_W) 'tests/format-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/format-test.c'; fi` + +modules/gconf/gconf_helper-gconf-helper.o: modules/gconf/gconf-helper.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gconf_helper_CFLAGS) $(CFLAGS) -MT modules/gconf/gconf_helper-gconf-helper.o -MD -MP -MF modules/gconf/$(DEPDIR)/gconf_helper-gconf-helper.Tpo -c -o modules/gconf/gconf_helper-gconf-helper.o `test -f 'modules/gconf/gconf-helper.c' || echo '$(srcdir)/'`modules/gconf/gconf-helper.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/gconf/$(DEPDIR)/gconf_helper-gconf-helper.Tpo modules/gconf/$(DEPDIR)/gconf_helper-gconf-helper.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/gconf/gconf-helper.c' object='modules/gconf/gconf_helper-gconf-helper.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gconf_helper_CFLAGS) $(CFLAGS) -c -o modules/gconf/gconf_helper-gconf-helper.o `test -f 'modules/gconf/gconf-helper.c' || echo '$(srcdir)/'`modules/gconf/gconf-helper.c + +modules/gconf/gconf_helper-gconf-helper.obj: modules/gconf/gconf-helper.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gconf_helper_CFLAGS) $(CFLAGS) -MT modules/gconf/gconf_helper-gconf-helper.obj -MD -MP -MF modules/gconf/$(DEPDIR)/gconf_helper-gconf-helper.Tpo -c -o modules/gconf/gconf_helper-gconf-helper.obj `if test -f 'modules/gconf/gconf-helper.c'; then $(CYGPATH_W) 'modules/gconf/gconf-helper.c'; else $(CYGPATH_W) '$(srcdir)/modules/gconf/gconf-helper.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/gconf/$(DEPDIR)/gconf_helper-gconf-helper.Tpo modules/gconf/$(DEPDIR)/gconf_helper-gconf-helper.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/gconf/gconf-helper.c' object='modules/gconf/gconf_helper-gconf-helper.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gconf_helper_CFLAGS) $(CFLAGS) -c -o modules/gconf/gconf_helper-gconf-helper.obj `if test -f 'modules/gconf/gconf-helper.c'; then $(CYGPATH_W) 'modules/gconf/gconf-helper.c'; else $(CYGPATH_W) '$(srcdir)/modules/gconf/gconf-helper.c'; fi` + +tests/get_binary_name_test-get-binary-name-test.o: tests/get-binary-name-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(get_binary_name_test_CFLAGS) $(CFLAGS) -MT tests/get_binary_name_test-get-binary-name-test.o -MD -MP -MF tests/$(DEPDIR)/get_binary_name_test-get-binary-name-test.Tpo -c -o tests/get_binary_name_test-get-binary-name-test.o `test -f 'tests/get-binary-name-test.c' || echo '$(srcdir)/'`tests/get-binary-name-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/get_binary_name_test-get-binary-name-test.Tpo tests/$(DEPDIR)/get_binary_name_test-get-binary-name-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/get-binary-name-test.c' object='tests/get_binary_name_test-get-binary-name-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(get_binary_name_test_CFLAGS) $(CFLAGS) -c -o tests/get_binary_name_test-get-binary-name-test.o `test -f 'tests/get-binary-name-test.c' || echo '$(srcdir)/'`tests/get-binary-name-test.c + +tests/get_binary_name_test-get-binary-name-test.obj: tests/get-binary-name-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(get_binary_name_test_CFLAGS) $(CFLAGS) -MT tests/get_binary_name_test-get-binary-name-test.obj -MD -MP -MF tests/$(DEPDIR)/get_binary_name_test-get-binary-name-test.Tpo -c -o tests/get_binary_name_test-get-binary-name-test.obj `if test -f 'tests/get-binary-name-test.c'; then $(CYGPATH_W) 'tests/get-binary-name-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/get-binary-name-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/get_binary_name_test-get-binary-name-test.Tpo tests/$(DEPDIR)/get_binary_name_test-get-binary-name-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/get-binary-name-test.c' object='tests/get_binary_name_test-get-binary-name-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(get_binary_name_test_CFLAGS) $(CFLAGS) -c -o tests/get_binary_name_test-get-binary-name-test.obj `if test -f 'tests/get-binary-name-test.c'; then $(CYGPATH_W) 'tests/get-binary-name-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/get-binary-name-test.c'; fi` + +modules/gsettings/gsettings_helper-gsettings-helper.o: modules/gsettings/gsettings-helper.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsettings_helper_CFLAGS) $(CFLAGS) -MT modules/gsettings/gsettings_helper-gsettings-helper.o -MD -MP -MF modules/gsettings/$(DEPDIR)/gsettings_helper-gsettings-helper.Tpo -c -o modules/gsettings/gsettings_helper-gsettings-helper.o `test -f 'modules/gsettings/gsettings-helper.c' || echo '$(srcdir)/'`modules/gsettings/gsettings-helper.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/gsettings/$(DEPDIR)/gsettings_helper-gsettings-helper.Tpo modules/gsettings/$(DEPDIR)/gsettings_helper-gsettings-helper.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/gsettings/gsettings-helper.c' object='modules/gsettings/gsettings_helper-gsettings-helper.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsettings_helper_CFLAGS) $(CFLAGS) -c -o modules/gsettings/gsettings_helper-gsettings-helper.o `test -f 'modules/gsettings/gsettings-helper.c' || echo '$(srcdir)/'`modules/gsettings/gsettings-helper.c + +modules/gsettings/gsettings_helper-gsettings-helper.obj: modules/gsettings/gsettings-helper.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsettings_helper_CFLAGS) $(CFLAGS) -MT modules/gsettings/gsettings_helper-gsettings-helper.obj -MD -MP -MF modules/gsettings/$(DEPDIR)/gsettings_helper-gsettings-helper.Tpo -c -o modules/gsettings/gsettings_helper-gsettings-helper.obj `if test -f 'modules/gsettings/gsettings-helper.c'; then $(CYGPATH_W) 'modules/gsettings/gsettings-helper.c'; else $(CYGPATH_W) '$(srcdir)/modules/gsettings/gsettings-helper.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/gsettings/$(DEPDIR)/gsettings_helper-gsettings-helper.Tpo modules/gsettings/$(DEPDIR)/gsettings_helper-gsettings-helper.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/gsettings/gsettings-helper.c' object='modules/gsettings/gsettings_helper-gsettings-helper.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gsettings_helper_CFLAGS) $(CFLAGS) -c -o modules/gsettings/gsettings_helper-gsettings-helper.obj `if test -f 'modules/gsettings/gsettings-helper.c'; then $(CYGPATH_W) 'modules/gsettings/gsettings-helper.c'; else $(CYGPATH_W) '$(srcdir)/modules/gsettings/gsettings-helper.c'; fi` + +tests/gtk_test-gtk-test.o: tests/gtk-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtk_test_CFLAGS) $(CFLAGS) -MT tests/gtk_test-gtk-test.o -MD -MP -MF tests/$(DEPDIR)/gtk_test-gtk-test.Tpo -c -o tests/gtk_test-gtk-test.o `test -f 'tests/gtk-test.c' || echo '$(srcdir)/'`tests/gtk-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/gtk_test-gtk-test.Tpo tests/$(DEPDIR)/gtk_test-gtk-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/gtk-test.c' object='tests/gtk_test-gtk-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtk_test_CFLAGS) $(CFLAGS) -c -o tests/gtk_test-gtk-test.o `test -f 'tests/gtk-test.c' || echo '$(srcdir)/'`tests/gtk-test.c + +tests/gtk_test-gtk-test.obj: tests/gtk-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtk_test_CFLAGS) $(CFLAGS) -MT tests/gtk_test-gtk-test.obj -MD -MP -MF tests/$(DEPDIR)/gtk_test-gtk-test.Tpo -c -o tests/gtk_test-gtk-test.obj `if test -f 'tests/gtk-test.c'; then $(CYGPATH_W) 'tests/gtk-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/gtk-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/gtk_test-gtk-test.Tpo tests/$(DEPDIR)/gtk_test-gtk-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/gtk-test.c' object='tests/gtk_test-gtk-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtk_test_CFLAGS) $(CFLAGS) -c -o tests/gtk_test-gtk-test.obj `if test -f 'tests/gtk-test.c'; then $(CYGPATH_W) 'tests/gtk-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/gtk-test.c'; fi` + +tests/hashmap_test-hashmap-test.o: tests/hashmap-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hashmap_test_CFLAGS) $(CFLAGS) -MT tests/hashmap_test-hashmap-test.o -MD -MP -MF tests/$(DEPDIR)/hashmap_test-hashmap-test.Tpo -c -o tests/hashmap_test-hashmap-test.o `test -f 'tests/hashmap-test.c' || echo '$(srcdir)/'`tests/hashmap-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/hashmap_test-hashmap-test.Tpo tests/$(DEPDIR)/hashmap_test-hashmap-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/hashmap-test.c' object='tests/hashmap_test-hashmap-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hashmap_test_CFLAGS) $(CFLAGS) -c -o tests/hashmap_test-hashmap-test.o `test -f 'tests/hashmap-test.c' || echo '$(srcdir)/'`tests/hashmap-test.c + +tests/hashmap_test-hashmap-test.obj: tests/hashmap-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hashmap_test_CFLAGS) $(CFLAGS) -MT tests/hashmap_test-hashmap-test.obj -MD -MP -MF tests/$(DEPDIR)/hashmap_test-hashmap-test.Tpo -c -o tests/hashmap_test-hashmap-test.obj `if test -f 'tests/hashmap-test.c'; then $(CYGPATH_W) 'tests/hashmap-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/hashmap-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/hashmap_test-hashmap-test.Tpo tests/$(DEPDIR)/hashmap_test-hashmap-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/hashmap-test.c' object='tests/hashmap_test-hashmap-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hashmap_test_CFLAGS) $(CFLAGS) -c -o tests/hashmap_test-hashmap-test.obj `if test -f 'tests/hashmap-test.c'; then $(CYGPATH_W) 'tests/hashmap-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/hashmap-test.c'; fi` + +tests/hook_list_test-hook-list-test.o: tests/hook-list-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hook_list_test_CFLAGS) $(CFLAGS) -MT tests/hook_list_test-hook-list-test.o -MD -MP -MF tests/$(DEPDIR)/hook_list_test-hook-list-test.Tpo -c -o tests/hook_list_test-hook-list-test.o `test -f 'tests/hook-list-test.c' || echo '$(srcdir)/'`tests/hook-list-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/hook_list_test-hook-list-test.Tpo tests/$(DEPDIR)/hook_list_test-hook-list-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/hook-list-test.c' object='tests/hook_list_test-hook-list-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hook_list_test_CFLAGS) $(CFLAGS) -c -o tests/hook_list_test-hook-list-test.o `test -f 'tests/hook-list-test.c' || echo '$(srcdir)/'`tests/hook-list-test.c + +tests/hook_list_test-hook-list-test.obj: tests/hook-list-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hook_list_test_CFLAGS) $(CFLAGS) -MT tests/hook_list_test-hook-list-test.obj -MD -MP -MF tests/$(DEPDIR)/hook_list_test-hook-list-test.Tpo -c -o tests/hook_list_test-hook-list-test.obj `if test -f 'tests/hook-list-test.c'; then $(CYGPATH_W) 'tests/hook-list-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/hook-list-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/hook_list_test-hook-list-test.Tpo tests/$(DEPDIR)/hook_list_test-hook-list-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/hook-list-test.c' object='tests/hook_list_test-hook-list-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(hook_list_test_CFLAGS) $(CFLAGS) -c -o tests/hook_list_test-hook-list-test.obj `if test -f 'tests/hook-list-test.c'; then $(CYGPATH_W) 'tests/hook-list-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/hook-list-test.c'; fi` + +tests/interpol_test-interpol-test.o: tests/interpol-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(interpol_test_CFLAGS) $(CFLAGS) -MT tests/interpol_test-interpol-test.o -MD -MP -MF tests/$(DEPDIR)/interpol_test-interpol-test.Tpo -c -o tests/interpol_test-interpol-test.o `test -f 'tests/interpol-test.c' || echo '$(srcdir)/'`tests/interpol-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/interpol_test-interpol-test.Tpo tests/$(DEPDIR)/interpol_test-interpol-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/interpol-test.c' object='tests/interpol_test-interpol-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(interpol_test_CFLAGS) $(CFLAGS) -c -o tests/interpol_test-interpol-test.o `test -f 'tests/interpol-test.c' || echo '$(srcdir)/'`tests/interpol-test.c + +tests/interpol_test-interpol-test.obj: tests/interpol-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(interpol_test_CFLAGS) $(CFLAGS) -MT tests/interpol_test-interpol-test.obj -MD -MP -MF tests/$(DEPDIR)/interpol_test-interpol-test.Tpo -c -o tests/interpol_test-interpol-test.obj `if test -f 'tests/interpol-test.c'; then $(CYGPATH_W) 'tests/interpol-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/interpol-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/interpol_test-interpol-test.Tpo tests/$(DEPDIR)/interpol_test-interpol-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/interpol-test.c' object='tests/interpol_test-interpol-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(interpol_test_CFLAGS) $(CFLAGS) -c -o tests/interpol_test-interpol-test.obj `if test -f 'tests/interpol-test.c'; then $(CYGPATH_W) 'tests/interpol-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/interpol-test.c'; fi` + +tests/ipacl_test-ipacl-test.o: tests/ipacl-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ipacl_test_CFLAGS) $(CFLAGS) -MT tests/ipacl_test-ipacl-test.o -MD -MP -MF tests/$(DEPDIR)/ipacl_test-ipacl-test.Tpo -c -o tests/ipacl_test-ipacl-test.o `test -f 'tests/ipacl-test.c' || echo '$(srcdir)/'`tests/ipacl-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/ipacl_test-ipacl-test.Tpo tests/$(DEPDIR)/ipacl_test-ipacl-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/ipacl-test.c' object='tests/ipacl_test-ipacl-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ipacl_test_CFLAGS) $(CFLAGS) -c -o tests/ipacl_test-ipacl-test.o `test -f 'tests/ipacl-test.c' || echo '$(srcdir)/'`tests/ipacl-test.c + +tests/ipacl_test-ipacl-test.obj: tests/ipacl-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ipacl_test_CFLAGS) $(CFLAGS) -MT tests/ipacl_test-ipacl-test.obj -MD -MP -MF tests/$(DEPDIR)/ipacl_test-ipacl-test.Tpo -c -o tests/ipacl_test-ipacl-test.obj `if test -f 'tests/ipacl-test.c'; then $(CYGPATH_W) 'tests/ipacl-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/ipacl-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/ipacl_test-ipacl-test.Tpo tests/$(DEPDIR)/ipacl_test-ipacl-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/ipacl-test.c' object='tests/ipacl_test-ipacl-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ipacl_test_CFLAGS) $(CFLAGS) -c -o tests/ipacl_test-ipacl-test.obj `if test -f 'tests/ipacl-test.c'; then $(CYGPATH_W) 'tests/ipacl-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/ipacl-test.c'; fi` + +tests/json_test-json-test.o: tests/json-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(json_test_CFLAGS) $(CFLAGS) -MT tests/json_test-json-test.o -MD -MP -MF tests/$(DEPDIR)/json_test-json-test.Tpo -c -o tests/json_test-json-test.o `test -f 'tests/json-test.c' || echo '$(srcdir)/'`tests/json-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/json_test-json-test.Tpo tests/$(DEPDIR)/json_test-json-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/json-test.c' object='tests/json_test-json-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(json_test_CFLAGS) $(CFLAGS) -c -o tests/json_test-json-test.o `test -f 'tests/json-test.c' || echo '$(srcdir)/'`tests/json-test.c + +tests/json_test-json-test.obj: tests/json-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(json_test_CFLAGS) $(CFLAGS) -MT tests/json_test-json-test.obj -MD -MP -MF tests/$(DEPDIR)/json_test-json-test.Tpo -c -o tests/json_test-json-test.obj `if test -f 'tests/json-test.c'; then $(CYGPATH_W) 'tests/json-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/json-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/json_test-json-test.Tpo tests/$(DEPDIR)/json_test-json-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/json-test.c' object='tests/json_test-json-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(json_test_CFLAGS) $(CFLAGS) -c -o tests/json_test-json-test.obj `if test -f 'tests/json-test.c'; then $(CYGPATH_W) 'tests/json-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/json-test.c'; fi` + +tests/lfe_filter_test-lfe-filter-test.o: tests/lfe-filter-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lfe_filter_test_CFLAGS) $(CFLAGS) -MT tests/lfe_filter_test-lfe-filter-test.o -MD -MP -MF tests/$(DEPDIR)/lfe_filter_test-lfe-filter-test.Tpo -c -o tests/lfe_filter_test-lfe-filter-test.o `test -f 'tests/lfe-filter-test.c' || echo '$(srcdir)/'`tests/lfe-filter-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/lfe_filter_test-lfe-filter-test.Tpo tests/$(DEPDIR)/lfe_filter_test-lfe-filter-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/lfe-filter-test.c' object='tests/lfe_filter_test-lfe-filter-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lfe_filter_test_CFLAGS) $(CFLAGS) -c -o tests/lfe_filter_test-lfe-filter-test.o `test -f 'tests/lfe-filter-test.c' || echo '$(srcdir)/'`tests/lfe-filter-test.c + +tests/lfe_filter_test-lfe-filter-test.obj: tests/lfe-filter-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lfe_filter_test_CFLAGS) $(CFLAGS) -MT tests/lfe_filter_test-lfe-filter-test.obj -MD -MP -MF tests/$(DEPDIR)/lfe_filter_test-lfe-filter-test.Tpo -c -o tests/lfe_filter_test-lfe-filter-test.obj `if test -f 'tests/lfe-filter-test.c'; then $(CYGPATH_W) 'tests/lfe-filter-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/lfe-filter-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/lfe_filter_test-lfe-filter-test.Tpo tests/$(DEPDIR)/lfe_filter_test-lfe-filter-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/lfe-filter-test.c' object='tests/lfe_filter_test-lfe-filter-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lfe_filter_test_CFLAGS) $(CFLAGS) -c -o tests/lfe_filter_test-lfe-filter-test.obj `if test -f 'tests/lfe-filter-test.c'; then $(CYGPATH_W) 'tests/lfe-filter-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/lfe-filter-test.c'; fi` + +tests/lo_latency_test-lo-latency-test.o: tests/lo-latency-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lo_latency_test_CFLAGS) $(CFLAGS) -MT tests/lo_latency_test-lo-latency-test.o -MD -MP -MF tests/$(DEPDIR)/lo_latency_test-lo-latency-test.Tpo -c -o tests/lo_latency_test-lo-latency-test.o `test -f 'tests/lo-latency-test.c' || echo '$(srcdir)/'`tests/lo-latency-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/lo_latency_test-lo-latency-test.Tpo tests/$(DEPDIR)/lo_latency_test-lo-latency-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/lo-latency-test.c' object='tests/lo_latency_test-lo-latency-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lo_latency_test_CFLAGS) $(CFLAGS) -c -o tests/lo_latency_test-lo-latency-test.o `test -f 'tests/lo-latency-test.c' || echo '$(srcdir)/'`tests/lo-latency-test.c + +tests/lo_latency_test-lo-latency-test.obj: tests/lo-latency-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lo_latency_test_CFLAGS) $(CFLAGS) -MT tests/lo_latency_test-lo-latency-test.obj -MD -MP -MF tests/$(DEPDIR)/lo_latency_test-lo-latency-test.Tpo -c -o tests/lo_latency_test-lo-latency-test.obj `if test -f 'tests/lo-latency-test.c'; then $(CYGPATH_W) 'tests/lo-latency-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/lo-latency-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/lo_latency_test-lo-latency-test.Tpo tests/$(DEPDIR)/lo_latency_test-lo-latency-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/lo-latency-test.c' object='tests/lo_latency_test-lo-latency-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lo_latency_test_CFLAGS) $(CFLAGS) -c -o tests/lo_latency_test-lo-latency-test.obj `if test -f 'tests/lo-latency-test.c'; then $(CYGPATH_W) 'tests/lo-latency-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/lo-latency-test.c'; fi` + +tests/lock_autospawn_test-lock-autospawn-test.o: tests/lock-autospawn-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lock_autospawn_test_CFLAGS) $(CFLAGS) -MT tests/lock_autospawn_test-lock-autospawn-test.o -MD -MP -MF tests/$(DEPDIR)/lock_autospawn_test-lock-autospawn-test.Tpo -c -o tests/lock_autospawn_test-lock-autospawn-test.o `test -f 'tests/lock-autospawn-test.c' || echo '$(srcdir)/'`tests/lock-autospawn-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/lock_autospawn_test-lock-autospawn-test.Tpo tests/$(DEPDIR)/lock_autospawn_test-lock-autospawn-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/lock-autospawn-test.c' object='tests/lock_autospawn_test-lock-autospawn-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lock_autospawn_test_CFLAGS) $(CFLAGS) -c -o tests/lock_autospawn_test-lock-autospawn-test.o `test -f 'tests/lock-autospawn-test.c' || echo '$(srcdir)/'`tests/lock-autospawn-test.c + +tests/lock_autospawn_test-lock-autospawn-test.obj: tests/lock-autospawn-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lock_autospawn_test_CFLAGS) $(CFLAGS) -MT tests/lock_autospawn_test-lock-autospawn-test.obj -MD -MP -MF tests/$(DEPDIR)/lock_autospawn_test-lock-autospawn-test.Tpo -c -o tests/lock_autospawn_test-lock-autospawn-test.obj `if test -f 'tests/lock-autospawn-test.c'; then $(CYGPATH_W) 'tests/lock-autospawn-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/lock-autospawn-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/lock_autospawn_test-lock-autospawn-test.Tpo tests/$(DEPDIR)/lock_autospawn_test-lock-autospawn-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/lock-autospawn-test.c' object='tests/lock_autospawn_test-lock-autospawn-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lock_autospawn_test_CFLAGS) $(CFLAGS) -c -o tests/lock_autospawn_test-lock-autospawn-test.obj `if test -f 'tests/lock-autospawn-test.c'; then $(CYGPATH_W) 'tests/lock-autospawn-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/lock-autospawn-test.c'; fi` + +tests/mainloop_test-mainloop-test.o: tests/mainloop-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mainloop_test_CFLAGS) $(CFLAGS) -MT tests/mainloop_test-mainloop-test.o -MD -MP -MF tests/$(DEPDIR)/mainloop_test-mainloop-test.Tpo -c -o tests/mainloop_test-mainloop-test.o `test -f 'tests/mainloop-test.c' || echo '$(srcdir)/'`tests/mainloop-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/mainloop_test-mainloop-test.Tpo tests/$(DEPDIR)/mainloop_test-mainloop-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/mainloop-test.c' object='tests/mainloop_test-mainloop-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mainloop_test_CFLAGS) $(CFLAGS) -c -o tests/mainloop_test-mainloop-test.o `test -f 'tests/mainloop-test.c' || echo '$(srcdir)/'`tests/mainloop-test.c + +tests/mainloop_test-mainloop-test.obj: tests/mainloop-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mainloop_test_CFLAGS) $(CFLAGS) -MT tests/mainloop_test-mainloop-test.obj -MD -MP -MF tests/$(DEPDIR)/mainloop_test-mainloop-test.Tpo -c -o tests/mainloop_test-mainloop-test.obj `if test -f 'tests/mainloop-test.c'; then $(CYGPATH_W) 'tests/mainloop-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/mainloop-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/mainloop_test-mainloop-test.Tpo tests/$(DEPDIR)/mainloop_test-mainloop-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/mainloop-test.c' object='tests/mainloop_test-mainloop-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mainloop_test_CFLAGS) $(CFLAGS) -c -o tests/mainloop_test-mainloop-test.obj `if test -f 'tests/mainloop-test.c'; then $(CYGPATH_W) 'tests/mainloop-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/mainloop-test.c'; fi` + +tests/mainloop_test_glib-mainloop-test.o: tests/mainloop-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mainloop_test_glib_CFLAGS) $(CFLAGS) -MT tests/mainloop_test_glib-mainloop-test.o -MD -MP -MF tests/$(DEPDIR)/mainloop_test_glib-mainloop-test.Tpo -c -o tests/mainloop_test_glib-mainloop-test.o `test -f 'tests/mainloop-test.c' || echo '$(srcdir)/'`tests/mainloop-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/mainloop_test_glib-mainloop-test.Tpo tests/$(DEPDIR)/mainloop_test_glib-mainloop-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/mainloop-test.c' object='tests/mainloop_test_glib-mainloop-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mainloop_test_glib_CFLAGS) $(CFLAGS) -c -o tests/mainloop_test_glib-mainloop-test.o `test -f 'tests/mainloop-test.c' || echo '$(srcdir)/'`tests/mainloop-test.c + +tests/mainloop_test_glib-mainloop-test.obj: tests/mainloop-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mainloop_test_glib_CFLAGS) $(CFLAGS) -MT tests/mainloop_test_glib-mainloop-test.obj -MD -MP -MF tests/$(DEPDIR)/mainloop_test_glib-mainloop-test.Tpo -c -o tests/mainloop_test_glib-mainloop-test.obj `if test -f 'tests/mainloop-test.c'; then $(CYGPATH_W) 'tests/mainloop-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/mainloop-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/mainloop_test_glib-mainloop-test.Tpo tests/$(DEPDIR)/mainloop_test_glib-mainloop-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/mainloop-test.c' object='tests/mainloop_test_glib-mainloop-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mainloop_test_glib_CFLAGS) $(CFLAGS) -c -o tests/mainloop_test_glib-mainloop-test.obj `if test -f 'tests/mainloop-test.c'; then $(CYGPATH_W) 'tests/mainloop-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/mainloop-test.c'; fi` + +tests/mcalign_test-mcalign-test.o: tests/mcalign-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mcalign_test_CFLAGS) $(CFLAGS) -MT tests/mcalign_test-mcalign-test.o -MD -MP -MF tests/$(DEPDIR)/mcalign_test-mcalign-test.Tpo -c -o tests/mcalign_test-mcalign-test.o `test -f 'tests/mcalign-test.c' || echo '$(srcdir)/'`tests/mcalign-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/mcalign_test-mcalign-test.Tpo tests/$(DEPDIR)/mcalign_test-mcalign-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/mcalign-test.c' object='tests/mcalign_test-mcalign-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mcalign_test_CFLAGS) $(CFLAGS) -c -o tests/mcalign_test-mcalign-test.o `test -f 'tests/mcalign-test.c' || echo '$(srcdir)/'`tests/mcalign-test.c + +tests/mcalign_test-mcalign-test.obj: tests/mcalign-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mcalign_test_CFLAGS) $(CFLAGS) -MT tests/mcalign_test-mcalign-test.obj -MD -MP -MF tests/$(DEPDIR)/mcalign_test-mcalign-test.Tpo -c -o tests/mcalign_test-mcalign-test.obj `if test -f 'tests/mcalign-test.c'; then $(CYGPATH_W) 'tests/mcalign-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/mcalign-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/mcalign_test-mcalign-test.Tpo tests/$(DEPDIR)/mcalign_test-mcalign-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/mcalign-test.c' object='tests/mcalign_test-mcalign-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mcalign_test_CFLAGS) $(CFLAGS) -c -o tests/mcalign_test-mcalign-test.obj `if test -f 'tests/mcalign-test.c'; then $(CYGPATH_W) 'tests/mcalign-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/mcalign-test.c'; fi` + +tests/memblock_test-memblock-test.o: tests/memblock-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(memblock_test_CFLAGS) $(CFLAGS) -MT tests/memblock_test-memblock-test.o -MD -MP -MF tests/$(DEPDIR)/memblock_test-memblock-test.Tpo -c -o tests/memblock_test-memblock-test.o `test -f 'tests/memblock-test.c' || echo '$(srcdir)/'`tests/memblock-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/memblock_test-memblock-test.Tpo tests/$(DEPDIR)/memblock_test-memblock-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/memblock-test.c' object='tests/memblock_test-memblock-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(memblock_test_CFLAGS) $(CFLAGS) -c -o tests/memblock_test-memblock-test.o `test -f 'tests/memblock-test.c' || echo '$(srcdir)/'`tests/memblock-test.c + +tests/memblock_test-memblock-test.obj: tests/memblock-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(memblock_test_CFLAGS) $(CFLAGS) -MT tests/memblock_test-memblock-test.obj -MD -MP -MF tests/$(DEPDIR)/memblock_test-memblock-test.Tpo -c -o tests/memblock_test-memblock-test.obj `if test -f 'tests/memblock-test.c'; then $(CYGPATH_W) 'tests/memblock-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/memblock-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/memblock_test-memblock-test.Tpo tests/$(DEPDIR)/memblock_test-memblock-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/memblock-test.c' object='tests/memblock_test-memblock-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(memblock_test_CFLAGS) $(CFLAGS) -c -o tests/memblock_test-memblock-test.obj `if test -f 'tests/memblock-test.c'; then $(CYGPATH_W) 'tests/memblock-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/memblock-test.c'; fi` + +tests/memblockq_test-memblockq-test.o: tests/memblockq-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(memblockq_test_CFLAGS) $(CFLAGS) -MT tests/memblockq_test-memblockq-test.o -MD -MP -MF tests/$(DEPDIR)/memblockq_test-memblockq-test.Tpo -c -o tests/memblockq_test-memblockq-test.o `test -f 'tests/memblockq-test.c' || echo '$(srcdir)/'`tests/memblockq-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/memblockq_test-memblockq-test.Tpo tests/$(DEPDIR)/memblockq_test-memblockq-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/memblockq-test.c' object='tests/memblockq_test-memblockq-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(memblockq_test_CFLAGS) $(CFLAGS) -c -o tests/memblockq_test-memblockq-test.o `test -f 'tests/memblockq-test.c' || echo '$(srcdir)/'`tests/memblockq-test.c + +tests/memblockq_test-memblockq-test.obj: tests/memblockq-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(memblockq_test_CFLAGS) $(CFLAGS) -MT tests/memblockq_test-memblockq-test.obj -MD -MP -MF tests/$(DEPDIR)/memblockq_test-memblockq-test.Tpo -c -o tests/memblockq_test-memblockq-test.obj `if test -f 'tests/memblockq-test.c'; then $(CYGPATH_W) 'tests/memblockq-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/memblockq-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/memblockq_test-memblockq-test.Tpo tests/$(DEPDIR)/memblockq_test-memblockq-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/memblockq-test.c' object='tests/memblockq_test-memblockq-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(memblockq_test_CFLAGS) $(CFLAGS) -c -o tests/memblockq_test-memblockq-test.obj `if test -f 'tests/memblockq-test.c'; then $(CYGPATH_W) 'tests/memblockq-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/memblockq-test.c'; fi` + +tests/mix_test-mix-test.o: tests/mix-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mix_test_CFLAGS) $(CFLAGS) -MT tests/mix_test-mix-test.o -MD -MP -MF tests/$(DEPDIR)/mix_test-mix-test.Tpo -c -o tests/mix_test-mix-test.o `test -f 'tests/mix-test.c' || echo '$(srcdir)/'`tests/mix-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/mix_test-mix-test.Tpo tests/$(DEPDIR)/mix_test-mix-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/mix-test.c' object='tests/mix_test-mix-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mix_test_CFLAGS) $(CFLAGS) -c -o tests/mix_test-mix-test.o `test -f 'tests/mix-test.c' || echo '$(srcdir)/'`tests/mix-test.c + +tests/mix_test-mix-test.obj: tests/mix-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mix_test_CFLAGS) $(CFLAGS) -MT tests/mix_test-mix-test.obj -MD -MP -MF tests/$(DEPDIR)/mix_test-mix-test.Tpo -c -o tests/mix_test-mix-test.obj `if test -f 'tests/mix-test.c'; then $(CYGPATH_W) 'tests/mix-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/mix-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/mix_test-mix-test.Tpo tests/$(DEPDIR)/mix_test-mix-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/mix-test.c' object='tests/mix_test-mix-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mix_test_CFLAGS) $(CFLAGS) -c -o tests/mix_test-mix-test.obj `if test -f 'tests/mix-test.c'; then $(CYGPATH_W) 'tests/mix-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/mix-test.c'; fi` + +tests/mult_s16_test-mult-s16-test.o: tests/mult-s16-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mult_s16_test_CFLAGS) $(CFLAGS) -MT tests/mult_s16_test-mult-s16-test.o -MD -MP -MF tests/$(DEPDIR)/mult_s16_test-mult-s16-test.Tpo -c -o tests/mult_s16_test-mult-s16-test.o `test -f 'tests/mult-s16-test.c' || echo '$(srcdir)/'`tests/mult-s16-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/mult_s16_test-mult-s16-test.Tpo tests/$(DEPDIR)/mult_s16_test-mult-s16-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/mult-s16-test.c' object='tests/mult_s16_test-mult-s16-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mult_s16_test_CFLAGS) $(CFLAGS) -c -o tests/mult_s16_test-mult-s16-test.o `test -f 'tests/mult-s16-test.c' || echo '$(srcdir)/'`tests/mult-s16-test.c + +tests/mult_s16_test-mult-s16-test.obj: tests/mult-s16-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mult_s16_test_CFLAGS) $(CFLAGS) -MT tests/mult_s16_test-mult-s16-test.obj -MD -MP -MF tests/$(DEPDIR)/mult_s16_test-mult-s16-test.Tpo -c -o tests/mult_s16_test-mult-s16-test.obj `if test -f 'tests/mult-s16-test.c'; then $(CYGPATH_W) 'tests/mult-s16-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/mult-s16-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/mult_s16_test-mult-s16-test.Tpo tests/$(DEPDIR)/mult_s16_test-mult-s16-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/mult-s16-test.c' object='tests/mult_s16_test-mult-s16-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(mult_s16_test_CFLAGS) $(CFLAGS) -c -o tests/mult_s16_test-mult-s16-test.obj `if test -f 'tests/mult-s16-test.c'; then $(CYGPATH_W) 'tests/mult-s16-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/mult-s16-test.c'; fi` + +tests/once_test-once-test.o: tests/once-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(once_test_CFLAGS) $(CFLAGS) -MT tests/once_test-once-test.o -MD -MP -MF tests/$(DEPDIR)/once_test-once-test.Tpo -c -o tests/once_test-once-test.o `test -f 'tests/once-test.c' || echo '$(srcdir)/'`tests/once-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/once_test-once-test.Tpo tests/$(DEPDIR)/once_test-once-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/once-test.c' object='tests/once_test-once-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(once_test_CFLAGS) $(CFLAGS) -c -o tests/once_test-once-test.o `test -f 'tests/once-test.c' || echo '$(srcdir)/'`tests/once-test.c + +tests/once_test-once-test.obj: tests/once-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(once_test_CFLAGS) $(CFLAGS) -MT tests/once_test-once-test.obj -MD -MP -MF tests/$(DEPDIR)/once_test-once-test.Tpo -c -o tests/once_test-once-test.obj `if test -f 'tests/once-test.c'; then $(CYGPATH_W) 'tests/once-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/once-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/once_test-once-test.Tpo tests/$(DEPDIR)/once_test-once-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/once-test.c' object='tests/once_test-once-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(once_test_CFLAGS) $(CFLAGS) -c -o tests/once_test-once-test.obj `if test -f 'tests/once-test.c'; then $(CYGPATH_W) 'tests/once-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/once-test.c'; fi` + +utils/pacat-pacat.o: utils/pacat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pacat_CFLAGS) $(CFLAGS) -MT utils/pacat-pacat.o -MD -MP -MF utils/$(DEPDIR)/pacat-pacat.Tpo -c -o utils/pacat-pacat.o `test -f 'utils/pacat.c' || echo '$(srcdir)/'`utils/pacat.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) utils/$(DEPDIR)/pacat-pacat.Tpo utils/$(DEPDIR)/pacat-pacat.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils/pacat.c' object='utils/pacat-pacat.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pacat_CFLAGS) $(CFLAGS) -c -o utils/pacat-pacat.o `test -f 'utils/pacat.c' || echo '$(srcdir)/'`utils/pacat.c + +utils/pacat-pacat.obj: utils/pacat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pacat_CFLAGS) $(CFLAGS) -MT utils/pacat-pacat.obj -MD -MP -MF utils/$(DEPDIR)/pacat-pacat.Tpo -c -o utils/pacat-pacat.obj `if test -f 'utils/pacat.c'; then $(CYGPATH_W) 'utils/pacat.c'; else $(CYGPATH_W) '$(srcdir)/utils/pacat.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) utils/$(DEPDIR)/pacat-pacat.Tpo utils/$(DEPDIR)/pacat-pacat.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils/pacat.c' object='utils/pacat-pacat.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pacat_CFLAGS) $(CFLAGS) -c -o utils/pacat-pacat.obj `if test -f 'utils/pacat.c'; then $(CYGPATH_W) 'utils/pacat.c'; else $(CYGPATH_W) '$(srcdir)/utils/pacat.c'; fi` + +tests/pacat_simple-pacat-simple.o: tests/pacat-simple.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pacat_simple_CFLAGS) $(CFLAGS) -MT tests/pacat_simple-pacat-simple.o -MD -MP -MF tests/$(DEPDIR)/pacat_simple-pacat-simple.Tpo -c -o tests/pacat_simple-pacat-simple.o `test -f 'tests/pacat-simple.c' || echo '$(srcdir)/'`tests/pacat-simple.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/pacat_simple-pacat-simple.Tpo tests/$(DEPDIR)/pacat_simple-pacat-simple.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/pacat-simple.c' object='tests/pacat_simple-pacat-simple.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pacat_simple_CFLAGS) $(CFLAGS) -c -o tests/pacat_simple-pacat-simple.o `test -f 'tests/pacat-simple.c' || echo '$(srcdir)/'`tests/pacat-simple.c + +tests/pacat_simple-pacat-simple.obj: tests/pacat-simple.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pacat_simple_CFLAGS) $(CFLAGS) -MT tests/pacat_simple-pacat-simple.obj -MD -MP -MF tests/$(DEPDIR)/pacat_simple-pacat-simple.Tpo -c -o tests/pacat_simple-pacat-simple.obj `if test -f 'tests/pacat-simple.c'; then $(CYGPATH_W) 'tests/pacat-simple.c'; else $(CYGPATH_W) '$(srcdir)/tests/pacat-simple.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/pacat_simple-pacat-simple.Tpo tests/$(DEPDIR)/pacat_simple-pacat-simple.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/pacat-simple.c' object='tests/pacat_simple-pacat-simple.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pacat_simple_CFLAGS) $(CFLAGS) -c -o tests/pacat_simple-pacat-simple.obj `if test -f 'tests/pacat-simple.c'; then $(CYGPATH_W) 'tests/pacat-simple.c'; else $(CYGPATH_W) '$(srcdir)/tests/pacat-simple.c'; fi` + +utils/pacmd-pacmd.o: utils/pacmd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pacmd_CFLAGS) $(CFLAGS) -MT utils/pacmd-pacmd.o -MD -MP -MF utils/$(DEPDIR)/pacmd-pacmd.Tpo -c -o utils/pacmd-pacmd.o `test -f 'utils/pacmd.c' || echo '$(srcdir)/'`utils/pacmd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) utils/$(DEPDIR)/pacmd-pacmd.Tpo utils/$(DEPDIR)/pacmd-pacmd.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils/pacmd.c' object='utils/pacmd-pacmd.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pacmd_CFLAGS) $(CFLAGS) -c -o utils/pacmd-pacmd.o `test -f 'utils/pacmd.c' || echo '$(srcdir)/'`utils/pacmd.c + +utils/pacmd-pacmd.obj: utils/pacmd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pacmd_CFLAGS) $(CFLAGS) -MT utils/pacmd-pacmd.obj -MD -MP -MF utils/$(DEPDIR)/pacmd-pacmd.Tpo -c -o utils/pacmd-pacmd.obj `if test -f 'utils/pacmd.c'; then $(CYGPATH_W) 'utils/pacmd.c'; else $(CYGPATH_W) '$(srcdir)/utils/pacmd.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) utils/$(DEPDIR)/pacmd-pacmd.Tpo utils/$(DEPDIR)/pacmd-pacmd.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils/pacmd.c' object='utils/pacmd-pacmd.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pacmd_CFLAGS) $(CFLAGS) -c -o utils/pacmd-pacmd.obj `if test -f 'utils/pacmd.c'; then $(CYGPATH_W) 'utils/pacmd.c'; else $(CYGPATH_W) '$(srcdir)/utils/pacmd.c'; fi` + +utils/pactl-pactl.o: utils/pactl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pactl_CFLAGS) $(CFLAGS) -MT utils/pactl-pactl.o -MD -MP -MF utils/$(DEPDIR)/pactl-pactl.Tpo -c -o utils/pactl-pactl.o `test -f 'utils/pactl.c' || echo '$(srcdir)/'`utils/pactl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) utils/$(DEPDIR)/pactl-pactl.Tpo utils/$(DEPDIR)/pactl-pactl.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils/pactl.c' object='utils/pactl-pactl.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pactl_CFLAGS) $(CFLAGS) -c -o utils/pactl-pactl.o `test -f 'utils/pactl.c' || echo '$(srcdir)/'`utils/pactl.c + +utils/pactl-pactl.obj: utils/pactl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pactl_CFLAGS) $(CFLAGS) -MT utils/pactl-pactl.obj -MD -MP -MF utils/$(DEPDIR)/pactl-pactl.Tpo -c -o utils/pactl-pactl.obj `if test -f 'utils/pactl.c'; then $(CYGPATH_W) 'utils/pactl.c'; else $(CYGPATH_W) '$(srcdir)/utils/pactl.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) utils/$(DEPDIR)/pactl-pactl.Tpo utils/$(DEPDIR)/pactl-pactl.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils/pactl.c' object='utils/pactl-pactl.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pactl_CFLAGS) $(CFLAGS) -c -o utils/pactl-pactl.obj `if test -f 'utils/pactl.c'; then $(CYGPATH_W) 'utils/pactl.c'; else $(CYGPATH_W) '$(srcdir)/utils/pactl.c'; fi` + +tests/parec_simple-parec-simple.o: tests/parec-simple.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parec_simple_CFLAGS) $(CFLAGS) -MT tests/parec_simple-parec-simple.o -MD -MP -MF tests/$(DEPDIR)/parec_simple-parec-simple.Tpo -c -o tests/parec_simple-parec-simple.o `test -f 'tests/parec-simple.c' || echo '$(srcdir)/'`tests/parec-simple.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/parec_simple-parec-simple.Tpo tests/$(DEPDIR)/parec_simple-parec-simple.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/parec-simple.c' object='tests/parec_simple-parec-simple.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parec_simple_CFLAGS) $(CFLAGS) -c -o tests/parec_simple-parec-simple.o `test -f 'tests/parec-simple.c' || echo '$(srcdir)/'`tests/parec-simple.c + +tests/parec_simple-parec-simple.obj: tests/parec-simple.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parec_simple_CFLAGS) $(CFLAGS) -MT tests/parec_simple-parec-simple.obj -MD -MP -MF tests/$(DEPDIR)/parec_simple-parec-simple.Tpo -c -o tests/parec_simple-parec-simple.obj `if test -f 'tests/parec-simple.c'; then $(CYGPATH_W) 'tests/parec-simple.c'; else $(CYGPATH_W) '$(srcdir)/tests/parec-simple.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/parec_simple-parec-simple.Tpo tests/$(DEPDIR)/parec_simple-parec-simple.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/parec-simple.c' object='tests/parec_simple-parec-simple.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parec_simple_CFLAGS) $(CFLAGS) -c -o tests/parec_simple-parec-simple.obj `if test -f 'tests/parec-simple.c'; then $(CYGPATH_W) 'tests/parec-simple.c'; else $(CYGPATH_W) '$(srcdir)/tests/parec-simple.c'; fi` + +tests/passthrough_test-passthrough-test.o: tests/passthrough-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(passthrough_test_CFLAGS) $(CFLAGS) -MT tests/passthrough_test-passthrough-test.o -MD -MP -MF tests/$(DEPDIR)/passthrough_test-passthrough-test.Tpo -c -o tests/passthrough_test-passthrough-test.o `test -f 'tests/passthrough-test.c' || echo '$(srcdir)/'`tests/passthrough-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/passthrough_test-passthrough-test.Tpo tests/$(DEPDIR)/passthrough_test-passthrough-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/passthrough-test.c' object='tests/passthrough_test-passthrough-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(passthrough_test_CFLAGS) $(CFLAGS) -c -o tests/passthrough_test-passthrough-test.o `test -f 'tests/passthrough-test.c' || echo '$(srcdir)/'`tests/passthrough-test.c + +tests/passthrough_test-passthrough-test.obj: tests/passthrough-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(passthrough_test_CFLAGS) $(CFLAGS) -MT tests/passthrough_test-passthrough-test.obj -MD -MP -MF tests/$(DEPDIR)/passthrough_test-passthrough-test.Tpo -c -o tests/passthrough_test-passthrough-test.obj `if test -f 'tests/passthrough-test.c'; then $(CYGPATH_W) 'tests/passthrough-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/passthrough-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/passthrough_test-passthrough-test.Tpo tests/$(DEPDIR)/passthrough_test-passthrough-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/passthrough-test.c' object='tests/passthrough_test-passthrough-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(passthrough_test_CFLAGS) $(CFLAGS) -c -o tests/passthrough_test-passthrough-test.obj `if test -f 'tests/passthrough-test.c'; then $(CYGPATH_W) 'tests/passthrough-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/passthrough-test.c'; fi` + +utils/pasuspender-pasuspender.o: utils/pasuspender.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pasuspender_CFLAGS) $(CFLAGS) -MT utils/pasuspender-pasuspender.o -MD -MP -MF utils/$(DEPDIR)/pasuspender-pasuspender.Tpo -c -o utils/pasuspender-pasuspender.o `test -f 'utils/pasuspender.c' || echo '$(srcdir)/'`utils/pasuspender.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) utils/$(DEPDIR)/pasuspender-pasuspender.Tpo utils/$(DEPDIR)/pasuspender-pasuspender.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils/pasuspender.c' object='utils/pasuspender-pasuspender.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pasuspender_CFLAGS) $(CFLAGS) -c -o utils/pasuspender-pasuspender.o `test -f 'utils/pasuspender.c' || echo '$(srcdir)/'`utils/pasuspender.c + +utils/pasuspender-pasuspender.obj: utils/pasuspender.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pasuspender_CFLAGS) $(CFLAGS) -MT utils/pasuspender-pasuspender.obj -MD -MP -MF utils/$(DEPDIR)/pasuspender-pasuspender.Tpo -c -o utils/pasuspender-pasuspender.obj `if test -f 'utils/pasuspender.c'; then $(CYGPATH_W) 'utils/pasuspender.c'; else $(CYGPATH_W) '$(srcdir)/utils/pasuspender.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) utils/$(DEPDIR)/pasuspender-pasuspender.Tpo utils/$(DEPDIR)/pasuspender-pasuspender.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils/pasuspender.c' object='utils/pasuspender-pasuspender.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pasuspender_CFLAGS) $(CFLAGS) -c -o utils/pasuspender-pasuspender.obj `if test -f 'utils/pasuspender.c'; then $(CYGPATH_W) 'utils/pasuspender.c'; else $(CYGPATH_W) '$(srcdir)/utils/pasuspender.c'; fi` + +utils/pax11publish-pax11publish.o: utils/pax11publish.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pax11publish_CFLAGS) $(CFLAGS) -MT utils/pax11publish-pax11publish.o -MD -MP -MF utils/$(DEPDIR)/pax11publish-pax11publish.Tpo -c -o utils/pax11publish-pax11publish.o `test -f 'utils/pax11publish.c' || echo '$(srcdir)/'`utils/pax11publish.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) utils/$(DEPDIR)/pax11publish-pax11publish.Tpo utils/$(DEPDIR)/pax11publish-pax11publish.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils/pax11publish.c' object='utils/pax11publish-pax11publish.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pax11publish_CFLAGS) $(CFLAGS) -c -o utils/pax11publish-pax11publish.o `test -f 'utils/pax11publish.c' || echo '$(srcdir)/'`utils/pax11publish.c + +utils/pax11publish-pax11publish.obj: utils/pax11publish.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pax11publish_CFLAGS) $(CFLAGS) -MT utils/pax11publish-pax11publish.obj -MD -MP -MF utils/$(DEPDIR)/pax11publish-pax11publish.Tpo -c -o utils/pax11publish-pax11publish.obj `if test -f 'utils/pax11publish.c'; then $(CYGPATH_W) 'utils/pax11publish.c'; else $(CYGPATH_W) '$(srcdir)/utils/pax11publish.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) utils/$(DEPDIR)/pax11publish-pax11publish.Tpo utils/$(DEPDIR)/pax11publish-pax11publish.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils/pax11publish.c' object='utils/pax11publish-pax11publish.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pax11publish_CFLAGS) $(CFLAGS) -c -o utils/pax11publish-pax11publish.obj `if test -f 'utils/pax11publish.c'; then $(CYGPATH_W) 'utils/pax11publish.c'; else $(CYGPATH_W) '$(srcdir)/utils/pax11publish.c'; fi` + +tests/proplist_test-proplist-test.o: tests/proplist-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(proplist_test_CFLAGS) $(CFLAGS) -MT tests/proplist_test-proplist-test.o -MD -MP -MF tests/$(DEPDIR)/proplist_test-proplist-test.Tpo -c -o tests/proplist_test-proplist-test.o `test -f 'tests/proplist-test.c' || echo '$(srcdir)/'`tests/proplist-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/proplist_test-proplist-test.Tpo tests/$(DEPDIR)/proplist_test-proplist-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/proplist-test.c' object='tests/proplist_test-proplist-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(proplist_test_CFLAGS) $(CFLAGS) -c -o tests/proplist_test-proplist-test.o `test -f 'tests/proplist-test.c' || echo '$(srcdir)/'`tests/proplist-test.c + +tests/proplist_test-proplist-test.obj: tests/proplist-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(proplist_test_CFLAGS) $(CFLAGS) -MT tests/proplist_test-proplist-test.obj -MD -MP -MF tests/$(DEPDIR)/proplist_test-proplist-test.Tpo -c -o tests/proplist_test-proplist-test.obj `if test -f 'tests/proplist-test.c'; then $(CYGPATH_W) 'tests/proplist-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/proplist-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/proplist_test-proplist-test.Tpo tests/$(DEPDIR)/proplist_test-proplist-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/proplist-test.c' object='tests/proplist_test-proplist-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(proplist_test_CFLAGS) $(CFLAGS) -c -o tests/proplist_test-proplist-test.obj `if test -f 'tests/proplist-test.c'; then $(CYGPATH_W) 'tests/proplist-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/proplist-test.c'; fi` + +daemon/pulseaudio-caps.o: daemon/caps.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -MT daemon/pulseaudio-caps.o -MD -MP -MF daemon/$(DEPDIR)/pulseaudio-caps.Tpo -c -o daemon/pulseaudio-caps.o `test -f 'daemon/caps.c' || echo '$(srcdir)/'`daemon/caps.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) daemon/$(DEPDIR)/pulseaudio-caps.Tpo daemon/$(DEPDIR)/pulseaudio-caps.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemon/caps.c' object='daemon/pulseaudio-caps.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -c -o daemon/pulseaudio-caps.o `test -f 'daemon/caps.c' || echo '$(srcdir)/'`daemon/caps.c + +daemon/pulseaudio-caps.obj: daemon/caps.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -MT daemon/pulseaudio-caps.obj -MD -MP -MF daemon/$(DEPDIR)/pulseaudio-caps.Tpo -c -o daemon/pulseaudio-caps.obj `if test -f 'daemon/caps.c'; then $(CYGPATH_W) 'daemon/caps.c'; else $(CYGPATH_W) '$(srcdir)/daemon/caps.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) daemon/$(DEPDIR)/pulseaudio-caps.Tpo daemon/$(DEPDIR)/pulseaudio-caps.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemon/caps.c' object='daemon/pulseaudio-caps.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -c -o daemon/pulseaudio-caps.obj `if test -f 'daemon/caps.c'; then $(CYGPATH_W) 'daemon/caps.c'; else $(CYGPATH_W) '$(srcdir)/daemon/caps.c'; fi` + +daemon/pulseaudio-cmdline.o: daemon/cmdline.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -MT daemon/pulseaudio-cmdline.o -MD -MP -MF daemon/$(DEPDIR)/pulseaudio-cmdline.Tpo -c -o daemon/pulseaudio-cmdline.o `test -f 'daemon/cmdline.c' || echo '$(srcdir)/'`daemon/cmdline.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) daemon/$(DEPDIR)/pulseaudio-cmdline.Tpo daemon/$(DEPDIR)/pulseaudio-cmdline.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemon/cmdline.c' object='daemon/pulseaudio-cmdline.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -c -o daemon/pulseaudio-cmdline.o `test -f 'daemon/cmdline.c' || echo '$(srcdir)/'`daemon/cmdline.c + +daemon/pulseaudio-cmdline.obj: daemon/cmdline.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -MT daemon/pulseaudio-cmdline.obj -MD -MP -MF daemon/$(DEPDIR)/pulseaudio-cmdline.Tpo -c -o daemon/pulseaudio-cmdline.obj `if test -f 'daemon/cmdline.c'; then $(CYGPATH_W) 'daemon/cmdline.c'; else $(CYGPATH_W) '$(srcdir)/daemon/cmdline.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) daemon/$(DEPDIR)/pulseaudio-cmdline.Tpo daemon/$(DEPDIR)/pulseaudio-cmdline.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemon/cmdline.c' object='daemon/pulseaudio-cmdline.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -c -o daemon/pulseaudio-cmdline.obj `if test -f 'daemon/cmdline.c'; then $(CYGPATH_W) 'daemon/cmdline.c'; else $(CYGPATH_W) '$(srcdir)/daemon/cmdline.c'; fi` + +daemon/pulseaudio-cpulimit.o: daemon/cpulimit.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -MT daemon/pulseaudio-cpulimit.o -MD -MP -MF daemon/$(DEPDIR)/pulseaudio-cpulimit.Tpo -c -o daemon/pulseaudio-cpulimit.o `test -f 'daemon/cpulimit.c' || echo '$(srcdir)/'`daemon/cpulimit.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) daemon/$(DEPDIR)/pulseaudio-cpulimit.Tpo daemon/$(DEPDIR)/pulseaudio-cpulimit.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemon/cpulimit.c' object='daemon/pulseaudio-cpulimit.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -c -o daemon/pulseaudio-cpulimit.o `test -f 'daemon/cpulimit.c' || echo '$(srcdir)/'`daemon/cpulimit.c + +daemon/pulseaudio-cpulimit.obj: daemon/cpulimit.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -MT daemon/pulseaudio-cpulimit.obj -MD -MP -MF daemon/$(DEPDIR)/pulseaudio-cpulimit.Tpo -c -o daemon/pulseaudio-cpulimit.obj `if test -f 'daemon/cpulimit.c'; then $(CYGPATH_W) 'daemon/cpulimit.c'; else $(CYGPATH_W) '$(srcdir)/daemon/cpulimit.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) daemon/$(DEPDIR)/pulseaudio-cpulimit.Tpo daemon/$(DEPDIR)/pulseaudio-cpulimit.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemon/cpulimit.c' object='daemon/pulseaudio-cpulimit.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -c -o daemon/pulseaudio-cpulimit.obj `if test -f 'daemon/cpulimit.c'; then $(CYGPATH_W) 'daemon/cpulimit.c'; else $(CYGPATH_W) '$(srcdir)/daemon/cpulimit.c'; fi` + +daemon/pulseaudio-daemon-conf.o: daemon/daemon-conf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -MT daemon/pulseaudio-daemon-conf.o -MD -MP -MF daemon/$(DEPDIR)/pulseaudio-daemon-conf.Tpo -c -o daemon/pulseaudio-daemon-conf.o `test -f 'daemon/daemon-conf.c' || echo '$(srcdir)/'`daemon/daemon-conf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) daemon/$(DEPDIR)/pulseaudio-daemon-conf.Tpo daemon/$(DEPDIR)/pulseaudio-daemon-conf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemon/daemon-conf.c' object='daemon/pulseaudio-daemon-conf.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -c -o daemon/pulseaudio-daemon-conf.o `test -f 'daemon/daemon-conf.c' || echo '$(srcdir)/'`daemon/daemon-conf.c + +daemon/pulseaudio-daemon-conf.obj: daemon/daemon-conf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -MT daemon/pulseaudio-daemon-conf.obj -MD -MP -MF daemon/$(DEPDIR)/pulseaudio-daemon-conf.Tpo -c -o daemon/pulseaudio-daemon-conf.obj `if test -f 'daemon/daemon-conf.c'; then $(CYGPATH_W) 'daemon/daemon-conf.c'; else $(CYGPATH_W) '$(srcdir)/daemon/daemon-conf.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) daemon/$(DEPDIR)/pulseaudio-daemon-conf.Tpo daemon/$(DEPDIR)/pulseaudio-daemon-conf.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemon/daemon-conf.c' object='daemon/pulseaudio-daemon-conf.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -c -o daemon/pulseaudio-daemon-conf.obj `if test -f 'daemon/daemon-conf.c'; then $(CYGPATH_W) 'daemon/daemon-conf.c'; else $(CYGPATH_W) '$(srcdir)/daemon/daemon-conf.c'; fi` + +daemon/pulseaudio-dumpmodules.o: daemon/dumpmodules.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -MT daemon/pulseaudio-dumpmodules.o -MD -MP -MF daemon/$(DEPDIR)/pulseaudio-dumpmodules.Tpo -c -o daemon/pulseaudio-dumpmodules.o `test -f 'daemon/dumpmodules.c' || echo '$(srcdir)/'`daemon/dumpmodules.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) daemon/$(DEPDIR)/pulseaudio-dumpmodules.Tpo daemon/$(DEPDIR)/pulseaudio-dumpmodules.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemon/dumpmodules.c' object='daemon/pulseaudio-dumpmodules.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -c -o daemon/pulseaudio-dumpmodules.o `test -f 'daemon/dumpmodules.c' || echo '$(srcdir)/'`daemon/dumpmodules.c + +daemon/pulseaudio-dumpmodules.obj: daemon/dumpmodules.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -MT daemon/pulseaudio-dumpmodules.obj -MD -MP -MF daemon/$(DEPDIR)/pulseaudio-dumpmodules.Tpo -c -o daemon/pulseaudio-dumpmodules.obj `if test -f 'daemon/dumpmodules.c'; then $(CYGPATH_W) 'daemon/dumpmodules.c'; else $(CYGPATH_W) '$(srcdir)/daemon/dumpmodules.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) daemon/$(DEPDIR)/pulseaudio-dumpmodules.Tpo daemon/$(DEPDIR)/pulseaudio-dumpmodules.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemon/dumpmodules.c' object='daemon/pulseaudio-dumpmodules.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -c -o daemon/pulseaudio-dumpmodules.obj `if test -f 'daemon/dumpmodules.c'; then $(CYGPATH_W) 'daemon/dumpmodules.c'; else $(CYGPATH_W) '$(srcdir)/daemon/dumpmodules.c'; fi` + +daemon/pulseaudio-ltdl-bind-now.o: daemon/ltdl-bind-now.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -MT daemon/pulseaudio-ltdl-bind-now.o -MD -MP -MF daemon/$(DEPDIR)/pulseaudio-ltdl-bind-now.Tpo -c -o daemon/pulseaudio-ltdl-bind-now.o `test -f 'daemon/ltdl-bind-now.c' || echo '$(srcdir)/'`daemon/ltdl-bind-now.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) daemon/$(DEPDIR)/pulseaudio-ltdl-bind-now.Tpo daemon/$(DEPDIR)/pulseaudio-ltdl-bind-now.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemon/ltdl-bind-now.c' object='daemon/pulseaudio-ltdl-bind-now.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -c -o daemon/pulseaudio-ltdl-bind-now.o `test -f 'daemon/ltdl-bind-now.c' || echo '$(srcdir)/'`daemon/ltdl-bind-now.c + +daemon/pulseaudio-ltdl-bind-now.obj: daemon/ltdl-bind-now.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -MT daemon/pulseaudio-ltdl-bind-now.obj -MD -MP -MF daemon/$(DEPDIR)/pulseaudio-ltdl-bind-now.Tpo -c -o daemon/pulseaudio-ltdl-bind-now.obj `if test -f 'daemon/ltdl-bind-now.c'; then $(CYGPATH_W) 'daemon/ltdl-bind-now.c'; else $(CYGPATH_W) '$(srcdir)/daemon/ltdl-bind-now.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) daemon/$(DEPDIR)/pulseaudio-ltdl-bind-now.Tpo daemon/$(DEPDIR)/pulseaudio-ltdl-bind-now.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemon/ltdl-bind-now.c' object='daemon/pulseaudio-ltdl-bind-now.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -c -o daemon/pulseaudio-ltdl-bind-now.obj `if test -f 'daemon/ltdl-bind-now.c'; then $(CYGPATH_W) 'daemon/ltdl-bind-now.c'; else $(CYGPATH_W) '$(srcdir)/daemon/ltdl-bind-now.c'; fi` + +daemon/pulseaudio-main.o: daemon/main.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -MT daemon/pulseaudio-main.o -MD -MP -MF daemon/$(DEPDIR)/pulseaudio-main.Tpo -c -o daemon/pulseaudio-main.o `test -f 'daemon/main.c' || echo '$(srcdir)/'`daemon/main.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) daemon/$(DEPDIR)/pulseaudio-main.Tpo daemon/$(DEPDIR)/pulseaudio-main.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemon/main.c' object='daemon/pulseaudio-main.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -c -o daemon/pulseaudio-main.o `test -f 'daemon/main.c' || echo '$(srcdir)/'`daemon/main.c + +daemon/pulseaudio-main.obj: daemon/main.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -MT daemon/pulseaudio-main.obj -MD -MP -MF daemon/$(DEPDIR)/pulseaudio-main.Tpo -c -o daemon/pulseaudio-main.obj `if test -f 'daemon/main.c'; then $(CYGPATH_W) 'daemon/main.c'; else $(CYGPATH_W) '$(srcdir)/daemon/main.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) daemon/$(DEPDIR)/pulseaudio-main.Tpo daemon/$(DEPDIR)/pulseaudio-main.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemon/main.c' object='daemon/pulseaudio-main.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -c -o daemon/pulseaudio-main.obj `if test -f 'daemon/main.c'; then $(CYGPATH_W) 'daemon/main.c'; else $(CYGPATH_W) '$(srcdir)/daemon/main.c'; fi` + +daemon/pulseaudio-server-lookup.o: daemon/server-lookup.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -MT daemon/pulseaudio-server-lookup.o -MD -MP -MF daemon/$(DEPDIR)/pulseaudio-server-lookup.Tpo -c -o daemon/pulseaudio-server-lookup.o `test -f 'daemon/server-lookup.c' || echo '$(srcdir)/'`daemon/server-lookup.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) daemon/$(DEPDIR)/pulseaudio-server-lookup.Tpo daemon/$(DEPDIR)/pulseaudio-server-lookup.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemon/server-lookup.c' object='daemon/pulseaudio-server-lookup.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -c -o daemon/pulseaudio-server-lookup.o `test -f 'daemon/server-lookup.c' || echo '$(srcdir)/'`daemon/server-lookup.c + +daemon/pulseaudio-server-lookup.obj: daemon/server-lookup.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -MT daemon/pulseaudio-server-lookup.obj -MD -MP -MF daemon/$(DEPDIR)/pulseaudio-server-lookup.Tpo -c -o daemon/pulseaudio-server-lookup.obj `if test -f 'daemon/server-lookup.c'; then $(CYGPATH_W) 'daemon/server-lookup.c'; else $(CYGPATH_W) '$(srcdir)/daemon/server-lookup.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) daemon/$(DEPDIR)/pulseaudio-server-lookup.Tpo daemon/$(DEPDIR)/pulseaudio-server-lookup.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemon/server-lookup.c' object='daemon/pulseaudio-server-lookup.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pulseaudio_CFLAGS) $(CFLAGS) -c -o daemon/pulseaudio-server-lookup.obj `if test -f 'daemon/server-lookup.c'; then $(CYGPATH_W) 'daemon/server-lookup.c'; else $(CYGPATH_W) '$(srcdir)/daemon/server-lookup.c'; fi` + +tests/queue_test-queue-test.o: tests/queue-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(queue_test_CFLAGS) $(CFLAGS) -MT tests/queue_test-queue-test.o -MD -MP -MF tests/$(DEPDIR)/queue_test-queue-test.Tpo -c -o tests/queue_test-queue-test.o `test -f 'tests/queue-test.c' || echo '$(srcdir)/'`tests/queue-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/queue_test-queue-test.Tpo tests/$(DEPDIR)/queue_test-queue-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/queue-test.c' object='tests/queue_test-queue-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(queue_test_CFLAGS) $(CFLAGS) -c -o tests/queue_test-queue-test.o `test -f 'tests/queue-test.c' || echo '$(srcdir)/'`tests/queue-test.c + +tests/queue_test-queue-test.obj: tests/queue-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(queue_test_CFLAGS) $(CFLAGS) -MT tests/queue_test-queue-test.obj -MD -MP -MF tests/$(DEPDIR)/queue_test-queue-test.Tpo -c -o tests/queue_test-queue-test.obj `if test -f 'tests/queue-test.c'; then $(CYGPATH_W) 'tests/queue-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/queue-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/queue_test-queue-test.Tpo tests/$(DEPDIR)/queue_test-queue-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/queue-test.c' object='tests/queue_test-queue-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(queue_test_CFLAGS) $(CFLAGS) -c -o tests/queue_test-queue-test.obj `if test -f 'tests/queue-test.c'; then $(CYGPATH_W) 'tests/queue-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/queue-test.c'; fi` + +tests/remix_test-remix-test.o: tests/remix-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(remix_test_CFLAGS) $(CFLAGS) -MT tests/remix_test-remix-test.o -MD -MP -MF tests/$(DEPDIR)/remix_test-remix-test.Tpo -c -o tests/remix_test-remix-test.o `test -f 'tests/remix-test.c' || echo '$(srcdir)/'`tests/remix-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/remix_test-remix-test.Tpo tests/$(DEPDIR)/remix_test-remix-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/remix-test.c' object='tests/remix_test-remix-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(remix_test_CFLAGS) $(CFLAGS) -c -o tests/remix_test-remix-test.o `test -f 'tests/remix-test.c' || echo '$(srcdir)/'`tests/remix-test.c + +tests/remix_test-remix-test.obj: tests/remix-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(remix_test_CFLAGS) $(CFLAGS) -MT tests/remix_test-remix-test.obj -MD -MP -MF tests/$(DEPDIR)/remix_test-remix-test.Tpo -c -o tests/remix_test-remix-test.obj `if test -f 'tests/remix-test.c'; then $(CYGPATH_W) 'tests/remix-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/remix-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/remix_test-remix-test.Tpo tests/$(DEPDIR)/remix_test-remix-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/remix-test.c' object='tests/remix_test-remix-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(remix_test_CFLAGS) $(CFLAGS) -c -o tests/remix_test-remix-test.obj `if test -f 'tests/remix-test.c'; then $(CYGPATH_W) 'tests/remix-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/remix-test.c'; fi` + +tests/resampler_test-resampler-test.o: tests/resampler-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resampler_test_CFLAGS) $(CFLAGS) -MT tests/resampler_test-resampler-test.o -MD -MP -MF tests/$(DEPDIR)/resampler_test-resampler-test.Tpo -c -o tests/resampler_test-resampler-test.o `test -f 'tests/resampler-test.c' || echo '$(srcdir)/'`tests/resampler-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/resampler_test-resampler-test.Tpo tests/$(DEPDIR)/resampler_test-resampler-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/resampler-test.c' object='tests/resampler_test-resampler-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resampler_test_CFLAGS) $(CFLAGS) -c -o tests/resampler_test-resampler-test.o `test -f 'tests/resampler-test.c' || echo '$(srcdir)/'`tests/resampler-test.c + +tests/resampler_test-resampler-test.obj: tests/resampler-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resampler_test_CFLAGS) $(CFLAGS) -MT tests/resampler_test-resampler-test.obj -MD -MP -MF tests/$(DEPDIR)/resampler_test-resampler-test.Tpo -c -o tests/resampler_test-resampler-test.obj `if test -f 'tests/resampler-test.c'; then $(CYGPATH_W) 'tests/resampler-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/resampler-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/resampler_test-resampler-test.Tpo tests/$(DEPDIR)/resampler_test-resampler-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/resampler-test.c' object='tests/resampler_test-resampler-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(resampler_test_CFLAGS) $(CFLAGS) -c -o tests/resampler_test-resampler-test.obj `if test -f 'tests/resampler-test.c'; then $(CYGPATH_W) 'tests/resampler-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/resampler-test.c'; fi` + +tests/rtpoll_test-rtpoll-test.o: tests/rtpoll-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtpoll_test_CFLAGS) $(CFLAGS) -MT tests/rtpoll_test-rtpoll-test.o -MD -MP -MF tests/$(DEPDIR)/rtpoll_test-rtpoll-test.Tpo -c -o tests/rtpoll_test-rtpoll-test.o `test -f 'tests/rtpoll-test.c' || echo '$(srcdir)/'`tests/rtpoll-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/rtpoll_test-rtpoll-test.Tpo tests/$(DEPDIR)/rtpoll_test-rtpoll-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/rtpoll-test.c' object='tests/rtpoll_test-rtpoll-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtpoll_test_CFLAGS) $(CFLAGS) -c -o tests/rtpoll_test-rtpoll-test.o `test -f 'tests/rtpoll-test.c' || echo '$(srcdir)/'`tests/rtpoll-test.c + +tests/rtpoll_test-rtpoll-test.obj: tests/rtpoll-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtpoll_test_CFLAGS) $(CFLAGS) -MT tests/rtpoll_test-rtpoll-test.obj -MD -MP -MF tests/$(DEPDIR)/rtpoll_test-rtpoll-test.Tpo -c -o tests/rtpoll_test-rtpoll-test.obj `if test -f 'tests/rtpoll-test.c'; then $(CYGPATH_W) 'tests/rtpoll-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/rtpoll-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/rtpoll_test-rtpoll-test.Tpo tests/$(DEPDIR)/rtpoll_test-rtpoll-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/rtpoll-test.c' object='tests/rtpoll_test-rtpoll-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtpoll_test_CFLAGS) $(CFLAGS) -c -o tests/rtpoll_test-rtpoll-test.obj `if test -f 'tests/rtpoll-test.c'; then $(CYGPATH_W) 'tests/rtpoll-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/rtpoll-test.c'; fi` + +tests/rtstutter-rtstutter.o: tests/rtstutter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtstutter_CFLAGS) $(CFLAGS) -MT tests/rtstutter-rtstutter.o -MD -MP -MF tests/$(DEPDIR)/rtstutter-rtstutter.Tpo -c -o tests/rtstutter-rtstutter.o `test -f 'tests/rtstutter.c' || echo '$(srcdir)/'`tests/rtstutter.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/rtstutter-rtstutter.Tpo tests/$(DEPDIR)/rtstutter-rtstutter.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/rtstutter.c' object='tests/rtstutter-rtstutter.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtstutter_CFLAGS) $(CFLAGS) -c -o tests/rtstutter-rtstutter.o `test -f 'tests/rtstutter.c' || echo '$(srcdir)/'`tests/rtstutter.c + +tests/rtstutter-rtstutter.obj: tests/rtstutter.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtstutter_CFLAGS) $(CFLAGS) -MT tests/rtstutter-rtstutter.obj -MD -MP -MF tests/$(DEPDIR)/rtstutter-rtstutter.Tpo -c -o tests/rtstutter-rtstutter.obj `if test -f 'tests/rtstutter.c'; then $(CYGPATH_W) 'tests/rtstutter.c'; else $(CYGPATH_W) '$(srcdir)/tests/rtstutter.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/rtstutter-rtstutter.Tpo tests/$(DEPDIR)/rtstutter-rtstutter.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/rtstutter.c' object='tests/rtstutter-rtstutter.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(rtstutter_CFLAGS) $(CFLAGS) -c -o tests/rtstutter-rtstutter.obj `if test -f 'tests/rtstutter.c'; then $(CYGPATH_W) 'tests/rtstutter.c'; else $(CYGPATH_W) '$(srcdir)/tests/rtstutter.c'; fi` + +tests/sig2str_test-sig2str-test.o: tests/sig2str-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sig2str_test_CFLAGS) $(CFLAGS) -MT tests/sig2str_test-sig2str-test.o -MD -MP -MF tests/$(DEPDIR)/sig2str_test-sig2str-test.Tpo -c -o tests/sig2str_test-sig2str-test.o `test -f 'tests/sig2str-test.c' || echo '$(srcdir)/'`tests/sig2str-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/sig2str_test-sig2str-test.Tpo tests/$(DEPDIR)/sig2str_test-sig2str-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/sig2str-test.c' object='tests/sig2str_test-sig2str-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sig2str_test_CFLAGS) $(CFLAGS) -c -o tests/sig2str_test-sig2str-test.o `test -f 'tests/sig2str-test.c' || echo '$(srcdir)/'`tests/sig2str-test.c + +tests/sig2str_test-sig2str-test.obj: tests/sig2str-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sig2str_test_CFLAGS) $(CFLAGS) -MT tests/sig2str_test-sig2str-test.obj -MD -MP -MF tests/$(DEPDIR)/sig2str_test-sig2str-test.Tpo -c -o tests/sig2str_test-sig2str-test.obj `if test -f 'tests/sig2str-test.c'; then $(CYGPATH_W) 'tests/sig2str-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/sig2str-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/sig2str_test-sig2str-test.Tpo tests/$(DEPDIR)/sig2str_test-sig2str-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/sig2str-test.c' object='tests/sig2str_test-sig2str-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sig2str_test_CFLAGS) $(CFLAGS) -c -o tests/sig2str_test-sig2str-test.obj `if test -f 'tests/sig2str-test.c'; then $(CYGPATH_W) 'tests/sig2str-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/sig2str-test.c'; fi` + +tests/sigbus_test-sigbus-test.o: tests/sigbus-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sigbus_test_CFLAGS) $(CFLAGS) -MT tests/sigbus_test-sigbus-test.o -MD -MP -MF tests/$(DEPDIR)/sigbus_test-sigbus-test.Tpo -c -o tests/sigbus_test-sigbus-test.o `test -f 'tests/sigbus-test.c' || echo '$(srcdir)/'`tests/sigbus-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/sigbus_test-sigbus-test.Tpo tests/$(DEPDIR)/sigbus_test-sigbus-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/sigbus-test.c' object='tests/sigbus_test-sigbus-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sigbus_test_CFLAGS) $(CFLAGS) -c -o tests/sigbus_test-sigbus-test.o `test -f 'tests/sigbus-test.c' || echo '$(srcdir)/'`tests/sigbus-test.c + +tests/sigbus_test-sigbus-test.obj: tests/sigbus-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sigbus_test_CFLAGS) $(CFLAGS) -MT tests/sigbus_test-sigbus-test.obj -MD -MP -MF tests/$(DEPDIR)/sigbus_test-sigbus-test.Tpo -c -o tests/sigbus_test-sigbus-test.obj `if test -f 'tests/sigbus-test.c'; then $(CYGPATH_W) 'tests/sigbus-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/sigbus-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/sigbus_test-sigbus-test.Tpo tests/$(DEPDIR)/sigbus_test-sigbus-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/sigbus-test.c' object='tests/sigbus_test-sigbus-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sigbus_test_CFLAGS) $(CFLAGS) -c -o tests/sigbus_test-sigbus-test.obj `if test -f 'tests/sigbus-test.c'; then $(CYGPATH_W) 'tests/sigbus-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/sigbus-test.c'; fi` + +tests/smoother_test-smoother-test.o: tests/smoother-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(smoother_test_CFLAGS) $(CFLAGS) -MT tests/smoother_test-smoother-test.o -MD -MP -MF tests/$(DEPDIR)/smoother_test-smoother-test.Tpo -c -o tests/smoother_test-smoother-test.o `test -f 'tests/smoother-test.c' || echo '$(srcdir)/'`tests/smoother-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/smoother_test-smoother-test.Tpo tests/$(DEPDIR)/smoother_test-smoother-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/smoother-test.c' object='tests/smoother_test-smoother-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(smoother_test_CFLAGS) $(CFLAGS) -c -o tests/smoother_test-smoother-test.o `test -f 'tests/smoother-test.c' || echo '$(srcdir)/'`tests/smoother-test.c + +tests/smoother_test-smoother-test.obj: tests/smoother-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(smoother_test_CFLAGS) $(CFLAGS) -MT tests/smoother_test-smoother-test.obj -MD -MP -MF tests/$(DEPDIR)/smoother_test-smoother-test.Tpo -c -o tests/smoother_test-smoother-test.obj `if test -f 'tests/smoother-test.c'; then $(CYGPATH_W) 'tests/smoother-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/smoother-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/smoother_test-smoother-test.Tpo tests/$(DEPDIR)/smoother_test-smoother-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/smoother-test.c' object='tests/smoother_test-smoother-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(smoother_test_CFLAGS) $(CFLAGS) -c -o tests/smoother_test-smoother-test.obj `if test -f 'tests/smoother-test.c'; then $(CYGPATH_W) 'tests/smoother-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/smoother-test.c'; fi` + +tests/srbchannel_test-srbchannel-test.o: tests/srbchannel-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(srbchannel_test_CFLAGS) $(CFLAGS) -MT tests/srbchannel_test-srbchannel-test.o -MD -MP -MF tests/$(DEPDIR)/srbchannel_test-srbchannel-test.Tpo -c -o tests/srbchannel_test-srbchannel-test.o `test -f 'tests/srbchannel-test.c' || echo '$(srcdir)/'`tests/srbchannel-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/srbchannel_test-srbchannel-test.Tpo tests/$(DEPDIR)/srbchannel_test-srbchannel-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/srbchannel-test.c' object='tests/srbchannel_test-srbchannel-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(srbchannel_test_CFLAGS) $(CFLAGS) -c -o tests/srbchannel_test-srbchannel-test.o `test -f 'tests/srbchannel-test.c' || echo '$(srcdir)/'`tests/srbchannel-test.c + +tests/srbchannel_test-srbchannel-test.obj: tests/srbchannel-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(srbchannel_test_CFLAGS) $(CFLAGS) -MT tests/srbchannel_test-srbchannel-test.obj -MD -MP -MF tests/$(DEPDIR)/srbchannel_test-srbchannel-test.Tpo -c -o tests/srbchannel_test-srbchannel-test.obj `if test -f 'tests/srbchannel-test.c'; then $(CYGPATH_W) 'tests/srbchannel-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/srbchannel-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/srbchannel_test-srbchannel-test.Tpo tests/$(DEPDIR)/srbchannel_test-srbchannel-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/srbchannel-test.c' object='tests/srbchannel_test-srbchannel-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(srbchannel_test_CFLAGS) $(CFLAGS) -c -o tests/srbchannel_test-srbchannel-test.obj `if test -f 'tests/srbchannel-test.c'; then $(CYGPATH_W) 'tests/srbchannel-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/srbchannel-test.c'; fi` + +tests/stripnul-stripnul.o: tests/stripnul.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(stripnul_CFLAGS) $(CFLAGS) -MT tests/stripnul-stripnul.o -MD -MP -MF tests/$(DEPDIR)/stripnul-stripnul.Tpo -c -o tests/stripnul-stripnul.o `test -f 'tests/stripnul.c' || echo '$(srcdir)/'`tests/stripnul.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/stripnul-stripnul.Tpo tests/$(DEPDIR)/stripnul-stripnul.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/stripnul.c' object='tests/stripnul-stripnul.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(stripnul_CFLAGS) $(CFLAGS) -c -o tests/stripnul-stripnul.o `test -f 'tests/stripnul.c' || echo '$(srcdir)/'`tests/stripnul.c + +tests/stripnul-stripnul.obj: tests/stripnul.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(stripnul_CFLAGS) $(CFLAGS) -MT tests/stripnul-stripnul.obj -MD -MP -MF tests/$(DEPDIR)/stripnul-stripnul.Tpo -c -o tests/stripnul-stripnul.obj `if test -f 'tests/stripnul.c'; then $(CYGPATH_W) 'tests/stripnul.c'; else $(CYGPATH_W) '$(srcdir)/tests/stripnul.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/stripnul-stripnul.Tpo tests/$(DEPDIR)/stripnul-stripnul.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/stripnul.c' object='tests/stripnul-stripnul.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(stripnul_CFLAGS) $(CFLAGS) -c -o tests/stripnul-stripnul.obj `if test -f 'tests/stripnul.c'; then $(CYGPATH_W) 'tests/stripnul.c'; else $(CYGPATH_W) '$(srcdir)/tests/stripnul.c'; fi` + +tests/strlist_test-strlist-test.o: tests/strlist-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(strlist_test_CFLAGS) $(CFLAGS) -MT tests/strlist_test-strlist-test.o -MD -MP -MF tests/$(DEPDIR)/strlist_test-strlist-test.Tpo -c -o tests/strlist_test-strlist-test.o `test -f 'tests/strlist-test.c' || echo '$(srcdir)/'`tests/strlist-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/strlist_test-strlist-test.Tpo tests/$(DEPDIR)/strlist_test-strlist-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/strlist-test.c' object='tests/strlist_test-strlist-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(strlist_test_CFLAGS) $(CFLAGS) -c -o tests/strlist_test-strlist-test.o `test -f 'tests/strlist-test.c' || echo '$(srcdir)/'`tests/strlist-test.c + +tests/strlist_test-strlist-test.obj: tests/strlist-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(strlist_test_CFLAGS) $(CFLAGS) -MT tests/strlist_test-strlist-test.obj -MD -MP -MF tests/$(DEPDIR)/strlist_test-strlist-test.Tpo -c -o tests/strlist_test-strlist-test.obj `if test -f 'tests/strlist-test.c'; then $(CYGPATH_W) 'tests/strlist-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/strlist-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/strlist_test-strlist-test.Tpo tests/$(DEPDIR)/strlist_test-strlist-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/strlist-test.c' object='tests/strlist_test-strlist-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(strlist_test_CFLAGS) $(CFLAGS) -c -o tests/strlist_test-strlist-test.obj `if test -f 'tests/strlist-test.c'; then $(CYGPATH_W) 'tests/strlist-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/strlist-test.c'; fi` + +tests/sync_playback-sync-playback.o: tests/sync-playback.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sync_playback_CFLAGS) $(CFLAGS) -MT tests/sync_playback-sync-playback.o -MD -MP -MF tests/$(DEPDIR)/sync_playback-sync-playback.Tpo -c -o tests/sync_playback-sync-playback.o `test -f 'tests/sync-playback.c' || echo '$(srcdir)/'`tests/sync-playback.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/sync_playback-sync-playback.Tpo tests/$(DEPDIR)/sync_playback-sync-playback.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/sync-playback.c' object='tests/sync_playback-sync-playback.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sync_playback_CFLAGS) $(CFLAGS) -c -o tests/sync_playback-sync-playback.o `test -f 'tests/sync-playback.c' || echo '$(srcdir)/'`tests/sync-playback.c + +tests/sync_playback-sync-playback.obj: tests/sync-playback.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sync_playback_CFLAGS) $(CFLAGS) -MT tests/sync_playback-sync-playback.obj -MD -MP -MF tests/$(DEPDIR)/sync_playback-sync-playback.Tpo -c -o tests/sync_playback-sync-playback.obj `if test -f 'tests/sync-playback.c'; then $(CYGPATH_W) 'tests/sync-playback.c'; else $(CYGPATH_W) '$(srcdir)/tests/sync-playback.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/sync_playback-sync-playback.Tpo tests/$(DEPDIR)/sync_playback-sync-playback.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/sync-playback.c' object='tests/sync_playback-sync-playback.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sync_playback_CFLAGS) $(CFLAGS) -c -o tests/sync_playback-sync-playback.obj `if test -f 'tests/sync-playback.c'; then $(CYGPATH_W) 'tests/sync-playback.c'; else $(CYGPATH_W) '$(srcdir)/tests/sync-playback.c'; fi` + +tests/thread_mainloop_test-thread-mainloop-test.o: tests/thread-mainloop-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(thread_mainloop_test_CFLAGS) $(CFLAGS) -MT tests/thread_mainloop_test-thread-mainloop-test.o -MD -MP -MF tests/$(DEPDIR)/thread_mainloop_test-thread-mainloop-test.Tpo -c -o tests/thread_mainloop_test-thread-mainloop-test.o `test -f 'tests/thread-mainloop-test.c' || echo '$(srcdir)/'`tests/thread-mainloop-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/thread_mainloop_test-thread-mainloop-test.Tpo tests/$(DEPDIR)/thread_mainloop_test-thread-mainloop-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/thread-mainloop-test.c' object='tests/thread_mainloop_test-thread-mainloop-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(thread_mainloop_test_CFLAGS) $(CFLAGS) -c -o tests/thread_mainloop_test-thread-mainloop-test.o `test -f 'tests/thread-mainloop-test.c' || echo '$(srcdir)/'`tests/thread-mainloop-test.c + +tests/thread_mainloop_test-thread-mainloop-test.obj: tests/thread-mainloop-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(thread_mainloop_test_CFLAGS) $(CFLAGS) -MT tests/thread_mainloop_test-thread-mainloop-test.obj -MD -MP -MF tests/$(DEPDIR)/thread_mainloop_test-thread-mainloop-test.Tpo -c -o tests/thread_mainloop_test-thread-mainloop-test.obj `if test -f 'tests/thread-mainloop-test.c'; then $(CYGPATH_W) 'tests/thread-mainloop-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/thread-mainloop-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/thread_mainloop_test-thread-mainloop-test.Tpo tests/$(DEPDIR)/thread_mainloop_test-thread-mainloop-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/thread-mainloop-test.c' object='tests/thread_mainloop_test-thread-mainloop-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(thread_mainloop_test_CFLAGS) $(CFLAGS) -c -o tests/thread_mainloop_test-thread-mainloop-test.obj `if test -f 'tests/thread-mainloop-test.c'; then $(CYGPATH_W) 'tests/thread-mainloop-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/thread-mainloop-test.c'; fi` + +tests/thread_test-thread-test.o: tests/thread-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(thread_test_CFLAGS) $(CFLAGS) -MT tests/thread_test-thread-test.o -MD -MP -MF tests/$(DEPDIR)/thread_test-thread-test.Tpo -c -o tests/thread_test-thread-test.o `test -f 'tests/thread-test.c' || echo '$(srcdir)/'`tests/thread-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/thread_test-thread-test.Tpo tests/$(DEPDIR)/thread_test-thread-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/thread-test.c' object='tests/thread_test-thread-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(thread_test_CFLAGS) $(CFLAGS) -c -o tests/thread_test-thread-test.o `test -f 'tests/thread-test.c' || echo '$(srcdir)/'`tests/thread-test.c + +tests/thread_test-thread-test.obj: tests/thread-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(thread_test_CFLAGS) $(CFLAGS) -MT tests/thread_test-thread-test.obj -MD -MP -MF tests/$(DEPDIR)/thread_test-thread-test.Tpo -c -o tests/thread_test-thread-test.obj `if test -f 'tests/thread-test.c'; then $(CYGPATH_W) 'tests/thread-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/thread-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/thread_test-thread-test.Tpo tests/$(DEPDIR)/thread_test-thread-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/thread-test.c' object='tests/thread_test-thread-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(thread_test_CFLAGS) $(CFLAGS) -c -o tests/thread_test-thread-test.obj `if test -f 'tests/thread-test.c'; then $(CYGPATH_W) 'tests/thread-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/thread-test.c'; fi` + +tests/usergroup_test-usergroup-test.o: tests/usergroup-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usergroup_test_CFLAGS) $(CFLAGS) -MT tests/usergroup_test-usergroup-test.o -MD -MP -MF tests/$(DEPDIR)/usergroup_test-usergroup-test.Tpo -c -o tests/usergroup_test-usergroup-test.o `test -f 'tests/usergroup-test.c' || echo '$(srcdir)/'`tests/usergroup-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/usergroup_test-usergroup-test.Tpo tests/$(DEPDIR)/usergroup_test-usergroup-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/usergroup-test.c' object='tests/usergroup_test-usergroup-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usergroup_test_CFLAGS) $(CFLAGS) -c -o tests/usergroup_test-usergroup-test.o `test -f 'tests/usergroup-test.c' || echo '$(srcdir)/'`tests/usergroup-test.c + +tests/usergroup_test-usergroup-test.obj: tests/usergroup-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usergroup_test_CFLAGS) $(CFLAGS) -MT tests/usergroup_test-usergroup-test.obj -MD -MP -MF tests/$(DEPDIR)/usergroup_test-usergroup-test.Tpo -c -o tests/usergroup_test-usergroup-test.obj `if test -f 'tests/usergroup-test.c'; then $(CYGPATH_W) 'tests/usergroup-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/usergroup-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/usergroup_test-usergroup-test.Tpo tests/$(DEPDIR)/usergroup_test-usergroup-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/usergroup-test.c' object='tests/usergroup_test-usergroup-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usergroup_test_CFLAGS) $(CFLAGS) -c -o tests/usergroup_test-usergroup-test.obj `if test -f 'tests/usergroup-test.c'; then $(CYGPATH_W) 'tests/usergroup-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/usergroup-test.c'; fi` + +tests/utf8_test-utf8-test.o: tests/utf8-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(utf8_test_CFLAGS) $(CFLAGS) -MT tests/utf8_test-utf8-test.o -MD -MP -MF tests/$(DEPDIR)/utf8_test-utf8-test.Tpo -c -o tests/utf8_test-utf8-test.o `test -f 'tests/utf8-test.c' || echo '$(srcdir)/'`tests/utf8-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/utf8_test-utf8-test.Tpo tests/$(DEPDIR)/utf8_test-utf8-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/utf8-test.c' object='tests/utf8_test-utf8-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(utf8_test_CFLAGS) $(CFLAGS) -c -o tests/utf8_test-utf8-test.o `test -f 'tests/utf8-test.c' || echo '$(srcdir)/'`tests/utf8-test.c + +tests/utf8_test-utf8-test.obj: tests/utf8-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(utf8_test_CFLAGS) $(CFLAGS) -MT tests/utf8_test-utf8-test.obj -MD -MP -MF tests/$(DEPDIR)/utf8_test-utf8-test.Tpo -c -o tests/utf8_test-utf8-test.obj `if test -f 'tests/utf8-test.c'; then $(CYGPATH_W) 'tests/utf8-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/utf8-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/utf8_test-utf8-test.Tpo tests/$(DEPDIR)/utf8_test-utf8-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/utf8-test.c' object='tests/utf8_test-utf8-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(utf8_test_CFLAGS) $(CFLAGS) -c -o tests/utf8_test-utf8-test.obj `if test -f 'tests/utf8-test.c'; then $(CYGPATH_W) 'tests/utf8-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/utf8-test.c'; fi` + +tests/volume_test-volume-test.o: tests/volume-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_test_CFLAGS) $(CFLAGS) -MT tests/volume_test-volume-test.o -MD -MP -MF tests/$(DEPDIR)/volume_test-volume-test.Tpo -c -o tests/volume_test-volume-test.o `test -f 'tests/volume-test.c' || echo '$(srcdir)/'`tests/volume-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/volume_test-volume-test.Tpo tests/$(DEPDIR)/volume_test-volume-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/volume-test.c' object='tests/volume_test-volume-test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_test_CFLAGS) $(CFLAGS) -c -o tests/volume_test-volume-test.o `test -f 'tests/volume-test.c' || echo '$(srcdir)/'`tests/volume-test.c + +tests/volume_test-volume-test.obj: tests/volume-test.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_test_CFLAGS) $(CFLAGS) -MT tests/volume_test-volume-test.obj -MD -MP -MF tests/$(DEPDIR)/volume_test-volume-test.Tpo -c -o tests/volume_test-volume-test.obj `if test -f 'tests/volume-test.c'; then $(CYGPATH_W) 'tests/volume-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/volume-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) tests/$(DEPDIR)/volume_test-volume-test.Tpo tests/$(DEPDIR)/volume_test-volume-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tests/volume-test.c' object='tests/volume_test-volume-test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(volume_test_CFLAGS) $(CFLAGS) -c -o tests/volume_test-volume-test.obj `if test -f 'tests/volume-test.c'; then $(CYGPATH_W) 'tests/volume-test.c'; else $(CYGPATH_W) '$(srcdir)/tests/volume-test.c'; fi` + +.cc.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cc.lo: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< + +modules/echo-cancel/libwebrtc_util_la-webrtc.lo: modules/echo-cancel/webrtc.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libwebrtc_util_la_CXXFLAGS) $(CXXFLAGS) -MT modules/echo-cancel/libwebrtc_util_la-webrtc.lo -MD -MP -MF modules/echo-cancel/$(DEPDIR)/libwebrtc_util_la-webrtc.Tpo -c -o modules/echo-cancel/libwebrtc_util_la-webrtc.lo `test -f 'modules/echo-cancel/webrtc.cc' || echo '$(srcdir)/'`modules/echo-cancel/webrtc.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) modules/echo-cancel/$(DEPDIR)/libwebrtc_util_la-webrtc.Tpo modules/echo-cancel/$(DEPDIR)/libwebrtc_util_la-webrtc.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='modules/echo-cancel/webrtc.cc' object='modules/echo-cancel/libwebrtc_util_la-webrtc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libwebrtc_util_la_CXXFLAGS) $(CXXFLAGS) -c -o modules/echo-cancel/libwebrtc_util_la-webrtc.lo `test -f 'modules/echo-cancel/webrtc.cc' || echo '$(srcdir)/'`modules/echo-cancel/webrtc.cc + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + -rm -rf modules/.libs modules/_libs + -rm -rf modules/alsa/.libs modules/alsa/_libs + -rm -rf modules/bluetooth/.libs modules/bluetooth/_libs + -rm -rf modules/dbus/.libs modules/dbus/_libs + -rm -rf modules/echo-cancel/.libs modules/echo-cancel/_libs + -rm -rf modules/gconf/.libs modules/gconf/_libs + -rm -rf modules/gsettings/.libs modules/gsettings/_libs + -rm -rf modules/jack/.libs modules/jack/_libs + -rm -rf modules/macosx/.libs modules/macosx/_libs + -rm -rf modules/oss/.libs modules/oss/_libs + -rm -rf modules/raop/.libs modules/raop/_libs + -rm -rf modules/rtp/.libs modules/rtp/_libs + -rm -rf modules/x11/.libs modules/x11/_libs + -rm -rf pulse/.libs pulse/_libs + -rm -rf pulsecore/.libs pulsecore/_libs + -rm -rf pulsecore/ffmpeg/.libs pulsecore/ffmpeg/_libs + -rm -rf pulsecore/filter/.libs pulsecore/filter/_libs + -rm -rf pulsecore/resampler/.libs pulsecore/resampler/_libs + -rm -rf tests/.libs tests/_libs + -rm -rf utils/.libs utils/_libs +install-dbuspolicyDATA: $(dbuspolicy_DATA) + @$(NORMAL_INSTALL) + @list='$(dbuspolicy_DATA)'; test -n "$(dbuspolicydir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(dbuspolicydir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(dbuspolicydir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dbuspolicydir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(dbuspolicydir)" || exit $$?; \ + done + +uninstall-dbuspolicyDATA: + @$(NORMAL_UNINSTALL) + @list='$(dbuspolicy_DATA)'; test -n "$(dbuspolicydir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(dbuspolicydir)'; $(am__uninstall_files_from_dir) +install-dist_alsapathsDATA: $(dist_alsapaths_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_alsapaths_DATA)'; test -n "$(alsapathsdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(alsapathsdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(alsapathsdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(alsapathsdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(alsapathsdir)" || exit $$?; \ + done + +uninstall-dist_alsapathsDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_alsapaths_DATA)'; test -n "$(alsapathsdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(alsapathsdir)'; $(am__uninstall_files_from_dir) +install-dist_alsaprofilesetsDATA: $(dist_alsaprofilesets_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_alsaprofilesets_DATA)'; test -n "$(alsaprofilesetsdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(alsaprofilesetsdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(alsaprofilesetsdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(alsaprofilesetsdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(alsaprofilesetsdir)" || exit $$?; \ + done + +uninstall-dist_alsaprofilesetsDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_alsaprofilesets_DATA)'; test -n "$(alsaprofilesetsdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(alsaprofilesetsdir)'; $(am__uninstall_files_from_dir) +install-dist_udevrulesDATA: $(dist_udevrules_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_udevrules_DATA)'; test -n "$(udevrulesdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(udevrulesdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(udevrulesdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(udevrulesdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(udevrulesdir)" || exit $$?; \ + done + +uninstall-dist_udevrulesDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_udevrules_DATA)'; test -n "$(udevrulesdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(udevrulesdir)'; $(am__uninstall_files_from_dir) +install-gsettingsdataconvertDATA: $(gsettingsdataconvert_DATA) + @$(NORMAL_INSTALL) + @list='$(gsettingsdataconvert_DATA)'; test -n "$(gsettingsdataconvertdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(gsettingsdataconvertdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(gsettingsdataconvertdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(gsettingsdataconvertdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(gsettingsdataconvertdir)" || exit $$?; \ + done + +uninstall-gsettingsdataconvertDATA: + @$(NORMAL_UNINSTALL) + @list='$(gsettingsdataconvert_DATA)'; test -n "$(gsettingsdataconvertdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(gsettingsdataconvertdir)'; $(am__uninstall_files_from_dir) +install-pulseconfDATA: $(pulseconf_DATA) + @$(NORMAL_INSTALL) + @list='$(pulseconf_DATA)'; test -n "$(pulseconfdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pulseconfdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pulseconfdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pulseconfdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pulseconfdir)" || exit $$?; \ + done + +uninstall-pulseconfDATA: + @$(NORMAL_UNINSTALL) + @list='$(pulseconf_DATA)'; test -n "$(pulseconfdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pulseconfdir)'; $(am__uninstall_files_from_dir) +install-systemduserunitDATA: $(systemduserunit_DATA) + @$(NORMAL_INSTALL) + @list='$(systemduserunit_DATA)'; test -n "$(systemduserunitdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(systemduserunitdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(systemduserunitdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(systemduserunitdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(systemduserunitdir)" || exit $$?; \ + done + +uninstall-systemduserunitDATA: + @$(NORMAL_UNINSTALL) + @list='$(systemduserunit_DATA)'; test -n "$(systemduserunitdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(systemduserunitdir)'; $(am__uninstall_files_from_dir) +install-xdgautostartDATA: $(xdgautostart_DATA) + @$(NORMAL_INSTALL) + @list='$(xdgautostart_DATA)'; test -n "$(xdgautostartdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(xdgautostartdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(xdgautostartdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(xdgautostartdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(xdgautostartdir)" || exit $$?; \ + done + +uninstall-xdgautostartDATA: + @$(NORMAL_UNINSTALL) + @list='$(xdgautostart_DATA)'; test -n "$(xdgautostartdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(xdgautostartdir)'; $(am__uninstall_files_from_dir) +install-pulseincludeHEADERS: $(pulseinclude_HEADERS) + @$(NORMAL_INSTALL) + @list='$(pulseinclude_HEADERS)'; test -n "$(pulseincludedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pulseincludedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pulseincludedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pulseincludedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(pulseincludedir)" || exit $$?; \ + done + +uninstall-pulseincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(pulseinclude_HEADERS)'; test -n "$(pulseincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pulseincludedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: $(check_PROGRAMS) + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +asyncmsgq-test.log: asyncmsgq-test$(EXEEXT) + @p='asyncmsgq-test$(EXEEXT)'; \ + b='asyncmsgq-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +asyncq-test.log: asyncq-test$(EXEEXT) + @p='asyncq-test$(EXEEXT)'; \ + b='asyncq-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +channelmap-test.log: channelmap-test$(EXEEXT) + @p='channelmap-test$(EXEEXT)'; \ + b='channelmap-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +close-test.log: close-test$(EXEEXT) + @p='close-test$(EXEEXT)'; \ + b='close-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +core-util-test.log: core-util-test$(EXEEXT) + @p='core-util-test$(EXEEXT)'; \ + b='core-util-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +cpu-mix-test.log: cpu-mix-test$(EXEEXT) + @p='cpu-mix-test$(EXEEXT)'; \ + b='cpu-mix-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +cpu-remap-test.log: cpu-remap-test$(EXEEXT) + @p='cpu-remap-test$(EXEEXT)'; \ + b='cpu-remap-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +cpu-sconv-test.log: cpu-sconv-test$(EXEEXT) + @p='cpu-sconv-test$(EXEEXT)'; \ + b='cpu-sconv-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +cpu-volume-test.log: cpu-volume-test$(EXEEXT) + @p='cpu-volume-test$(EXEEXT)'; \ + b='cpu-volume-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +format-test.log: format-test$(EXEEXT) + @p='format-test$(EXEEXT)'; \ + b='format-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +get-binary-name-test.log: get-binary-name-test$(EXEEXT) + @p='get-binary-name-test$(EXEEXT)'; \ + b='get-binary-name-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +hashmap-test.log: hashmap-test$(EXEEXT) + @p='hashmap-test$(EXEEXT)'; \ + b='hashmap-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +hook-list-test.log: hook-list-test$(EXEEXT) + @p='hook-list-test$(EXEEXT)'; \ + b='hook-list-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +json-test.log: json-test$(EXEEXT) + @p='json-test$(EXEEXT)'; \ + b='json-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +lfe-filter-test.log: lfe-filter-test$(EXEEXT) + @p='lfe-filter-test$(EXEEXT)'; \ + b='lfe-filter-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +lock-autospawn-test.log: lock-autospawn-test$(EXEEXT) + @p='lock-autospawn-test$(EXEEXT)'; \ + b='lock-autospawn-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +mainloop-test.log: mainloop-test$(EXEEXT) + @p='mainloop-test$(EXEEXT)'; \ + b='mainloop-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +memblock-test.log: memblock-test$(EXEEXT) + @p='memblock-test$(EXEEXT)'; \ + b='memblock-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +memblockq-test.log: memblockq-test$(EXEEXT) + @p='memblockq-test$(EXEEXT)'; \ + b='memblockq-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +mix-test.log: mix-test$(EXEEXT) + @p='mix-test$(EXEEXT)'; \ + b='mix-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +mult-s16-test.log: mult-s16-test$(EXEEXT) + @p='mult-s16-test$(EXEEXT)'; \ + b='mult-s16-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +proplist-test.log: proplist-test$(EXEEXT) + @p='proplist-test$(EXEEXT)'; \ + b='proplist-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +queue-test.log: queue-test$(EXEEXT) + @p='queue-test$(EXEEXT)'; \ + b='queue-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +resampler-test.log: resampler-test$(EXEEXT) + @p='resampler-test$(EXEEXT)'; \ + b='resampler-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +rtpoll-test.log: rtpoll-test$(EXEEXT) + @p='rtpoll-test$(EXEEXT)'; \ + b='rtpoll-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +smoother-test.log: smoother-test$(EXEEXT) + @p='smoother-test$(EXEEXT)'; \ + b='smoother-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +strlist-test.log: strlist-test$(EXEEXT) + @p='strlist-test$(EXEEXT)'; \ + b='strlist-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +thread-mainloop-test.log: thread-mainloop-test$(EXEEXT) + @p='thread-mainloop-test$(EXEEXT)'; \ + b='thread-mainloop-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +thread-test.log: thread-test$(EXEEXT) + @p='thread-test$(EXEEXT)'; \ + b='thread-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +utf8-test.log: utf8-test$(EXEEXT) + @p='utf8-test$(EXEEXT)'; \ + b='utf8-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +volume-test.log: volume-test$(EXEEXT) + @p='volume-test$(EXEEXT)'; \ + b='volume-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +sigbus-test.log: sigbus-test$(EXEEXT) + @p='sigbus-test$(EXEEXT)'; \ + b='sigbus-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +usergroup-test.log: usergroup-test$(EXEEXT) + @p='usergroup-test$(EXEEXT)'; \ + b='usergroup-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +srbchannel-test.log: srbchannel-test$(EXEEXT) + @p='srbchannel-test$(EXEEXT)'; \ + b='srbchannel-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +once-test.log: once-test$(EXEEXT) + @p='once-test$(EXEEXT)'; \ + b='once-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +mainloop-test-glib.log: mainloop-test-glib$(EXEEXT) + @p='mainloop-test-glib$(EXEEXT)'; \ + b='mainloop-test-glib'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +alsa-mixer-path-test.log: alsa-mixer-path-test$(EXEEXT) + @p='alsa-mixer-path-test$(EXEEXT)'; \ + b='alsa-mixer-path-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(SCRIPTS) $(DATA) \ + $(HEADERS) +install-binPROGRAMS: install-libLTLIBRARIES + +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pulselibexecdir)" "$(DESTDIR)$(commonlibdir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(modlibexecdir)" "$(DESTDIR)$(padsplibdir)" "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(dbuspolicydir)" "$(DESTDIR)$(alsapathsdir)" "$(DESTDIR)$(alsaprofilesetsdir)" "$(DESTDIR)$(udevrulesdir)" "$(DESTDIR)$(gsettingsdataconvertdir)" "$(DESTDIR)$(pulseconfdir)" "$(DESTDIR)$(systemduserunitdir)" "$(DESTDIR)$(xdgautostartdir)" "$(DESTDIR)$(pulseincludedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f daemon/$(DEPDIR)/$(am__dirstamp) + -rm -f daemon/$(am__dirstamp) + -rm -f modules/$(DEPDIR)/$(am__dirstamp) + -rm -f modules/$(am__dirstamp) + -rm -f modules/alsa/$(DEPDIR)/$(am__dirstamp) + -rm -f modules/alsa/$(am__dirstamp) + -rm -f modules/bluetooth/$(DEPDIR)/$(am__dirstamp) + -rm -f modules/bluetooth/$(am__dirstamp) + -rm -f modules/dbus/$(DEPDIR)/$(am__dirstamp) + -rm -f modules/dbus/$(am__dirstamp) + -rm -f modules/echo-cancel/$(DEPDIR)/$(am__dirstamp) + -rm -f modules/echo-cancel/$(am__dirstamp) + -rm -f modules/gconf/$(DEPDIR)/$(am__dirstamp) + -rm -f modules/gconf/$(am__dirstamp) + -rm -f modules/gsettings/$(DEPDIR)/$(am__dirstamp) + -rm -f modules/gsettings/$(am__dirstamp) + -rm -f modules/jack/$(DEPDIR)/$(am__dirstamp) + -rm -f modules/jack/$(am__dirstamp) + -rm -f modules/macosx/$(DEPDIR)/$(am__dirstamp) + -rm -f modules/macosx/$(am__dirstamp) + -rm -f modules/oss/$(DEPDIR)/$(am__dirstamp) + -rm -f modules/oss/$(am__dirstamp) + -rm -f modules/raop/$(DEPDIR)/$(am__dirstamp) + -rm -f modules/raop/$(am__dirstamp) + -rm -f modules/rtp/$(DEPDIR)/$(am__dirstamp) + -rm -f modules/rtp/$(am__dirstamp) + -rm -f modules/x11/$(DEPDIR)/$(am__dirstamp) + -rm -f modules/x11/$(am__dirstamp) + -rm -f pulse/$(DEPDIR)/$(am__dirstamp) + -rm -f pulse/$(am__dirstamp) + -rm -f pulsecore/$(DEPDIR)/$(am__dirstamp) + -rm -f pulsecore/$(am__dirstamp) + -rm -f pulsecore/ffmpeg/$(DEPDIR)/$(am__dirstamp) + -rm -f pulsecore/ffmpeg/$(am__dirstamp) + -rm -f pulsecore/filter/$(DEPDIR)/$(am__dirstamp) + -rm -f pulsecore/filter/$(am__dirstamp) + -rm -f pulsecore/resampler/$(DEPDIR)/$(am__dirstamp) + -rm -f pulsecore/resampler/$(am__dirstamp) + -rm -f tests/$(DEPDIR)/$(am__dirstamp) + -rm -f tests/$(am__dirstamp) + -rm -f utils/$(DEPDIR)/$(am__dirstamp) + -rm -f utils/$(am__dirstamp) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-binPROGRAMS clean-checkPROGRAMS \ + clean-commonlibLTLIBRARIES clean-generic clean-libLTLIBRARIES \ + clean-libtool clean-modlibexecLTLIBRARIES \ + clean-noinstLTLIBRARIES clean-noinstPROGRAMS \ + clean-padsplibLTLIBRARIES clean-pkglibLTLIBRARIES \ + clean-pulselibexecPROGRAMS mostlyclean-am + +distclean: distclean-am + -rm -f daemon/$(DEPDIR)/cpulimit_test-cpulimit.Po + -rm -f daemon/$(DEPDIR)/cpulimit_test2-cpulimit.Po + -rm -f daemon/$(DEPDIR)/pulseaudio-caps.Po + -rm -f daemon/$(DEPDIR)/pulseaudio-cmdline.Po + -rm -f daemon/$(DEPDIR)/pulseaudio-cpulimit.Po + -rm -f daemon/$(DEPDIR)/pulseaudio-daemon-conf.Po + -rm -f daemon/$(DEPDIR)/pulseaudio-dumpmodules.Po + -rm -f daemon/$(DEPDIR)/pulseaudio-ltdl-bind-now.Po + -rm -f daemon/$(DEPDIR)/pulseaudio-main.Po + -rm -f daemon/$(DEPDIR)/pulseaudio-server-lookup.Po + -rm -f modules/$(DEPDIR)/libalsa_util_la-reserve-monitor.Plo + -rm -f modules/$(DEPDIR)/libalsa_util_la-reserve-wrap.Plo + -rm -f modules/$(DEPDIR)/libalsa_util_la-reserve.Plo + -rm -f modules/$(DEPDIR)/libalsa_util_la-udev-util.Plo + -rm -f modules/$(DEPDIR)/module_allow_passthrough_la-module-allow-passthrough.Plo + -rm -f modules/$(DEPDIR)/module_always_sink_la-module-always-sink.Plo + -rm -f modules/$(DEPDIR)/module_always_source_la-module-always-source.Plo + -rm -f modules/$(DEPDIR)/module_augment_properties_la-module-augment-properties.Plo + -rm -f modules/$(DEPDIR)/module_card_restore_la-module-card-restore.Plo + -rm -f modules/$(DEPDIR)/module_cli_la-module-cli.Plo + -rm -f modules/$(DEPDIR)/module_cli_protocol_tcp_la-module-protocol-stub.Plo + -rm -f modules/$(DEPDIR)/module_cli_protocol_unix_la-module-protocol-stub.Plo + -rm -f modules/$(DEPDIR)/module_combine_la-module-combine.Plo + -rm -f modules/$(DEPDIR)/module_combine_sink_la-module-combine-sink.Plo + -rm -f modules/$(DEPDIR)/module_console_kit_la-module-console-kit.Plo + -rm -f modules/$(DEPDIR)/module_default_device_restore_la-module-default-device-restore.Plo + -rm -f modules/$(DEPDIR)/module_detect_la-module-detect.Plo + -rm -f modules/$(DEPDIR)/module_device_manager_la-module-device-manager.Plo + -rm -f modules/$(DEPDIR)/module_device_restore_la-module-device-restore.Plo + -rm -f modules/$(DEPDIR)/module_equalizer_sink_la-module-equalizer-sink.Plo + -rm -f modules/$(DEPDIR)/module_esound_compat_spawnfd_la-module-esound-compat-spawnfd.Plo + -rm -f modules/$(DEPDIR)/module_esound_compat_spawnpid_la-module-esound-compat-spawnpid.Plo + -rm -f modules/$(DEPDIR)/module_esound_protocol_tcp_la-module-protocol-stub.Plo + -rm -f modules/$(DEPDIR)/module_esound_protocol_unix_la-module-protocol-stub.Plo + -rm -f modules/$(DEPDIR)/module_esound_sink_la-module-esound-sink.Plo + -rm -f modules/$(DEPDIR)/module_filter_apply_la-module-filter-apply.Plo + -rm -f modules/$(DEPDIR)/module_filter_heuristics_la-module-filter-heuristics.Plo + -rm -f modules/$(DEPDIR)/module_gconf_la-stdin-util.Plo + -rm -f modules/$(DEPDIR)/module_gsettings_la-stdin-util.Plo + -rm -f modules/$(DEPDIR)/module_hal_detect_la-module-hal-detect-compat.Plo + -rm -f modules/$(DEPDIR)/module_http_protocol_tcp_la-module-protocol-stub.Plo + -rm -f modules/$(DEPDIR)/module_http_protocol_unix_la-module-protocol-stub.Plo + -rm -f modules/$(DEPDIR)/module_intended_roles_la-module-intended-roles.Plo + -rm -f modules/$(DEPDIR)/module_ladspa_sink_la-module-ladspa-sink.Plo + -rm -f modules/$(DEPDIR)/module_lirc_la-module-lirc.Plo + -rm -f modules/$(DEPDIR)/module_loopback_la-module-loopback.Plo + -rm -f modules/$(DEPDIR)/module_match_la-module-match.Plo + -rm -f modules/$(DEPDIR)/module_mmkbd_evdev_la-module-mmkbd-evdev.Plo + -rm -f modules/$(DEPDIR)/module_native_protocol_fd_la-module-native-protocol-fd.Plo + -rm -f modules/$(DEPDIR)/module_native_protocol_tcp_la-module-protocol-stub.Plo + -rm -f modules/$(DEPDIR)/module_native_protocol_unix_la-module-protocol-stub.Plo + -rm -f modules/$(DEPDIR)/module_null_sink_la-module-null-sink.Plo + -rm -f modules/$(DEPDIR)/module_null_source_la-module-null-source.Plo + -rm -f modules/$(DEPDIR)/module_pipe_sink_la-module-pipe-sink.Plo + -rm -f modules/$(DEPDIR)/module_pipe_source_la-module-pipe-source.Plo + -rm -f modules/$(DEPDIR)/module_position_event_sounds_la-module-position-event-sounds.Plo + -rm -f modules/$(DEPDIR)/module_remap_sink_la-module-remap-sink.Plo + -rm -f modules/$(DEPDIR)/module_remap_source_la-module-remap-source.Plo + -rm -f modules/$(DEPDIR)/module_rescue_streams_la-module-rescue-streams.Plo + -rm -f modules/$(DEPDIR)/module_role_cork_la-module-role-cork.Plo + -rm -f modules/$(DEPDIR)/module_role_cork_la-stream-interaction.Plo + -rm -f modules/$(DEPDIR)/module_role_ducking_la-module-role-ducking.Plo + -rm -f modules/$(DEPDIR)/module_role_ducking_la-stream-interaction.Plo + -rm -f modules/$(DEPDIR)/module_rygel_media_server_la-module-rygel-media-server.Plo + -rm -f modules/$(DEPDIR)/module_simple_protocol_tcp_la-module-protocol-stub.Plo + -rm -f modules/$(DEPDIR)/module_simple_protocol_unix_la-module-protocol-stub.Plo + -rm -f modules/$(DEPDIR)/module_sine_la-module-sine.Plo + -rm -f modules/$(DEPDIR)/module_sine_source_la-module-sine-source.Plo + -rm -f modules/$(DEPDIR)/module_solaris_la-module-solaris.Plo + -rm -f modules/$(DEPDIR)/module_stream_restore_la-module-stream-restore.Plo + -rm -f modules/$(DEPDIR)/module_suspend_on_idle_la-module-suspend-on-idle.Plo + -rm -f modules/$(DEPDIR)/module_switch_on_connect_la-module-switch-on-connect.Plo + -rm -f modules/$(DEPDIR)/module_switch_on_port_available_la-module-switch-on-port-available.Plo + -rm -f modules/$(DEPDIR)/module_systemd_login_la-module-systemd-login.Plo + -rm -f modules/$(DEPDIR)/module_tunnel_sink_la-module-tunnel.Plo + -rm -f modules/$(DEPDIR)/module_tunnel_sink_new_la-module-tunnel-sink-new.Plo + -rm -f modules/$(DEPDIR)/module_tunnel_source_la-module-tunnel.Plo + -rm -f modules/$(DEPDIR)/module_tunnel_source_new_la-module-tunnel-source-new.Plo + -rm -f modules/$(DEPDIR)/module_udev_detect_la-module-udev-detect.Plo + -rm -f modules/$(DEPDIR)/module_virtual_sink_la-module-virtual-sink.Plo + -rm -f modules/$(DEPDIR)/module_virtual_source_la-module-virtual-source.Plo + -rm -f modules/$(DEPDIR)/module_virtual_surround_sink_la-module-virtual-surround-sink.Plo + -rm -f modules/$(DEPDIR)/module_volume_restore_la-module-volume-restore.Plo + -rm -f modules/$(DEPDIR)/module_waveout_la-module-waveout.Plo + -rm -f modules/$(DEPDIR)/module_zeroconf_discover_la-module-zeroconf-discover.Plo + -rm -f modules/$(DEPDIR)/module_zeroconf_publish_la-module-zeroconf-publish.Plo + -rm -f modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-mixer.Plo + -rm -f modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-sink.Plo + -rm -f modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-source.Plo + -rm -f modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-ucm.Plo + -rm -f modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-util.Plo + -rm -f modules/alsa/$(DEPDIR)/module_alsa_card_la-module-alsa-card.Plo + -rm -f modules/alsa/$(DEPDIR)/module_alsa_sink_la-module-alsa-sink.Plo + -rm -f modules/alsa/$(DEPDIR)/module_alsa_source_la-module-alsa-source.Plo + -rm -f modules/bluetooth/$(DEPDIR)/libbluez5_util_la-a2dp-codec-sbc.Plo + -rm -f modules/bluetooth/$(DEPDIR)/libbluez5_util_la-a2dp-codec-util.Plo + -rm -f modules/bluetooth/$(DEPDIR)/libbluez5_util_la-backend-native.Plo + -rm -f modules/bluetooth/$(DEPDIR)/libbluez5_util_la-backend-ofono.Plo + -rm -f modules/bluetooth/$(DEPDIR)/libbluez5_util_la-bluez5-util.Plo + -rm -f modules/bluetooth/$(DEPDIR)/module_bluetooth_discover_la-module-bluetooth-discover.Plo + -rm -f modules/bluetooth/$(DEPDIR)/module_bluetooth_policy_la-module-bluetooth-policy.Plo + -rm -f modules/bluetooth/$(DEPDIR)/module_bluez5_device_la-module-bluez5-device.Plo + -rm -f modules/bluetooth/$(DEPDIR)/module_bluez5_discover_la-module-bluez5-discover.Plo + -rm -f modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-card-profile.Plo + -rm -f modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-card.Plo + -rm -f modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-client.Plo + -rm -f modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-core.Plo + -rm -f modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-device-port.Plo + -rm -f modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-device.Plo + -rm -f modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-memstats.Plo + -rm -f modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-module.Plo + -rm -f modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-sample.Plo + -rm -f modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-stream.Plo + -rm -f modules/dbus/$(DEPDIR)/module_dbus_protocol_la-module-dbus-protocol.Plo + -rm -f modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian-aec-orc-gen.Po + -rm -f modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian-aec.Po + -rm -f modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian.Po + -rm -f modules/echo-cancel/$(DEPDIR)/echo_cancel_test-module-echo-cancel.Po + -rm -f modules/echo-cancel/$(DEPDIR)/echo_cancel_test-null.Po + -rm -f modules/echo-cancel/$(DEPDIR)/echo_cancel_test-speex.Po + -rm -f modules/echo-cancel/$(DEPDIR)/libwebrtc_util_la-webrtc.Plo + -rm -f modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-adrian-aec-orc-gen.Plo + -rm -f modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-adrian-aec.Plo + -rm -f modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-adrian.Plo + -rm -f modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-module-echo-cancel.Plo + -rm -f modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-null.Plo + -rm -f modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-speex.Plo + -rm -f modules/gconf/$(DEPDIR)/gconf_helper-gconf-helper.Po + -rm -f modules/gconf/$(DEPDIR)/module_gconf_la-module-gconf.Plo + -rm -f modules/gsettings/$(DEPDIR)/gsettings_helper-gsettings-helper.Po + -rm -f modules/gsettings/$(DEPDIR)/module_gsettings_la-module-gsettings.Plo + -rm -f modules/jack/$(DEPDIR)/module_jack_sink_la-module-jack-sink.Plo + -rm -f modules/jack/$(DEPDIR)/module_jack_source_la-module-jack-source.Plo + -rm -f modules/jack/$(DEPDIR)/module_jackdbus_detect_la-module-jackdbus-detect.Plo + -rm -f modules/macosx/$(DEPDIR)/module_bonjour_publish_la-module-bonjour-publish.Plo + -rm -f modules/macosx/$(DEPDIR)/module_coreaudio_detect_la-module-coreaudio-detect.Plo + -rm -f modules/macosx/$(DEPDIR)/module_coreaudio_device_la-module-coreaudio-device.Plo + -rm -f modules/oss/$(DEPDIR)/module_oss_la-module-oss.Plo + -rm -f modules/oss/$(DEPDIR)/oss-util.Plo + -rm -f modules/raop/$(DEPDIR)/libraop_la-raop-client.Plo + -rm -f modules/raop/$(DEPDIR)/libraop_la-raop-crypto.Plo + -rm -f modules/raop/$(DEPDIR)/libraop_la-raop-packet-buffer.Plo + -rm -f modules/raop/$(DEPDIR)/libraop_la-raop-sink.Plo + -rm -f modules/raop/$(DEPDIR)/libraop_la-raop-util.Plo + -rm -f modules/raop/$(DEPDIR)/module_raop_discover_la-module-raop-discover.Plo + -rm -f modules/raop/$(DEPDIR)/module_raop_sink_la-module-raop-sink.Plo + -rm -f modules/rtp/$(DEPDIR)/librtp_la-headerlist.Plo + -rm -f modules/rtp/$(DEPDIR)/librtp_la-rtp-common.Plo + -rm -f modules/rtp/$(DEPDIR)/librtp_la-rtp-gstreamer.Plo + -rm -f modules/rtp/$(DEPDIR)/librtp_la-rtp-native.Plo + -rm -f modules/rtp/$(DEPDIR)/librtp_la-rtsp_client.Plo + -rm -f modules/rtp/$(DEPDIR)/librtp_la-sap.Plo + -rm -f modules/rtp/$(DEPDIR)/librtp_la-sdp.Plo + -rm -f modules/rtp/$(DEPDIR)/module_rtp_recv_la-module-rtp-recv.Plo + -rm -f modules/rtp/$(DEPDIR)/module_rtp_send_la-module-rtp-send.Plo + -rm -f modules/x11/$(DEPDIR)/module_x11_bell_la-module-x11-bell.Plo + -rm -f modules/x11/$(DEPDIR)/module_x11_cork_request_la-module-x11-cork-request.Plo + -rm -f modules/x11/$(DEPDIR)/module_x11_publish_la-module-x11-publish.Plo + -rm -f modules/x11/$(DEPDIR)/module_x11_xsmp_la-module-x11-xsmp.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-channelmap.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-context.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-direction.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-error.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-ext-device-manager.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-ext-device-restore.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-ext-stream-restore.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-format.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-introspect.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-mainloop-api.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-mainloop-signal.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-mainloop.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-operation.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-proplist.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-rtclock.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-sample.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-scache.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-stream.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-subscribe.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-thread-mainloop.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-timeval.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-utf8.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-util.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-volume.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-xmalloc.Plo + -rm -f pulse/$(DEPDIR)/libpulse_mainloop_glib_la-glib-mainloop.Plo + -rm -f pulse/$(DEPDIR)/libpulse_simple_la-simple.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-channelmap.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-client-conf-x11.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-client-conf.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-fork-detect.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-format.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-json.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-proplist.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-rtclock.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-sample.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-timeval.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-utf8.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-util.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-volume.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-xmalloc.Plo + -rm -f pulsecore/$(DEPDIR)/cli.Plo + -rm -f pulsecore/$(DEPDIR)/libavahi_wrap_la-avahi-wrap.Plo + -rm -f pulsecore/$(DEPDIR)/libprotocol_native_la-protocol-native.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-arpa-inet.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-aupdate.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-authkey.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-bitset.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-conf-parser.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-error.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-format.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-rtclock.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-util.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-dbus-util.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-dllmain.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-dynarray.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-fdsem.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-flist.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-g711.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-hashmap.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-i18n.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-idxset.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-iochannel.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-ioline.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-ipacl.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-lock-autospawn.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-log.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-mcalign.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memblock.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memblockq.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memchunk.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memtrap.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-mutex-posix.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-mutex-win32.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-native-common.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-once.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-packet.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-parseaddr.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pdispatch.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pid.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pipe.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-poll-posix.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-poll-win32.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-proplist-util.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pstream-util.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pstream.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-queue.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-random.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-ratelimit.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-rtkit.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-sample-util.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-osx.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-posix.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-win32.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-shm.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-sndfile-util.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-socket-client.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-socket-server.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-socket-util.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-srbchannel.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-strbuf.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-strlist.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-tagstruct.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-thread-posix.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-thread-win32.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-time-smoother.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-tokenizer.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-usergroup.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-x11prop.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-asyncmsgq.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-asyncq.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-auth-cookie.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-card.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cli-command.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cli-text.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-client.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-core-scache.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-core-subscribe.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-core.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu-arm.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu-orc.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu-x86.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database-gdbm.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database-simple.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database-tdb.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-dbus-shared.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-device-port.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-hook-list.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-ltdl-helper.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-message-handler.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-mix.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-modargs.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-modinfo.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-module.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-msgobject.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-namereg.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-object.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-play-memblockq.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-play-memchunk.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-protocol-dbus.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-remap.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-remap_mmx.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-remap_sse.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-resampler.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-rtpoll.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16be.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16le.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv_sse.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-shared.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sink-input.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sink.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sioman.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sound-file-stream.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sound-file.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-source-output.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-source.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-start-child.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-stream-util.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume-orc-gen.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_arm.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_c.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_mmx.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_orc.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_sse.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-thread-mq.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-x11wrap.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_mix_neon_la-mix_neon.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_remap_neon_la-remap_neon.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_sconv_neon_la-sconv_neon.Plo + -rm -f pulsecore/$(DEPDIR)/mime-type.Plo + -rm -f pulsecore/$(DEPDIR)/protocol-cli.Plo + -rm -f pulsecore/$(DEPDIR)/protocol-esound.Plo + -rm -f pulsecore/$(DEPDIR)/protocol-http.Plo + -rm -f pulsecore/$(DEPDIR)/protocol-simple.Plo + -rm -f pulsecore/ffmpeg/$(DEPDIR)/libpulsecore_foreign_la-resample2.Plo + -rm -f pulsecore/filter/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-biquad.Plo + -rm -f pulsecore/filter/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-crossover.Plo + -rm -f pulsecore/filter/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-lfe-filter.Plo + -rm -f pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-ffmpeg.Plo + -rm -f pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-libsamplerate.Plo + -rm -f pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-peaks.Plo + -rm -f pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-soxr.Plo + -rm -f pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-speex.Plo + -rm -f pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-trivial.Plo + -rm -f tests/$(DEPDIR)/alsa_mixer_path_test-alsa-mixer-path-test.Po + -rm -f tests/$(DEPDIR)/alsa_time_test-alsa-time-test.Po + -rm -f tests/$(DEPDIR)/asyncmsgq_test-asyncmsgq-test.Po + -rm -f tests/$(DEPDIR)/asyncq_test-asyncq-test.Po + -rm -f tests/$(DEPDIR)/atomic_test-atomic-test.Po + -rm -f tests/$(DEPDIR)/channelmap_test-channelmap-test.Po + -rm -f tests/$(DEPDIR)/close_test-close-test.Po + -rm -f tests/$(DEPDIR)/connect_stress-connect-stress.Po + -rm -f tests/$(DEPDIR)/core_util_test-core-util-test.Po + -rm -f tests/$(DEPDIR)/cpu_mix_test-cpu-mix-test.Po + -rm -f tests/$(DEPDIR)/cpu_remap_test-cpu-remap-test.Po + -rm -f tests/$(DEPDIR)/cpu_sconv_test-cpu-sconv-test.Po + -rm -f tests/$(DEPDIR)/cpu_volume_test-cpu-volume-test.Po + -rm -f tests/$(DEPDIR)/cpulimit_test-cpulimit-test.Po + -rm -f tests/$(DEPDIR)/cpulimit_test2-cpulimit-test.Po + -rm -f tests/$(DEPDIR)/extended_test-extended-test.Po + -rm -f tests/$(DEPDIR)/flist_test-flist-test.Po + -rm -f tests/$(DEPDIR)/format_test-format-test.Po + -rm -f tests/$(DEPDIR)/get_binary_name_test-get-binary-name-test.Po + -rm -f tests/$(DEPDIR)/gtk_test-gtk-test.Po + -rm -f tests/$(DEPDIR)/hashmap_test-hashmap-test.Po + -rm -f tests/$(DEPDIR)/hook_list_test-hook-list-test.Po + -rm -f tests/$(DEPDIR)/interpol_test-interpol-test.Po + -rm -f tests/$(DEPDIR)/ipacl_test-ipacl-test.Po + -rm -f tests/$(DEPDIR)/json_test-json-test.Po + -rm -f tests/$(DEPDIR)/lfe_filter_test-lfe-filter-test.Po + -rm -f tests/$(DEPDIR)/lo-test-util.Plo + -rm -f tests/$(DEPDIR)/lo_latency_test-lo-latency-test.Po + -rm -f tests/$(DEPDIR)/lock_autospawn_test-lock-autospawn-test.Po + -rm -f tests/$(DEPDIR)/mainloop_test-mainloop-test.Po + -rm -f tests/$(DEPDIR)/mainloop_test_glib-mainloop-test.Po + -rm -f tests/$(DEPDIR)/mcalign_test-mcalign-test.Po + -rm -f tests/$(DEPDIR)/memblock_test-memblock-test.Po + -rm -f tests/$(DEPDIR)/memblockq_test-memblockq-test.Po + -rm -f tests/$(DEPDIR)/mix_test-mix-test.Po + -rm -f tests/$(DEPDIR)/mult_s16_test-mult-s16-test.Po + -rm -f tests/$(DEPDIR)/once_test-once-test.Po + -rm -f tests/$(DEPDIR)/pacat_simple-pacat-simple.Po + -rm -f tests/$(DEPDIR)/parec_simple-parec-simple.Po + -rm -f tests/$(DEPDIR)/passthrough_test-passthrough-test.Po + -rm -f tests/$(DEPDIR)/proplist_test-proplist-test.Po + -rm -f tests/$(DEPDIR)/queue_test-queue-test.Po + -rm -f tests/$(DEPDIR)/remix_test-remix-test.Po + -rm -f tests/$(DEPDIR)/resampler_test-resampler-test.Po + -rm -f tests/$(DEPDIR)/rtpoll_test-rtpoll-test.Po + -rm -f tests/$(DEPDIR)/rtstutter-rtstutter.Po + -rm -f tests/$(DEPDIR)/sig2str_test-sig2str-test.Po + -rm -f tests/$(DEPDIR)/sigbus_test-sigbus-test.Po + -rm -f tests/$(DEPDIR)/smoother_test-smoother-test.Po + -rm -f tests/$(DEPDIR)/srbchannel_test-srbchannel-test.Po + -rm -f tests/$(DEPDIR)/stripnul-stripnul.Po + -rm -f tests/$(DEPDIR)/strlist_test-strlist-test.Po + -rm -f tests/$(DEPDIR)/sync_playback-sync-playback.Po + -rm -f tests/$(DEPDIR)/thread_mainloop_test-thread-mainloop-test.Po + -rm -f tests/$(DEPDIR)/thread_test-thread-test.Po + -rm -f tests/$(DEPDIR)/usergroup_test-usergroup-test.Po + -rm -f tests/$(DEPDIR)/utf8_test-utf8-test.Po + -rm -f tests/$(DEPDIR)/volume_test-volume-test.Po + -rm -f utils/$(DEPDIR)/libpulsedsp_la-padsp.Plo + -rm -f utils/$(DEPDIR)/pacat-pacat.Po + -rm -f utils/$(DEPDIR)/pacmd-pacmd.Po + -rm -f utils/$(DEPDIR)/pactl-pactl.Po + -rm -f utils/$(DEPDIR)/pasuspender-pasuspender.Po + -rm -f utils/$(DEPDIR)/pax11publish-pax11publish.Po + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-commonlibLTLIBRARIES install-dbuspolicyDATA \ + install-dist_alsapathsDATA install-dist_alsaprofilesetsDATA \ + install-dist_udevrulesDATA install-gsettingsdataconvertDATA \ + install-padsplibLTLIBRARIES install-pulseconfDATA \ + install-pulseincludeHEADERS install-systemduserunitDATA \ + install-xdgautostartDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS install-binSCRIPTS \ + install-libLTLIBRARIES install-modlibexecLTLIBRARIES \ + install-pkglibLTLIBRARIES install-pulselibexecPROGRAMS + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f daemon/$(DEPDIR)/cpulimit_test-cpulimit.Po + -rm -f daemon/$(DEPDIR)/cpulimit_test2-cpulimit.Po + -rm -f daemon/$(DEPDIR)/pulseaudio-caps.Po + -rm -f daemon/$(DEPDIR)/pulseaudio-cmdline.Po + -rm -f daemon/$(DEPDIR)/pulseaudio-cpulimit.Po + -rm -f daemon/$(DEPDIR)/pulseaudio-daemon-conf.Po + -rm -f daemon/$(DEPDIR)/pulseaudio-dumpmodules.Po + -rm -f daemon/$(DEPDIR)/pulseaudio-ltdl-bind-now.Po + -rm -f daemon/$(DEPDIR)/pulseaudio-main.Po + -rm -f daemon/$(DEPDIR)/pulseaudio-server-lookup.Po + -rm -f modules/$(DEPDIR)/libalsa_util_la-reserve-monitor.Plo + -rm -f modules/$(DEPDIR)/libalsa_util_la-reserve-wrap.Plo + -rm -f modules/$(DEPDIR)/libalsa_util_la-reserve.Plo + -rm -f modules/$(DEPDIR)/libalsa_util_la-udev-util.Plo + -rm -f modules/$(DEPDIR)/module_allow_passthrough_la-module-allow-passthrough.Plo + -rm -f modules/$(DEPDIR)/module_always_sink_la-module-always-sink.Plo + -rm -f modules/$(DEPDIR)/module_always_source_la-module-always-source.Plo + -rm -f modules/$(DEPDIR)/module_augment_properties_la-module-augment-properties.Plo + -rm -f modules/$(DEPDIR)/module_card_restore_la-module-card-restore.Plo + -rm -f modules/$(DEPDIR)/module_cli_la-module-cli.Plo + -rm -f modules/$(DEPDIR)/module_cli_protocol_tcp_la-module-protocol-stub.Plo + -rm -f modules/$(DEPDIR)/module_cli_protocol_unix_la-module-protocol-stub.Plo + -rm -f modules/$(DEPDIR)/module_combine_la-module-combine.Plo + -rm -f modules/$(DEPDIR)/module_combine_sink_la-module-combine-sink.Plo + -rm -f modules/$(DEPDIR)/module_console_kit_la-module-console-kit.Plo + -rm -f modules/$(DEPDIR)/module_default_device_restore_la-module-default-device-restore.Plo + -rm -f modules/$(DEPDIR)/module_detect_la-module-detect.Plo + -rm -f modules/$(DEPDIR)/module_device_manager_la-module-device-manager.Plo + -rm -f modules/$(DEPDIR)/module_device_restore_la-module-device-restore.Plo + -rm -f modules/$(DEPDIR)/module_equalizer_sink_la-module-equalizer-sink.Plo + -rm -f modules/$(DEPDIR)/module_esound_compat_spawnfd_la-module-esound-compat-spawnfd.Plo + -rm -f modules/$(DEPDIR)/module_esound_compat_spawnpid_la-module-esound-compat-spawnpid.Plo + -rm -f modules/$(DEPDIR)/module_esound_protocol_tcp_la-module-protocol-stub.Plo + -rm -f modules/$(DEPDIR)/module_esound_protocol_unix_la-module-protocol-stub.Plo + -rm -f modules/$(DEPDIR)/module_esound_sink_la-module-esound-sink.Plo + -rm -f modules/$(DEPDIR)/module_filter_apply_la-module-filter-apply.Plo + -rm -f modules/$(DEPDIR)/module_filter_heuristics_la-module-filter-heuristics.Plo + -rm -f modules/$(DEPDIR)/module_gconf_la-stdin-util.Plo + -rm -f modules/$(DEPDIR)/module_gsettings_la-stdin-util.Plo + -rm -f modules/$(DEPDIR)/module_hal_detect_la-module-hal-detect-compat.Plo + -rm -f modules/$(DEPDIR)/module_http_protocol_tcp_la-module-protocol-stub.Plo + -rm -f modules/$(DEPDIR)/module_http_protocol_unix_la-module-protocol-stub.Plo + -rm -f modules/$(DEPDIR)/module_intended_roles_la-module-intended-roles.Plo + -rm -f modules/$(DEPDIR)/module_ladspa_sink_la-module-ladspa-sink.Plo + -rm -f modules/$(DEPDIR)/module_lirc_la-module-lirc.Plo + -rm -f modules/$(DEPDIR)/module_loopback_la-module-loopback.Plo + -rm -f modules/$(DEPDIR)/module_match_la-module-match.Plo + -rm -f modules/$(DEPDIR)/module_mmkbd_evdev_la-module-mmkbd-evdev.Plo + -rm -f modules/$(DEPDIR)/module_native_protocol_fd_la-module-native-protocol-fd.Plo + -rm -f modules/$(DEPDIR)/module_native_protocol_tcp_la-module-protocol-stub.Plo + -rm -f modules/$(DEPDIR)/module_native_protocol_unix_la-module-protocol-stub.Plo + -rm -f modules/$(DEPDIR)/module_null_sink_la-module-null-sink.Plo + -rm -f modules/$(DEPDIR)/module_null_source_la-module-null-source.Plo + -rm -f modules/$(DEPDIR)/module_pipe_sink_la-module-pipe-sink.Plo + -rm -f modules/$(DEPDIR)/module_pipe_source_la-module-pipe-source.Plo + -rm -f modules/$(DEPDIR)/module_position_event_sounds_la-module-position-event-sounds.Plo + -rm -f modules/$(DEPDIR)/module_remap_sink_la-module-remap-sink.Plo + -rm -f modules/$(DEPDIR)/module_remap_source_la-module-remap-source.Plo + -rm -f modules/$(DEPDIR)/module_rescue_streams_la-module-rescue-streams.Plo + -rm -f modules/$(DEPDIR)/module_role_cork_la-module-role-cork.Plo + -rm -f modules/$(DEPDIR)/module_role_cork_la-stream-interaction.Plo + -rm -f modules/$(DEPDIR)/module_role_ducking_la-module-role-ducking.Plo + -rm -f modules/$(DEPDIR)/module_role_ducking_la-stream-interaction.Plo + -rm -f modules/$(DEPDIR)/module_rygel_media_server_la-module-rygel-media-server.Plo + -rm -f modules/$(DEPDIR)/module_simple_protocol_tcp_la-module-protocol-stub.Plo + -rm -f modules/$(DEPDIR)/module_simple_protocol_unix_la-module-protocol-stub.Plo + -rm -f modules/$(DEPDIR)/module_sine_la-module-sine.Plo + -rm -f modules/$(DEPDIR)/module_sine_source_la-module-sine-source.Plo + -rm -f modules/$(DEPDIR)/module_solaris_la-module-solaris.Plo + -rm -f modules/$(DEPDIR)/module_stream_restore_la-module-stream-restore.Plo + -rm -f modules/$(DEPDIR)/module_suspend_on_idle_la-module-suspend-on-idle.Plo + -rm -f modules/$(DEPDIR)/module_switch_on_connect_la-module-switch-on-connect.Plo + -rm -f modules/$(DEPDIR)/module_switch_on_port_available_la-module-switch-on-port-available.Plo + -rm -f modules/$(DEPDIR)/module_systemd_login_la-module-systemd-login.Plo + -rm -f modules/$(DEPDIR)/module_tunnel_sink_la-module-tunnel.Plo + -rm -f modules/$(DEPDIR)/module_tunnel_sink_new_la-module-tunnel-sink-new.Plo + -rm -f modules/$(DEPDIR)/module_tunnel_source_la-module-tunnel.Plo + -rm -f modules/$(DEPDIR)/module_tunnel_source_new_la-module-tunnel-source-new.Plo + -rm -f modules/$(DEPDIR)/module_udev_detect_la-module-udev-detect.Plo + -rm -f modules/$(DEPDIR)/module_virtual_sink_la-module-virtual-sink.Plo + -rm -f modules/$(DEPDIR)/module_virtual_source_la-module-virtual-source.Plo + -rm -f modules/$(DEPDIR)/module_virtual_surround_sink_la-module-virtual-surround-sink.Plo + -rm -f modules/$(DEPDIR)/module_volume_restore_la-module-volume-restore.Plo + -rm -f modules/$(DEPDIR)/module_waveout_la-module-waveout.Plo + -rm -f modules/$(DEPDIR)/module_zeroconf_discover_la-module-zeroconf-discover.Plo + -rm -f modules/$(DEPDIR)/module_zeroconf_publish_la-module-zeroconf-publish.Plo + -rm -f modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-mixer.Plo + -rm -f modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-sink.Plo + -rm -f modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-source.Plo + -rm -f modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-ucm.Plo + -rm -f modules/alsa/$(DEPDIR)/libalsa_util_la-alsa-util.Plo + -rm -f modules/alsa/$(DEPDIR)/module_alsa_card_la-module-alsa-card.Plo + -rm -f modules/alsa/$(DEPDIR)/module_alsa_sink_la-module-alsa-sink.Plo + -rm -f modules/alsa/$(DEPDIR)/module_alsa_source_la-module-alsa-source.Plo + -rm -f modules/bluetooth/$(DEPDIR)/libbluez5_util_la-a2dp-codec-sbc.Plo + -rm -f modules/bluetooth/$(DEPDIR)/libbluez5_util_la-a2dp-codec-util.Plo + -rm -f modules/bluetooth/$(DEPDIR)/libbluez5_util_la-backend-native.Plo + -rm -f modules/bluetooth/$(DEPDIR)/libbluez5_util_la-backend-ofono.Plo + -rm -f modules/bluetooth/$(DEPDIR)/libbluez5_util_la-bluez5-util.Plo + -rm -f modules/bluetooth/$(DEPDIR)/module_bluetooth_discover_la-module-bluetooth-discover.Plo + -rm -f modules/bluetooth/$(DEPDIR)/module_bluetooth_policy_la-module-bluetooth-policy.Plo + -rm -f modules/bluetooth/$(DEPDIR)/module_bluez5_device_la-module-bluez5-device.Plo + -rm -f modules/bluetooth/$(DEPDIR)/module_bluez5_discover_la-module-bluez5-discover.Plo + -rm -f modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-card-profile.Plo + -rm -f modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-card.Plo + -rm -f modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-client.Plo + -rm -f modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-core.Plo + -rm -f modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-device-port.Plo + -rm -f modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-device.Plo + -rm -f modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-memstats.Plo + -rm -f modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-module.Plo + -rm -f modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-sample.Plo + -rm -f modules/dbus/$(DEPDIR)/module_dbus_protocol_la-iface-stream.Plo + -rm -f modules/dbus/$(DEPDIR)/module_dbus_protocol_la-module-dbus-protocol.Plo + -rm -f modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian-aec-orc-gen.Po + -rm -f modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian-aec.Po + -rm -f modules/echo-cancel/$(DEPDIR)/echo_cancel_test-adrian.Po + -rm -f modules/echo-cancel/$(DEPDIR)/echo_cancel_test-module-echo-cancel.Po + -rm -f modules/echo-cancel/$(DEPDIR)/echo_cancel_test-null.Po + -rm -f modules/echo-cancel/$(DEPDIR)/echo_cancel_test-speex.Po + -rm -f modules/echo-cancel/$(DEPDIR)/libwebrtc_util_la-webrtc.Plo + -rm -f modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-adrian-aec-orc-gen.Plo + -rm -f modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-adrian-aec.Plo + -rm -f modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-adrian.Plo + -rm -f modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-module-echo-cancel.Plo + -rm -f modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-null.Plo + -rm -f modules/echo-cancel/$(DEPDIR)/module_echo_cancel_la-speex.Plo + -rm -f modules/gconf/$(DEPDIR)/gconf_helper-gconf-helper.Po + -rm -f modules/gconf/$(DEPDIR)/module_gconf_la-module-gconf.Plo + -rm -f modules/gsettings/$(DEPDIR)/gsettings_helper-gsettings-helper.Po + -rm -f modules/gsettings/$(DEPDIR)/module_gsettings_la-module-gsettings.Plo + -rm -f modules/jack/$(DEPDIR)/module_jack_sink_la-module-jack-sink.Plo + -rm -f modules/jack/$(DEPDIR)/module_jack_source_la-module-jack-source.Plo + -rm -f modules/jack/$(DEPDIR)/module_jackdbus_detect_la-module-jackdbus-detect.Plo + -rm -f modules/macosx/$(DEPDIR)/module_bonjour_publish_la-module-bonjour-publish.Plo + -rm -f modules/macosx/$(DEPDIR)/module_coreaudio_detect_la-module-coreaudio-detect.Plo + -rm -f modules/macosx/$(DEPDIR)/module_coreaudio_device_la-module-coreaudio-device.Plo + -rm -f modules/oss/$(DEPDIR)/module_oss_la-module-oss.Plo + -rm -f modules/oss/$(DEPDIR)/oss-util.Plo + -rm -f modules/raop/$(DEPDIR)/libraop_la-raop-client.Plo + -rm -f modules/raop/$(DEPDIR)/libraop_la-raop-crypto.Plo + -rm -f modules/raop/$(DEPDIR)/libraop_la-raop-packet-buffer.Plo + -rm -f modules/raop/$(DEPDIR)/libraop_la-raop-sink.Plo + -rm -f modules/raop/$(DEPDIR)/libraop_la-raop-util.Plo + -rm -f modules/raop/$(DEPDIR)/module_raop_discover_la-module-raop-discover.Plo + -rm -f modules/raop/$(DEPDIR)/module_raop_sink_la-module-raop-sink.Plo + -rm -f modules/rtp/$(DEPDIR)/librtp_la-headerlist.Plo + -rm -f modules/rtp/$(DEPDIR)/librtp_la-rtp-common.Plo + -rm -f modules/rtp/$(DEPDIR)/librtp_la-rtp-gstreamer.Plo + -rm -f modules/rtp/$(DEPDIR)/librtp_la-rtp-native.Plo + -rm -f modules/rtp/$(DEPDIR)/librtp_la-rtsp_client.Plo + -rm -f modules/rtp/$(DEPDIR)/librtp_la-sap.Plo + -rm -f modules/rtp/$(DEPDIR)/librtp_la-sdp.Plo + -rm -f modules/rtp/$(DEPDIR)/module_rtp_recv_la-module-rtp-recv.Plo + -rm -f modules/rtp/$(DEPDIR)/module_rtp_send_la-module-rtp-send.Plo + -rm -f modules/x11/$(DEPDIR)/module_x11_bell_la-module-x11-bell.Plo + -rm -f modules/x11/$(DEPDIR)/module_x11_cork_request_la-module-x11-cork-request.Plo + -rm -f modules/x11/$(DEPDIR)/module_x11_publish_la-module-x11-publish.Plo + -rm -f modules/x11/$(DEPDIR)/module_x11_xsmp_la-module-x11-xsmp.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-channelmap.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-context.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-direction.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-error.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-ext-device-manager.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-ext-device-restore.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-ext-stream-restore.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-format.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-introspect.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-mainloop-api.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-mainloop-signal.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-mainloop.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-operation.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-proplist.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-rtclock.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-sample.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-scache.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-stream.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-subscribe.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-thread-mainloop.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-timeval.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-utf8.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-util.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-volume.Plo + -rm -f pulse/$(DEPDIR)/libpulse_la-xmalloc.Plo + -rm -f pulse/$(DEPDIR)/libpulse_mainloop_glib_la-glib-mainloop.Plo + -rm -f pulse/$(DEPDIR)/libpulse_simple_la-simple.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-channelmap.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-client-conf-x11.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-client-conf.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-fork-detect.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-format.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-json.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-proplist.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-rtclock.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-sample.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-timeval.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-utf8.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-util.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-volume.Plo + -rm -f pulse/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-xmalloc.Plo + -rm -f pulsecore/$(DEPDIR)/cli.Plo + -rm -f pulsecore/$(DEPDIR)/libavahi_wrap_la-avahi-wrap.Plo + -rm -f pulsecore/$(DEPDIR)/libprotocol_native_la-protocol-native.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-arpa-inet.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-aupdate.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-authkey.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-bitset.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-conf-parser.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-error.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-format.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-rtclock.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-core-util.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-dbus-util.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-dllmain.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-dynarray.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-fdsem.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-flist.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-g711.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-hashmap.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-i18n.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-idxset.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-iochannel.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-ioline.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-ipacl.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-lock-autospawn.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-log.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-mcalign.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memblock.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memblockq.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memchunk.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-memtrap.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-mutex-posix.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-mutex-win32.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-native-common.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-once.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-packet.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-parseaddr.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pdispatch.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pid.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pipe.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-poll-posix.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-poll-win32.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-proplist-util.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pstream-util.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-pstream.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-queue.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-random.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-ratelimit.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-rtkit.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-sample-util.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-osx.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-posix.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-semaphore-win32.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-shm.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-sndfile-util.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-socket-client.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-socket-server.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-socket-util.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-srbchannel.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-strbuf.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-strlist.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-tagstruct.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-thread-posix.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-thread-win32.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-time-smoother.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-tokenizer.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-usergroup.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecommon_@PA_MAJORMINOR@_la-x11prop.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-asyncmsgq.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-asyncq.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-auth-cookie.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-card.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cli-command.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cli-text.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-client.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-core-scache.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-core-subscribe.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-core.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu-arm.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu-orc.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu-x86.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-cpu.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database-gdbm.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database-simple.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database-tdb.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-database.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-dbus-shared.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-device-port.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-hook-list.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-ltdl-helper.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-message-handler.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-mix.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-modargs.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-modinfo.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-module.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-msgobject.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-namereg.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-object.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-play-memblockq.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-play-memchunk.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-protocol-dbus.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-remap.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-remap_mmx.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-remap_sse.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-resampler.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-rtpoll.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16be.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv-s16le.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sconv_sse.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-shared.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sink-input.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sink.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sioman.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sound-file-stream.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-sound-file.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-source-output.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-source.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-start-child.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-stream-util.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume-orc-gen.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_arm.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_c.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_mmx.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_orc.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-svolume_sse.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-thread-mq.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-x11wrap.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_mix_neon_la-mix_neon.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_remap_neon_la-remap_neon.Plo + -rm -f pulsecore/$(DEPDIR)/libpulsecore_sconv_neon_la-sconv_neon.Plo + -rm -f pulsecore/$(DEPDIR)/mime-type.Plo + -rm -f pulsecore/$(DEPDIR)/protocol-cli.Plo + -rm -f pulsecore/$(DEPDIR)/protocol-esound.Plo + -rm -f pulsecore/$(DEPDIR)/protocol-http.Plo + -rm -f pulsecore/$(DEPDIR)/protocol-simple.Plo + -rm -f pulsecore/ffmpeg/$(DEPDIR)/libpulsecore_foreign_la-resample2.Plo + -rm -f pulsecore/filter/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-biquad.Plo + -rm -f pulsecore/filter/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-crossover.Plo + -rm -f pulsecore/filter/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-lfe-filter.Plo + -rm -f pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-ffmpeg.Plo + -rm -f pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-libsamplerate.Plo + -rm -f pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-peaks.Plo + -rm -f pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-soxr.Plo + -rm -f pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-speex.Plo + -rm -f pulsecore/resampler/$(DEPDIR)/libpulsecore_@PA_MAJORMINOR@_la-trivial.Plo + -rm -f tests/$(DEPDIR)/alsa_mixer_path_test-alsa-mixer-path-test.Po + -rm -f tests/$(DEPDIR)/alsa_time_test-alsa-time-test.Po + -rm -f tests/$(DEPDIR)/asyncmsgq_test-asyncmsgq-test.Po + -rm -f tests/$(DEPDIR)/asyncq_test-asyncq-test.Po + -rm -f tests/$(DEPDIR)/atomic_test-atomic-test.Po + -rm -f tests/$(DEPDIR)/channelmap_test-channelmap-test.Po + -rm -f tests/$(DEPDIR)/close_test-close-test.Po + -rm -f tests/$(DEPDIR)/connect_stress-connect-stress.Po + -rm -f tests/$(DEPDIR)/core_util_test-core-util-test.Po + -rm -f tests/$(DEPDIR)/cpu_mix_test-cpu-mix-test.Po + -rm -f tests/$(DEPDIR)/cpu_remap_test-cpu-remap-test.Po + -rm -f tests/$(DEPDIR)/cpu_sconv_test-cpu-sconv-test.Po + -rm -f tests/$(DEPDIR)/cpu_volume_test-cpu-volume-test.Po + -rm -f tests/$(DEPDIR)/cpulimit_test-cpulimit-test.Po + -rm -f tests/$(DEPDIR)/cpulimit_test2-cpulimit-test.Po + -rm -f tests/$(DEPDIR)/extended_test-extended-test.Po + -rm -f tests/$(DEPDIR)/flist_test-flist-test.Po + -rm -f tests/$(DEPDIR)/format_test-format-test.Po + -rm -f tests/$(DEPDIR)/get_binary_name_test-get-binary-name-test.Po + -rm -f tests/$(DEPDIR)/gtk_test-gtk-test.Po + -rm -f tests/$(DEPDIR)/hashmap_test-hashmap-test.Po + -rm -f tests/$(DEPDIR)/hook_list_test-hook-list-test.Po + -rm -f tests/$(DEPDIR)/interpol_test-interpol-test.Po + -rm -f tests/$(DEPDIR)/ipacl_test-ipacl-test.Po + -rm -f tests/$(DEPDIR)/json_test-json-test.Po + -rm -f tests/$(DEPDIR)/lfe_filter_test-lfe-filter-test.Po + -rm -f tests/$(DEPDIR)/lo-test-util.Plo + -rm -f tests/$(DEPDIR)/lo_latency_test-lo-latency-test.Po + -rm -f tests/$(DEPDIR)/lock_autospawn_test-lock-autospawn-test.Po + -rm -f tests/$(DEPDIR)/mainloop_test-mainloop-test.Po + -rm -f tests/$(DEPDIR)/mainloop_test_glib-mainloop-test.Po + -rm -f tests/$(DEPDIR)/mcalign_test-mcalign-test.Po + -rm -f tests/$(DEPDIR)/memblock_test-memblock-test.Po + -rm -f tests/$(DEPDIR)/memblockq_test-memblockq-test.Po + -rm -f tests/$(DEPDIR)/mix_test-mix-test.Po + -rm -f tests/$(DEPDIR)/mult_s16_test-mult-s16-test.Po + -rm -f tests/$(DEPDIR)/once_test-once-test.Po + -rm -f tests/$(DEPDIR)/pacat_simple-pacat-simple.Po + -rm -f tests/$(DEPDIR)/parec_simple-parec-simple.Po + -rm -f tests/$(DEPDIR)/passthrough_test-passthrough-test.Po + -rm -f tests/$(DEPDIR)/proplist_test-proplist-test.Po + -rm -f tests/$(DEPDIR)/queue_test-queue-test.Po + -rm -f tests/$(DEPDIR)/remix_test-remix-test.Po + -rm -f tests/$(DEPDIR)/resampler_test-resampler-test.Po + -rm -f tests/$(DEPDIR)/rtpoll_test-rtpoll-test.Po + -rm -f tests/$(DEPDIR)/rtstutter-rtstutter.Po + -rm -f tests/$(DEPDIR)/sig2str_test-sig2str-test.Po + -rm -f tests/$(DEPDIR)/sigbus_test-sigbus-test.Po + -rm -f tests/$(DEPDIR)/smoother_test-smoother-test.Po + -rm -f tests/$(DEPDIR)/srbchannel_test-srbchannel-test.Po + -rm -f tests/$(DEPDIR)/stripnul-stripnul.Po + -rm -f tests/$(DEPDIR)/strlist_test-strlist-test.Po + -rm -f tests/$(DEPDIR)/sync_playback-sync-playback.Po + -rm -f tests/$(DEPDIR)/thread_mainloop_test-thread-mainloop-test.Po + -rm -f tests/$(DEPDIR)/thread_test-thread-test.Po + -rm -f tests/$(DEPDIR)/usergroup_test-usergroup-test.Po + -rm -f tests/$(DEPDIR)/utf8_test-utf8-test.Po + -rm -f tests/$(DEPDIR)/volume_test-volume-test.Po + -rm -f utils/$(DEPDIR)/libpulsedsp_la-padsp.Plo + -rm -f utils/$(DEPDIR)/pacat-pacat.Po + -rm -f utils/$(DEPDIR)/pacmd-pacmd.Po + -rm -f utils/$(DEPDIR)/pactl-pactl.Po + -rm -f utils/$(DEPDIR)/pasuspender-pasuspender.Po + -rm -f utils/$(DEPDIR)/pax11publish-pax11publish.Po + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \ + uninstall-commonlibLTLIBRARIES uninstall-dbuspolicyDATA \ + uninstall-dist_alsapathsDATA \ + uninstall-dist_alsaprofilesetsDATA \ + uninstall-dist_udevrulesDATA \ + uninstall-gsettingsdataconvertDATA uninstall-libLTLIBRARIES \ + uninstall-modlibexecLTLIBRARIES uninstall-padsplibLTLIBRARIES \ + uninstall-pkglibLTLIBRARIES uninstall-pulseconfDATA \ + uninstall-pulseincludeHEADERS uninstall-pulselibexecPROGRAMS \ + uninstall-systemduserunitDATA uninstall-xdgautostartDATA + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook +.MAKE: all check check-am install install-am install-exec-am \ + install-strip uninstall-am + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \ + check-am clean clean-binPROGRAMS clean-checkPROGRAMS \ + clean-commonlibLTLIBRARIES clean-generic clean-libLTLIBRARIES \ + clean-libtool clean-modlibexecLTLIBRARIES \ + clean-noinstLTLIBRARIES clean-noinstPROGRAMS \ + clean-padsplibLTLIBRARIES clean-pkglibLTLIBRARIES \ + clean-pulselibexecPROGRAMS cscopelist-am ctags ctags-am \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-binSCRIPTS install-commonlibLTLIBRARIES install-data \ + install-data-am install-dbuspolicyDATA \ + install-dist_alsapathsDATA install-dist_alsaprofilesetsDATA \ + install-dist_udevrulesDATA install-dvi install-dvi-am \ + install-exec install-exec-am install-exec-hook \ + install-gsettingsdataconvertDATA install-html install-html-am \ + install-info install-info-am install-libLTLIBRARIES \ + install-man install-modlibexecLTLIBRARIES \ + install-padsplibLTLIBRARIES install-pdf install-pdf-am \ + install-pkglibLTLIBRARIES install-ps install-ps-am \ + install-pulseconfDATA install-pulseincludeHEADERS \ + install-pulselibexecPROGRAMS install-strip \ + install-systemduserunitDATA install-xdgautostartDATA \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + recheck tags tags-am uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-binSCRIPTS \ + uninstall-commonlibLTLIBRARIES uninstall-dbuspolicyDATA \ + uninstall-dist_alsapathsDATA \ + uninstall-dist_alsaprofilesetsDATA \ + uninstall-dist_udevrulesDATA \ + uninstall-gsettingsdataconvertDATA uninstall-hook \ + uninstall-libLTLIBRARIES uninstall-modlibexecLTLIBRARIES \ + uninstall-padsplibLTLIBRARIES uninstall-pkglibLTLIBRARIES \ + uninstall-pulseconfDATA uninstall-pulseincludeHEADERS \ + uninstall-pulselibexecPROGRAMS uninstall-systemduserunitDATA \ + uninstall-xdgautostartDATA + +.PRECIOUS: Makefile + +@HAVE_X11_TRUE@$(xdgautostart_DATA): $(xdgautostart_in_files) +@HAVE_X11_TRUE@ $(AM_V_GEN) $(MSGFMT) --desktop --template $< -d $(top_srcdir)/po -o $@ + +@HAVE_ORC_TRUE@%-orc-gen.c: %.orc +@HAVE_ORC_TRUE@ @mkdir -p $(@D) +@HAVE_ORC_TRUE@ $(orcc_v_gen)$(ORCC) --implementation -o $@ $< + +@HAVE_ORC_TRUE@%-orc-gen.h: %.orc +@HAVE_ORC_TRUE@ @mkdir -p $(@D) +@HAVE_ORC_TRUE@ $(orcc_v_gen)$(ORCC) --header -o $@ $< + +@HAVE_TESTS_TRUE@check-daemon: $(TESTS_daemon) +@HAVE_TESTS_TRUE@ PATH=$(builddir):${PATH} $(top_srcdir)/src/tests/test-daemon.sh $(TESTS_daemon) + +@HAVE_TESTS_TRUE@check-daemon-long: $(TESTS_daemon_long) +@HAVE_TESTS_TRUE@ PATH=$(builddir):${PATH} $(top_srcdir)/src/tests/test-daemon.sh $(TESTS_daemon_long) + +@HAVE_TESTS_FALSE@check-daemon: +@HAVE_TESTS_FALSE@ @echo "Tests are disabled!" +@HAVE_TESTS_FALSE@ @echo "Pass option \"--enable-tests\" to configure and install \"check\" library properly!" +@HAVE_TESTS_FALSE@ false + +@HAVE_TESTS_FALSE@check-daemon-long: check-daemon + +@HAVE_OSS_WRAPPER_TRUE@padsp: utils/padsp.in +@HAVE_OSS_WRAPPER_TRUE@ $(edit) $< > $@ +@HAVE_GSETTINGS_TRUE@@GSETTINGS_RULES@ +install-exec-hook: + $(SYMLINK_PROGRAM) pacat$(EXEEXT) $(DESTDIR)$(bindir)/parec$(EXEEXT) + $(SYMLINK_PROGRAM) pacat$(EXEEXT) $(DESTDIR)$(bindir)/pamon$(EXEEXT) + $(SYMLINK_PROGRAM) pacat$(EXEEXT) $(DESTDIR)$(bindir)/paplay$(EXEEXT) + $(SYMLINK_PROGRAM) pacat$(EXEEXT) $(DESTDIR)$(bindir)/parecord$(EXEEXT) + rm -f $(DESTDIR)$(libdir)/libpulsedsp.la + rm -f $(DESTDIR)$(modlibexecdir)/*.la + +uninstall-hook: + rm -f $(DESTDIR)$(bindir)/parec$(EXEEXT) + rm -f $(DESTDIR)$(bindir)/pamon$(EXEEXT) + rm -f $(DESTDIR)$(bindir)/paplay$(EXEEXT) + rm -f $(DESTDIR)$(bindir)/parecord$(EXEEXT) + rm -f $(DESTDIR)$(libdir)/libpulsedsp.* + rm -f $(DESTDIR)$(modlibexecdir)/*.so + +massif: pulseaudio + libtool --mode=execute valgrind --tool=massif --depth=6 --alloc-fn=pa_xmalloc --alloc-fn=pa_xmalloc0 --alloc-fn=pa_xrealloc --alloc-fn=dbus_realloc --alloc-fn=pa_xnew0_internal --alloc-fn=pa_xnew_internal ./pulseaudio + +update-ffmpeg: + wget -O pulsecore/ffmpeg/resample2.c http://svn.mplayerhq.hu/ffmpeg/trunk/libavcodec/resample2.c?view=co + +update-reserve: + for i in reserve.c reserve.h reserve-monitor.c reserve-monitor.h ; do \ + wget -O $(top_srcdir)/src/modules/$$i http://git.0pointer.de/\?p=reserve.git\;a=blob_plain\;f=$$i\;hb=master ; \ + done + +update-rtkit: + for i in rtkit.c rtkit.h ; do \ + wget -O $(top_srcdir)/src/pulsecore/$$i http://git.0pointer.de/\?p=rtkit.git\;a=blob_plain\;f=$$i\;hb=master ; \ + done + +# Automatically generate linker version script. We use the same one for all public .sos +update-map-file: + ( echo "PULSE_0 {" ; \ + echo "global:" ; \ + ctags -I PA_GCC_MALLOC,PA_GCC_ALLOC_SIZE2,PA_GCC_ALLOC_SIZE,PA_GCC_PURE,PA_GCC_CONST,PA_GCC_DEPRECATED,PA_GCC_PRINTF_ATTR -f - --c-kinds=p $(pulseinclude_HEADERS) | awk '/^pa_/ { print $$1 ";" }' | sort ; \ + echo "local:" ; \ + echo "*;" ; \ + echo "};" ) > $(srcdir)/map-file + +update-all: update-ffmpeg update-map-file +$(installlibLTLIBRARIES): install-commonlibLTLIBRARIES +$(installpkglibLTLIBRARIES): install-libLTLIBRARIES +$(installmodlibexecLTLIBRARIES): install-pkglibLTLIBRARIES install-libLTLIBRARIES +$(installpadsplibLTLIBRARIES): install-libLTLIBRARIES + +@HAVE_GCOV_TRUE@coverage: +@HAVE_GCOV_TRUE@ @echo "" +@HAVE_GCOV_TRUE@ @echo "Don't forget to run 'make check' before generating coverage stats." +@HAVE_GCOV_TRUE@ @echo "" +@HAVE_GCOV_TRUE@ lcov --capture --directory . --output-file $(builddir)/gcov-all.info +@HAVE_GCOV_TRUE@ -rm -r $(builddir)/coverage +@HAVE_GCOV_TRUE@ genhtml --output-directory $(builddir)/coverage gcov-all.info +@HAVE_GCOV_TRUE@ @echo "" +@HAVE_GCOV_TRUE@ @echo "Coverage data now available at: $(abs_builddir)/coverage/index.html" +@HAVE_GCOV_FALSE@coverage: +@HAVE_GCOV_FALSE@ @echo "" +@HAVE_GCOV_FALSE@ @echo "To generate coverage stats, rerun configure with '--enable-gcov'," +@HAVE_GCOV_FALSE@ @echo "and don't forget to disable it again for regular builds." +@HAVE_GCOV_FALSE@ @echo "" + +.PHONY: massif update-all update-ffmpeg update-map-file coverage + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/daemon/.gitignore b/src/daemon/.gitignore new file mode 100644 index 0000000..0efa55b --- /dev/null +++ b/src/daemon/.gitignore @@ -0,0 +1,2 @@ +org.pulseaudio.policy +pulseaudio.desktop diff --git a/src/daemon/caps.c b/src/daemon/caps.c new file mode 100644 index 0000000..fd135c0 --- /dev/null +++ b/src/daemon/caps.c @@ -0,0 +1,99 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include +#include +#include + +#ifdef HAVE_SYS_CAPABILITY_H +#include +#endif + +#include "caps.h" + +/* Glibc <= 2.2 has broken unistd.h */ +#if defined(__linux__) && (__GLIBC__ <= 2 && __GLIBC_MINOR__ <= 2) +int setresgid(gid_t r, gid_t e, gid_t s); +int setresuid(uid_t r, uid_t e, uid_t s); +#endif + +/* Drop root rights when called SUID root */ +void pa_drop_root(void) { + +#ifdef HAVE_GETUID + uid_t uid; + gid_t gid; + + pa_log_debug("Cleaning up privileges."); + uid = getuid(); + gid = getgid(); + +#if defined(HAVE_SETRESUID) + pa_assert_se(setresuid(uid, uid, uid) >= 0); + pa_assert_se(setresgid(gid, gid, gid) >= 0); +#elif defined(HAVE_SETREUID) + pa_assert_se(setreuid(uid, uid) >= 0); + pa_assert_se(setregid(gid, gid) >= 0); +#else + pa_assert_se(setuid(uid) >= 0); + pa_assert_se(seteuid(uid) >= 0); + pa_assert_se(setgid(gid) >= 0); + pa_assert_se(setegid(gid) >= 0); +#endif + + pa_assert_se(getuid() == uid); + pa_assert_se(geteuid() == uid); + pa_assert_se(getgid() == gid); + pa_assert_se(getegid() == gid); + + if (uid != 0) + pa_drop_caps(); +#endif +} + +void pa_drop_caps(void) { +#ifdef HAVE_SYS_CAPABILITY_H +#if defined(__linux__) + cap_t caps; + pa_assert_se(caps = cap_init()); + pa_assert_se(cap_clear(caps) == 0); + pa_assert_se(cap_set_proc(caps) == 0); + pa_assert_se(cap_free(caps) == 0); +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + /* FreeBSD doesn't have this functionality, even though sys/capability.h is + * available. See https://bugs.freedesktop.org/show_bug.cgi?id=72580 */ + pa_log_warn("FreeBSD cannot drop extra capabilities, implementation needed."); +#else +#error "Don't know how to do capabilities on your system. Please send a patch." +#endif /* __linux__ */ +#else /* HAVE_SYS_CAPABILITY_H */ + pa_log_warn("Normally all extra capabilities would be dropped now, but " + "that's impossible because PulseAudio was built without " + "capabilities support."); +#endif +} diff --git a/src/daemon/caps.h b/src/daemon/caps.h new file mode 100644 index 0000000..9b88241 --- /dev/null +++ b/src/daemon/caps.h @@ -0,0 +1,29 @@ +#ifndef foocapshfoo +#define foocapshfoo + +/*** + This file is part of PulseAudio. + + Copyright 2004 Lennart Poettering + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#include + +void pa_drop_root(void); + +void pa_drop_caps(void); + +#endif diff --git a/src/daemon/cmdline.c b/src/daemon/cmdline.c new file mode 100644 index 0000000..b325596 --- /dev/null +++ b/src/daemon/cmdline.c @@ -0,0 +1,420 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include "cmdline.h" + +/* Argument codes for getopt_long() */ +enum { + ARG_HELP = 256, + ARG_VERSION, + ARG_DUMP_CONF, + ARG_DUMP_MODULES, + ARG_DAEMONIZE, + ARG_FAIL, + ARG_LOG_LEVEL, + ARG_HIGH_PRIORITY, + ARG_REALTIME, + ARG_DISALLOW_MODULE_LOADING, + ARG_DISALLOW_EXIT, + ARG_EXIT_IDLE_TIME, + ARG_SCACHE_IDLE_TIME, + ARG_LOG_TARGET, + ARG_LOG_META, + ARG_LOG_TIME, + ARG_LOG_BACKTRACE, + ARG_LOAD, + ARG_FILE, + ARG_DL_SEARCH_PATH, + ARG_RESAMPLE_METHOD, + ARG_KILL, + ARG_USE_PID_FILE, + ARG_CHECK, + ARG_NO_CPU_LIMIT, + ARG_DISABLE_SHM, + ARG_ENABLE_MEMFD, + ARG_DUMP_RESAMPLE_METHODS, + ARG_SYSTEM, + ARG_CLEANUP_SHM, + ARG_START +}; + +/* Table for getopt_long() */ +static const struct option long_options[] = { + {"help", 0, 0, ARG_HELP}, + {"version", 0, 0, ARG_VERSION}, + {"dump-conf", 0, 0, ARG_DUMP_CONF}, + {"dump-modules", 0, 0, ARG_DUMP_MODULES}, + {"daemonize", 2, 0, ARG_DAEMONIZE}, + {"fail", 2, 0, ARG_FAIL}, + {"verbose", 2, 0, ARG_LOG_LEVEL}, + {"log-level", 2, 0, ARG_LOG_LEVEL}, + {"high-priority", 2, 0, ARG_HIGH_PRIORITY}, + {"realtime", 2, 0, ARG_REALTIME}, + {"disallow-module-loading", 2, 0, ARG_DISALLOW_MODULE_LOADING}, + {"disallow-exit", 2, 0, ARG_DISALLOW_EXIT}, + {"exit-idle-time", 1, 0, ARG_EXIT_IDLE_TIME}, + {"scache-idle-time", 1, 0, ARG_SCACHE_IDLE_TIME}, + {"log-target", 1, 0, ARG_LOG_TARGET}, + {"log-meta", 2, 0, ARG_LOG_META}, + {"log-time", 2, 0, ARG_LOG_TIME}, + {"log-backtrace", 1, 0, ARG_LOG_BACKTRACE}, + {"load", 1, 0, ARG_LOAD}, + {"file", 1, 0, ARG_FILE}, + {"dl-search-path", 1, 0, ARG_DL_SEARCH_PATH}, + {"resample-method", 1, 0, ARG_RESAMPLE_METHOD}, + {"kill", 0, 0, ARG_KILL}, + {"start", 0, 0, ARG_START}, + {"use-pid-file", 2, 0, ARG_USE_PID_FILE}, + {"check", 0, 0, ARG_CHECK}, + {"system", 2, 0, ARG_SYSTEM}, + {"no-cpu-limit", 2, 0, ARG_NO_CPU_LIMIT}, + {"disable-shm", 2, 0, ARG_DISABLE_SHM}, + {"enable-memfd", 2, 0, ARG_ENABLE_MEMFD}, + {"dump-resample-methods", 2, 0, ARG_DUMP_RESAMPLE_METHODS}, + {"cleanup-shm", 2, 0, ARG_CLEANUP_SHM}, + {NULL, 0, 0, 0} +}; + +void pa_cmdline_help(const char *argv0) { + pa_assert(argv0); + + printf(_("%s [options]\n\n" + "COMMANDS:\n" + " -h, --help Show this help\n" + " --version Show version\n" + " --dump-conf Dump default configuration\n" + " --dump-modules Dump list of available modules\n" + " --dump-resample-methods Dump available resample methods\n" + " --cleanup-shm Cleanup stale shared memory segments\n" + " --start Start the daemon if it is not running\n" + " -k --kill Kill a running daemon\n" + " --check Check for a running daemon (only returns exit code)\n\n" + + "OPTIONS:\n" + " --system[=BOOL] Run as system-wide instance\n" + " -D, --daemonize[=BOOL] Daemonize after startup\n" + " --fail[=BOOL] Quit when startup fails\n" + " --high-priority[=BOOL] Try to set high nice level\n" + " (only available as root, when SUID or\n" + " with elevated RLIMIT_NICE)\n" + " --realtime[=BOOL] Try to enable realtime scheduling\n" + " (only available as root, when SUID or\n" + " with elevated RLIMIT_RTPRIO)\n" + " --disallow-module-loading[=BOOL] Disallow user requested module\n" + " loading/unloading after startup\n" + " --disallow-exit[=BOOL] Disallow user requested exit\n" + " --exit-idle-time=SECS Terminate the daemon when idle and this\n" + " time passed\n" + " --scache-idle-time=SECS Unload autoloaded samples when idle and\n" + " this time passed\n" + " --log-level[=LEVEL] Increase or set verbosity level\n" + " -v --verbose Increase the verbosity level\n" + " --log-target={auto,syslog,stderr,file:PATH,newfile:PATH}\n" + " Specify the log target\n" + " --log-meta[=BOOL] Include code location in log messages\n" + " --log-time[=BOOL] Include timestamps in log messages\n" + " --log-backtrace=FRAMES Include a backtrace in log messages\n" + " -p, --dl-search-path=PATH Set the search path for dynamic shared\n" + " objects (plugins)\n" + " --resample-method=METHOD Use the specified resampling method\n" + " (See --dump-resample-methods for\n" + " possible values)\n" + " --use-pid-file[=BOOL] Create a PID file\n" + " --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" + " platforms that support it.\n" + " --disable-shm[=BOOL] Disable shared memory support.\n" + " --enable-memfd[=BOOL] Enable memfd shared memory support.\n\n" + + "STARTUP SCRIPT:\n" + " -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module with\n" + " the specified argument\n" + " -F, --file=FILENAME Run the specified script\n" + " -C Open a command line on the running TTY\n" + " after startup\n\n" + + " -n Don't load default script file\n"), + pa_path_get_filename(argv0)); +} + +int pa_cmdline_parse(pa_daemon_conf *conf, int argc, char *const argv [], int *d) { + pa_strbuf *buf = NULL; + int c; + int b; + + pa_assert(conf); + pa_assert(argc > 0); + pa_assert(argv); + + buf = pa_strbuf_new(); + + if (conf->script_commands) + pa_strbuf_puts(buf, conf->script_commands); + + while ((c = getopt_long(argc, argv, "L:F:ChDnp:kv", long_options, NULL)) != -1) { + switch (c) { + case ARG_HELP: + case 'h': + conf->cmd = PA_CMD_HELP; + break; + + case ARG_VERSION: + conf->cmd = PA_CMD_VERSION; + break; + + case ARG_DUMP_CONF: + conf->cmd = PA_CMD_DUMP_CONF; + break; + + case ARG_DUMP_MODULES: + conf->cmd = PA_CMD_DUMP_MODULES; + break; + + case ARG_DUMP_RESAMPLE_METHODS: + conf->cmd = PA_CMD_DUMP_RESAMPLE_METHODS; + break; + + case ARG_CLEANUP_SHM: + conf->cmd = PA_CMD_CLEANUP_SHM; + break; + + case 'k': + case ARG_KILL: + conf->cmd = PA_CMD_KILL; + break; + + case ARG_START: + conf->cmd = PA_CMD_START; + conf->daemonize = true; + break; + + case ARG_CHECK: + conf->cmd = PA_CMD_CHECK; + break; + + case ARG_LOAD: + case 'L': + pa_strbuf_printf(buf, "load-module %s\n", optarg); + break; + + case ARG_FILE: + case 'F': { + char *p; + pa_strbuf_printf(buf, ".include %s\n", p = pa_make_path_absolute(optarg)); + pa_xfree(p); + break; + } + + case 'C': + pa_strbuf_puts(buf, "load-module module-cli exit_on_eof=1\n"); + break; + + case ARG_DAEMONIZE: + case 'D': + if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { + pa_log(_("--daemonize expects boolean argument")); + goto fail; + } + conf->daemonize = !!b; + break; + + case ARG_FAIL: + if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { + pa_log(_("--fail expects boolean argument")); + goto fail; + } + conf->fail = !!b; + break; + + case 'v': + case ARG_LOG_LEVEL: + + if (optarg) { + if (pa_daemon_conf_set_log_level(conf, optarg) < 0) { + pa_log(_("--log-level expects log level argument (either numeric in range 0..4 or one of debug, info, notice, warn, error).")); + goto fail; + } + } else { + if (conf->log_level < PA_LOG_LEVEL_MAX-1) + conf->log_level++; + } + + break; + + case ARG_HIGH_PRIORITY: + if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { + pa_log(_("--high-priority expects boolean argument")); + goto fail; + } + conf->high_priority = !!b; + break; + + case ARG_REALTIME: + if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { + pa_log(_("--realtime expects boolean argument")); + goto fail; + } + conf->realtime_scheduling = !!b; + break; + + case ARG_DISALLOW_MODULE_LOADING: + if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { + pa_log(_("--disallow-module-loading expects boolean argument")); + goto fail; + } + conf->disallow_module_loading = !!b; + break; + + case ARG_DISALLOW_EXIT: + if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { + pa_log(_("--disallow-exit expects boolean argument")); + goto fail; + } + conf->disallow_exit = !!b; + break; + + case ARG_USE_PID_FILE: + if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { + pa_log(_("--use-pid-file expects boolean argument")); + goto fail; + } + conf->use_pid_file = !!b; + break; + + case 'p': + case ARG_DL_SEARCH_PATH: + pa_xfree(conf->dl_search_path); + conf->dl_search_path = pa_xstrdup(optarg); + break; + + case 'n': + conf->load_default_script_file = false; + break; + + case ARG_LOG_TARGET: + if (pa_daemon_conf_set_log_target(conf, optarg) < 0) { +#ifdef HAVE_SYSTEMD_JOURNAL + pa_log(_("Invalid log target: use either 'syslog', 'journal', 'stderr' or 'auto' or a valid file name 'file:', 'newfile:'.")); +#else + pa_log(_("Invalid log target: use either 'syslog', 'stderr' or 'auto' or a valid file name 'file:', 'newfile:'.")); +#endif + goto fail; + } + break; + + case ARG_LOG_TIME: + if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { + pa_log(_("--log-time expects boolean argument")); + goto fail; + } + conf->log_time = !!b; + break; + + case ARG_LOG_META: + if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { + pa_log(_("--log-meta expects boolean argument")); + goto fail; + } + conf->log_meta = !!b; + break; + + case ARG_LOG_BACKTRACE: + conf->log_backtrace = (unsigned) atoi(optarg); + break; + + case ARG_EXIT_IDLE_TIME: + conf->exit_idle_time = atoi(optarg); + break; + + case ARG_SCACHE_IDLE_TIME: + conf->scache_idle_time = atoi(optarg); + break; + + case ARG_RESAMPLE_METHOD: + if (pa_daemon_conf_set_resample_method(conf, optarg) < 0) { + pa_log(_("Invalid resample method '%s'."), optarg); + goto fail; + } + break; + + case ARG_SYSTEM: + if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { + pa_log(_("--system expects boolean argument")); + goto fail; + } + conf->system_instance = !!b; + break; + + case ARG_NO_CPU_LIMIT: + if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { + pa_log(_("--no-cpu-limit expects boolean argument")); + goto fail; + } + conf->no_cpu_limit = !!b; + break; + + case ARG_DISABLE_SHM: + if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { + pa_log(_("--disable-shm expects boolean argument")); + goto fail; + } + conf->disable_shm = !!b; + break; + + case ARG_ENABLE_MEMFD: + if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { + pa_log(_("--enable-memfd expects boolean argument")); + goto fail; + } + conf->disable_memfd = !b; + break; + + default: + goto fail; + } + } + + pa_xfree(conf->script_commands); + conf->script_commands = pa_strbuf_to_string_free(buf); + + *d = optind; + + return 0; + +fail: + if (buf) + pa_strbuf_free(buf); + + return -1; +} diff --git a/src/daemon/cmdline.h b/src/daemon/cmdline.h new file mode 100644 index 0000000..771c14d --- /dev/null +++ b/src/daemon/cmdline.h @@ -0,0 +1,33 @@ +#ifndef foocmdlinehfoo +#define foocmdlinehfoo + +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#include "daemon-conf.h" + +/* Parse the command line and store its data in *c. Return the index + * of the first unparsed argument in *d. */ +int pa_cmdline_parse(pa_daemon_conf*c, int argc, char *const argv [], int *d); + +/* Show the command line help. The command name is extracted from + * argv[0] which should be passed in argv0. */ +void pa_cmdline_help(const char *argv0); + +#endif diff --git a/src/daemon/cpulimit.c b/src/daemon/cpulimit.c new file mode 100644 index 0000000..a3deaf2 --- /dev/null +++ b/src/daemon/cpulimit.c @@ -0,0 +1,244 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + + PulseAudio 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 2.1 of the + License, or (at your option) any later version. + + PulseAudio 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 Lesser General Public + License along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include +#include +#include +#include + +#include "cpulimit.h" + +#ifdef HAVE_SIGXCPU + +#include +#include +#include +#include +#include + +#ifdef HAVE_SYS_RESOURCE_H +#include +#endif + +/* This module implements a watchdog that makes sure that the current + * process doesn't consume more than 70% CPU time for 10 seconds. This + * is very useful when using SCHED_FIFO scheduling which effectively + * disables multitasking. */ + +/* Method of operation: Using SIGXCPU a signal handler is called every + * 10s process CPU time. That function checks if less than 14s system + * time have passed. In that case, it tries to contact the main event + * loop through a pipe. After two additional seconds it is checked + * whether the main event loop contact was successful. If not, the + * program is terminated forcibly. */ + +/* Utilize this much CPU time at maximum */ +#define CPUTIME_PERCENT 70 + +/* Check every 10s */ +#define CPUTIME_INTERVAL_SOFT (10) + +/* Recheck after 5s */ +#define CPUTIME_INTERVAL_HARD (5) + +/* Time of the last CPU load check */ +static pa_usec_t last_time = 0; + +/* Pipe for communicating with the main loop */ +static int the_pipe[2] = {-1, -1}; + +/* Main event loop and IO event for the FIFO */ +static pa_mainloop_api *api = NULL; +static pa_io_event *io_event = NULL; + +/* Saved sigaction struct for SIGXCPU */ +static struct sigaction sigaction_prev; + +/* Nonzero after pa_cpu_limit_init() */ +static bool installed = false; + +/* The current state of operation */ +static enum { + PHASE_IDLE, /* Normal state */ + PHASE_SOFT /* After CPU overload has been detected */ +} phase = PHASE_IDLE; + +/* Reset the SIGXCPU timer to the next t seconds */ +static void reset_cpu_time(int t) { + long n; + struct rlimit rl; + struct rusage ru; + + /* Get the current CPU time of the current process */ + pa_assert_se(getrusage(RUSAGE_SELF, &ru) >= 0); + + n = ru.ru_utime.tv_sec + ru.ru_stime.tv_sec + t; + pa_assert_se(getrlimit(RLIMIT_CPU, &rl) >= 0); + + rl.rlim_cur = (rlim_t) n; + pa_assert_se(setrlimit(RLIMIT_CPU, &rl) >= 0); +} + +/* A simple, thread-safe puts() work-alike */ +static void write_err(const char *p) { + pa_loop_write(2, p, strlen(p), NULL); +} + +/* The signal handler, called on every SIGXCPU */ +static void signal_handler(int sig) { + int saved_errno; + + saved_errno = errno; + pa_assert(sig == SIGXCPU); + + if (phase == PHASE_IDLE) { + pa_usec_t now, elapsed; + +#ifdef PRINT_CPU_LOAD + char t[256]; +#endif + + now = pa_rtclock_now(); + elapsed = now - last_time; + +#ifdef PRINT_CPU_LOAD + pa_snprintf(t, sizeof(t), "Using %0.1f%% CPU\n", ((double) CPUTIME_INTERVAL_SOFT * (double) PA_USEC_PER_SEC) / (double) elapsed * 100.0); + write_err(t); +#endif + + if (((double) CPUTIME_INTERVAL_SOFT * (double) PA_USEC_PER_SEC) >= ((double) elapsed * (double) CPUTIME_PERCENT / 100.0)) { + static const char c = 'X'; + + write_err("Soft CPU time limit exhausted, terminating.\n"); + + /* Try a soft cleanup */ + (void) pa_write(the_pipe[1], &c, sizeof(c), NULL); + phase = PHASE_SOFT; + reset_cpu_time(CPUTIME_INTERVAL_HARD); + + } else { + + /* Everything's fine */ + reset_cpu_time(CPUTIME_INTERVAL_SOFT); + last_time = now; + } + + } else if (phase == PHASE_SOFT) { + write_err("Hard CPU time limit exhausted, terminating forcibly.\n"); + abort(); /* Forced exit */ + } + + errno = saved_errno; +} + +/* Callback for IO events on the FIFO */ +static void callback(pa_mainloop_api*m, pa_io_event*e, int fd, pa_io_event_flags_t f, void *userdata) { + char c; + pa_assert(m); + pa_assert(e); + pa_assert(f == PA_IO_EVENT_INPUT); + pa_assert(e == io_event); + pa_assert(fd == the_pipe[0]); + + pa_log("Received request to terminate due to CPU overload."); + + (void) pa_read(the_pipe[0], &c, sizeof(c), NULL); + m->quit(m, 1); /* Quit the main loop */ +} + +/* Initializes CPU load limiter */ +int pa_cpu_limit_init(pa_mainloop_api *m) { + struct sigaction sa; + + pa_assert(m); + pa_assert(!api); + pa_assert(!io_event); + pa_assert(the_pipe[0] == -1); + pa_assert(the_pipe[1] == -1); + pa_assert(!installed); + + last_time = pa_rtclock_now(); + + /* Prepare the main loop pipe */ + if (pa_pipe_cloexec(the_pipe) < 0) { + pa_log("pipe() failed: %s", pa_cstrerror(errno)); + return -1; + } + + pa_make_fd_nonblock(the_pipe[0]); + pa_make_fd_nonblock(the_pipe[1]); + + api = m; + io_event = api->io_new(m, the_pipe[0], PA_IO_EVENT_INPUT, callback, NULL); + + phase = PHASE_IDLE; + + /* Install signal handler for SIGXCPU */ + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = signal_handler; + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART; + + if (sigaction(SIGXCPU, &sa, &sigaction_prev) < 0) { + pa_cpu_limit_done(); + return -1; + } + + installed = true; + + reset_cpu_time(CPUTIME_INTERVAL_SOFT); + + return 0; +} + +/* Shutdown CPU load limiter */ +void pa_cpu_limit_done(void) { + + if (io_event) { + pa_assert(api); + api->io_free(io_event); + io_event = NULL; + api = NULL; + } + + pa_close_pipe(the_pipe); + + if (installed) { + pa_assert_se(sigaction(SIGXCPU, &sigaction_prev, NULL) >= 0); + installed = false; + } +} + +#else /* HAVE_SIGXCPU */ + +int pa_cpu_limit_init(pa_mainloop_api *m) { + return 0; +} + +void pa_cpu_limit_done(void) { +} + +#endif diff --git a/src/daemon/cpulimit.h b/src/daemon/cpulimit.h new file mode 100644 index 0000000..460f8c5 --- /dev/null +++ b/src/daemon/cpulimit.h @@ -0,0 +1,32 @@ +#ifndef foocpulimithfoo +#define foocpulimithfoo + +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#include + +/* This kills the pulseaudio process if it eats more than 70% of the + * CPU time. This is build around setrlimit() and SIGXCPU. It is handy + * in case of using SCHED_FIFO which may freeze the whole machine */ + +int pa_cpu_limit_init(pa_mainloop_api *m); +void pa_cpu_limit_done(void); + +#endif diff --git a/src/daemon/daemon-conf.c b/src/daemon/daemon-conf.c new file mode 100644 index 0000000..bcf7329 --- /dev/null +++ b/src/daemon/daemon-conf.c @@ -0,0 +1,872 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_SCHED_H +#include +#endif + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "daemon-conf.h" + +#define DEFAULT_SCRIPT_FILE PA_DEFAULT_CONFIG_DIR PA_PATH_SEP "default.pa" +#define DEFAULT_SCRIPT_FILE_USER PA_PATH_SEP "default.pa" +#define DEFAULT_SYSTEM_SCRIPT_FILE PA_DEFAULT_CONFIG_DIR PA_PATH_SEP "system.pa" + +#define DEFAULT_CONFIG_FILE PA_DEFAULT_CONFIG_DIR PA_PATH_SEP "daemon.conf" +#define DEFAULT_CONFIG_FILE_USER PA_PATH_SEP "daemon.conf" + +#define ENV_SCRIPT_FILE "PULSE_SCRIPT" +#define ENV_CONFIG_FILE "PULSE_CONFIG" +#define ENV_DL_SEARCH_PATH "PULSE_DLPATH" + +static const pa_daemon_conf default_conf = { + .cmd = PA_CMD_DAEMON, + .daemonize = false, + .fail = true, + .high_priority = true, + .nice_level = -11, + .realtime_scheduling = true, + .realtime_priority = 5, /* Half of JACK's default rtprio */ + .disallow_module_loading = false, + .disallow_exit = false, + .flat_volumes = false, + .rescue_streams = true, + .exit_idle_time = 20, + .scache_idle_time = 20, + .script_commands = NULL, + .dl_search_path = NULL, + .load_default_script_file = true, + .default_script_file = NULL, + .log_target = NULL, + .log_level = PA_LOG_NOTICE, + .log_backtrace = 0, + .log_meta = false, + .log_time = false, + .resample_method = PA_RESAMPLER_AUTO, + .avoid_resampling = false, + .disable_remixing = false, + .remixing_use_all_sink_channels = true, + .remixing_produce_lfe = false, + .remixing_consume_lfe = false, + .lfe_crossover_freq = 0, + .config_file = NULL, + .use_pid_file = true, + .system_instance = false, +#ifdef HAVE_DBUS + .local_server_type = PA_SERVER_TYPE_UNSET, /* The actual default is _USER, but we have to detect when the user doesn't specify this option. */ +#endif + .no_cpu_limit = true, + .disable_shm = false, + .disable_memfd = false, + .lock_memory = false, + .deferred_volume = true, + .default_n_fragments = 4, + .default_fragment_size_msec = 25, + .deferred_volume_safety_margin_usec = 8000, + .deferred_volume_extra_delay_usec = 0, + .default_sample_spec = { .format = PA_SAMPLE_S16NE, .rate = 44100, .channels = 2 }, + .alternate_sample_rate = 48000, + .default_channel_map = { .channels = 2, .map = { PA_CHANNEL_POSITION_LEFT, PA_CHANNEL_POSITION_RIGHT } }, + .shm_size = 0 +#ifdef HAVE_SYS_RESOURCE_H + ,.rlimit_fsize = { .value = 0, .is_set = false }, + .rlimit_data = { .value = 0, .is_set = false }, + .rlimit_stack = { .value = 0, .is_set = false }, + .rlimit_core = { .value = 0, .is_set = false } +#ifdef RLIMIT_RSS + ,.rlimit_rss = { .value = 0, .is_set = false } +#endif +#ifdef RLIMIT_NPROC + ,.rlimit_nproc = { .value = 0, .is_set = false } +#endif +#ifdef RLIMIT_NOFILE + ,.rlimit_nofile = { .value = 256, .is_set = true } +#endif +#ifdef RLIMIT_MEMLOCK + ,.rlimit_memlock = { .value = 0, .is_set = false } +#endif +#ifdef RLIMIT_AS + ,.rlimit_as = { .value = 0, .is_set = false } +#endif +#ifdef RLIMIT_LOCKS + ,.rlimit_locks = { .value = 0, .is_set = false } +#endif +#ifdef RLIMIT_SIGPENDING + ,.rlimit_sigpending = { .value = 0, .is_set = false } +#endif +#ifdef RLIMIT_MSGQUEUE + ,.rlimit_msgqueue = { .value = 0, .is_set = false } +#endif +#ifdef RLIMIT_NICE + ,.rlimit_nice = { .value = 31, .is_set = true } /* nice level of -11 */ +#endif +#ifdef RLIMIT_RTPRIO + ,.rlimit_rtprio = { .value = 9, .is_set = true } /* One below JACK's default for the server */ +#endif +#ifdef RLIMIT_RTTIME + ,.rlimit_rttime = { .value = 200*PA_USEC_PER_MSEC, .is_set = true } /* rtkit's limit is 200 ms */ +#endif +#endif +}; + +pa_daemon_conf *pa_daemon_conf_new(void) { + pa_daemon_conf *c; + + c = pa_xnewdup(pa_daemon_conf, &default_conf, 1); + +#ifdef OS_IS_WIN32 + c->dl_search_path = pa_sprintf_malloc("%s" PA_PATH_SEP "lib" PA_PATH_SEP "pulse-%d.%d" PA_PATH_SEP "modules", + pa_win32_get_toplevel(NULL), PA_MAJOR, PA_MINOR); +#else +#ifdef HAVE_RUNNING_FROM_BUILD_TREE + if (pa_run_from_build_tree()) { + pa_log_notice("Detected that we are run from the build tree, fixing search path."); +#ifdef MESON_BUILD + c->dl_search_path = pa_xstrdup(PA_BUILDDIR PA_PATH_SEP "src" PA_PATH_SEP "modules"); +#else + c->dl_search_path = pa_xstrdup(PA_BUILDDIR); +#endif // Endof #ifdef MESON_BUILD + } else +#endif // Endof #ifdef HAVE_RUNNING_FROM_BUILD_TREE + c->dl_search_path = pa_xstrdup(PA_DLSEARCHPATH); +#endif // Endof #ifdef OS_IS_WIN32 + + return c; +} + +void pa_daemon_conf_free(pa_daemon_conf *c) { + pa_assert(c); + + pa_xfree(c->script_commands); + pa_xfree(c->dl_search_path); + pa_xfree(c->default_script_file); + + if (c->log_target) + pa_log_target_free(c->log_target); + + pa_xfree(c->config_file); + pa_xfree(c); +} + +int pa_daemon_conf_set_log_target(pa_daemon_conf *c, const char *string) { + pa_log_target *log_target = NULL; + + pa_assert(c); + pa_assert(string); + + if (!pa_streq(string, "auto")) { + log_target = pa_log_parse_target(string); + + if (!log_target) + return -1; + } + + c->log_target = log_target; + + return 0; +} + +int pa_daemon_conf_set_log_level(pa_daemon_conf *c, const char *string) { + uint32_t u; + pa_assert(c); + pa_assert(string); + + if (pa_atou(string, &u) >= 0) { + if (u >= PA_LOG_LEVEL_MAX) + return -1; + + c->log_level = (pa_log_level_t) u; + } else if (pa_startswith(string, "debug")) + c->log_level = PA_LOG_DEBUG; + else if (pa_startswith(string, "info")) + c->log_level = PA_LOG_INFO; + else if (pa_startswith(string, "notice")) + c->log_level = PA_LOG_NOTICE; + else if (pa_startswith(string, "warn")) + c->log_level = PA_LOG_WARN; + else if (pa_startswith(string, "err")) + c->log_level = PA_LOG_ERROR; + else + return -1; + + return 0; +} + +int pa_daemon_conf_set_resample_method(pa_daemon_conf *c, const char *string) { + int m; + pa_assert(c); + pa_assert(string); + + if ((m = pa_parse_resample_method(string)) < 0) + return -1; + + c->resample_method = m; + return 0; +} + +int pa_daemon_conf_set_local_server_type(pa_daemon_conf *c, const char *string) { + pa_assert(c); + pa_assert(string); + + if (pa_streq(string, "user")) + c->local_server_type = PA_SERVER_TYPE_USER; + else if (pa_streq(string, "system")) { + c->local_server_type = PA_SERVER_TYPE_SYSTEM; + } else if (pa_streq(string, "none")) { + c->local_server_type = PA_SERVER_TYPE_NONE; + } else + return -1; + + return 0; +} + +static int parse_log_target(pa_config_parser_state *state) { + pa_daemon_conf *c; + + pa_assert(state); + + c = state->data; + + if (pa_daemon_conf_set_log_target(c, state->rvalue) < 0) { + pa_log(_("[%s:%u] Invalid log target '%s'."), state->filename, state->lineno, state->rvalue); + return -1; + } + + return 0; +} + +static int parse_log_level(pa_config_parser_state *state) { + pa_daemon_conf *c; + + pa_assert(state); + + c = state->data; + + if (pa_daemon_conf_set_log_level(c, state->rvalue) < 0) { + pa_log(_("[%s:%u] Invalid log level '%s'."), state->filename, state->lineno, state->rvalue); + return -1; + } + + return 0; +} + +static int parse_resample_method(pa_config_parser_state *state) { + pa_daemon_conf *c; + + pa_assert(state); + + c = state->data; + + if (pa_daemon_conf_set_resample_method(c, state->rvalue) < 0) { + pa_log(_("[%s:%u] Invalid resample method '%s'."), state->filename, state->lineno, state->rvalue); + return -1; + } + + return 0; +} + +#ifdef HAVE_SYS_RESOURCE_H +static int parse_rlimit(pa_config_parser_state *state) { + struct pa_rlimit *r; + + pa_assert(state); + + r = state->data; + + if (state->rvalue[strspn(state->rvalue, "\t ")] == 0) { + /* Empty string */ + r->is_set = 0; + r->value = 0; + } else { + int32_t k; + if (pa_atoi(state->rvalue, &k) < 0) { + pa_log(_("[%s:%u] Invalid rlimit '%s'."), state->filename, state->lineno, state->rvalue); + return -1; + } + r->is_set = k >= 0; + r->value = k >= 0 ? (rlim_t) k : 0; + } + + return 0; +} +#endif + +static int parse_sample_format(pa_config_parser_state *state) { + pa_daemon_conf *c; + pa_sample_format_t f; + + pa_assert(state); + + c = state->data; + + if ((f = pa_parse_sample_format(state->rvalue)) < 0) { + pa_log(_("[%s:%u] Invalid sample format '%s'."), state->filename, state->lineno, state->rvalue); + return -1; + } + + c->default_sample_spec.format = f; + return 0; +} + +static int parse_sample_rate(pa_config_parser_state *state) { + pa_daemon_conf *c; + uint32_t r; + + pa_assert(state); + + c = state->data; + + if (pa_atou(state->rvalue, &r) < 0 || !pa_sample_rate_valid(r)) { + pa_log(_("[%s:%u] Invalid sample rate '%s'."), state->filename, state->lineno, state->rvalue); + return -1; + } + + c->default_sample_spec.rate = r; + return 0; +} + +static int parse_alternate_sample_rate(pa_config_parser_state *state) { + pa_daemon_conf *c; + uint32_t r; + + pa_assert(state); + + c = state->data; + + if (pa_atou(state->rvalue, &r) < 0 || !pa_sample_rate_valid(r)) { + pa_log(_("[%s:%u] Invalid sample rate '%s'."), state->filename, state->lineno, state->rvalue); + return -1; + } + + c->alternate_sample_rate = r; + return 0; +} + +struct channel_conf_info { + pa_daemon_conf *conf; + bool default_sample_spec_set; + bool default_channel_map_set; +}; + +static int parse_sample_channels(pa_config_parser_state *state) { + struct channel_conf_info *i; + int32_t n; + + pa_assert(state); + + i = state->data; + + if (pa_atoi(state->rvalue, &n) < 0 || !pa_channels_valid(n)) { + pa_log(_("[%s:%u] Invalid sample channels '%s'."), state->filename, state->lineno, state->rvalue); + return -1; + } + + i->conf->default_sample_spec.channels = (uint8_t) n; + i->default_sample_spec_set = true; + return 0; +} + +static int parse_channel_map(pa_config_parser_state *state) { + struct channel_conf_info *i; + + pa_assert(state); + + i = state->data; + + if (!pa_channel_map_parse(&i->conf->default_channel_map, state->rvalue)) { + pa_log(_("[%s:%u] Invalid channel map '%s'."), state->filename, state->lineno, state->rvalue); + return -1; + } + + i->default_channel_map_set = true; + return 0; +} + +static int parse_fragments(pa_config_parser_state *state) { + pa_daemon_conf *c; + int32_t n; + + pa_assert(state); + + c = state->data; + + if (pa_atoi(state->rvalue, &n) < 0 || n < 2) { + pa_log(_("[%s:%u] Invalid number of fragments '%s'."), state->filename, state->lineno, state->rvalue); + return -1; + } + + c->default_n_fragments = (unsigned) n; + return 0; +} + +static int parse_fragment_size_msec(pa_config_parser_state *state) { + pa_daemon_conf *c; + int32_t n; + + pa_assert(state); + + c = state->data; + + if (pa_atoi(state->rvalue, &n) < 0 || n < 1) { + pa_log(_("[%s:%u] Invalid fragment size '%s'."), state->filename, state->lineno, state->rvalue); + return -1; + } + + c->default_fragment_size_msec = (unsigned) n; + return 0; +} + +static int parse_nice_level(pa_config_parser_state *state) { + pa_daemon_conf *c; + int32_t level; + + pa_assert(state); + + c = state->data; + + if (pa_atoi(state->rvalue, &level) < 0 || level < -20 || level > 19) { + pa_log(_("[%s:%u] Invalid nice level '%s'."), state->filename, state->lineno, state->rvalue); + return -1; + } + + c->nice_level = (int) level; + return 0; +} + +static int parse_rtprio(pa_config_parser_state *state) { +#if !defined(OS_IS_WIN32) && defined(HAVE_SCHED_H) + pa_daemon_conf *c; + int32_t rtprio; +#endif + + pa_assert(state); + +#ifdef OS_IS_WIN32 + pa_log("[%s:%u] Realtime priority not available on win32.", state->filename, state->lineno); +#else +# ifdef HAVE_SCHED_H + c = state->data; + + if (pa_atoi(state->rvalue, &rtprio) < 0 || rtprio < sched_get_priority_min(SCHED_FIFO) || rtprio > sched_get_priority_max(SCHED_FIFO)) { + pa_log("[%s:%u] Invalid realtime priority '%s'.", state->filename, state->lineno, state->rvalue); + return -1; + } + + c->realtime_priority = (int) rtprio; +# endif +#endif /* OS_IS_WIN32 */ + + return 0; +} + +static int parse_disable_lfe_remix(pa_config_parser_state *state) { + pa_daemon_conf *c; + int k; + + pa_assert(state); + c = state->data; + + if ((k = pa_parse_boolean(state->rvalue)) < 0) { + pa_log("[%s:%u] Failed to parse boolean value: %s", state->filename, state->lineno, state->rvalue); + return -1; + } + + c->remixing_produce_lfe = c->remixing_consume_lfe = !k; + + pa_log("[%s:%u] Deprecated option 'disable-lfe-remixing' found.", state->filename, state->lineno); + pa_log("[%s:%u] Please migrate to 'remixing-produce-lfe' and 'remixing-consume-lfe', set both to '%s'.", + state->filename, state->lineno, pa_yes_no(c->remixing_produce_lfe)); + + return 0; +} + +static int parse_enable_lfe_remix(pa_config_parser_state *state) { + pa_daemon_conf *c; + int k; + + pa_assert(state); + c = state->data; + + if ((k = pa_parse_boolean(state->rvalue)) < 0) { + pa_log("[%s:%u] Failed to parse boolean value: %s", state->filename, state->lineno, state->rvalue); + return -1; + } + + c->remixing_produce_lfe = c->remixing_consume_lfe = k; + + pa_log("[%s:%u] Deprecated option 'enable-lfe-remixing' found.", state->filename, state->lineno); + pa_log("[%s:%u] Please migrate to 'remixing-produce-lfe' and 'remixing-consume-lfe', set both to '%s'.", + state->filename, state->lineno, pa_yes_no(c->remixing_produce_lfe)); + + return 0; +} + +#ifdef HAVE_DBUS +static int parse_server_type(pa_config_parser_state *state) { + pa_daemon_conf *c; + + pa_assert(state); + + c = state->data; + + if (pa_daemon_conf_set_local_server_type(c, state->rvalue) < 0) { + pa_log(_("[%s:%u] Invalid server type '%s'."), state->filename, state->lineno, state->rvalue); + return -1; + } + + return 0; +} +#endif + +int pa_daemon_conf_load(pa_daemon_conf *c, const char *filename) { + int r = -1; + FILE *f = NULL; + struct channel_conf_info ci; + pa_config_item table[] = { + { "daemonize", pa_config_parse_bool, &c->daemonize, NULL }, + { "fail", pa_config_parse_bool, &c->fail, NULL }, + { "high-priority", pa_config_parse_bool, &c->high_priority, NULL }, + { "realtime-scheduling", pa_config_parse_bool, &c->realtime_scheduling, NULL }, + { "disallow-module-loading", pa_config_parse_bool, &c->disallow_module_loading, NULL }, + { "allow-module-loading", pa_config_parse_not_bool, &c->disallow_module_loading, NULL }, + { "disallow-exit", pa_config_parse_bool, &c->disallow_exit, NULL }, + { "allow-exit", pa_config_parse_not_bool, &c->disallow_exit, NULL }, + { "use-pid-file", pa_config_parse_bool, &c->use_pid_file, NULL }, + { "system-instance", pa_config_parse_bool, &c->system_instance, NULL }, +#ifdef HAVE_DBUS + { "local-server-type", parse_server_type, c, NULL }, +#endif + { "no-cpu-limit", pa_config_parse_bool, &c->no_cpu_limit, NULL }, + { "cpu-limit", pa_config_parse_not_bool, &c->no_cpu_limit, NULL }, + { "disable-shm", pa_config_parse_bool, &c->disable_shm, NULL }, + { "enable-shm", pa_config_parse_not_bool, &c->disable_shm, NULL }, + { "enable-memfd", pa_config_parse_not_bool, &c->disable_memfd, NULL }, + { "flat-volumes", pa_config_parse_bool, &c->flat_volumes, NULL }, + { "rescue-streams", pa_config_parse_bool, &c->rescue_streams, NULL }, + { "lock-memory", pa_config_parse_bool, &c->lock_memory, NULL }, + { "enable-deferred-volume", pa_config_parse_bool, &c->deferred_volume, NULL }, + { "exit-idle-time", pa_config_parse_int, &c->exit_idle_time, NULL }, + { "scache-idle-time", pa_config_parse_int, &c->scache_idle_time, NULL }, + { "realtime-priority", parse_rtprio, c, NULL }, + { "dl-search-path", pa_config_parse_string, &c->dl_search_path, NULL }, + { "default-script-file", pa_config_parse_string, &c->default_script_file, NULL }, + { "log-target", parse_log_target, c, NULL }, + { "log-level", parse_log_level, c, NULL }, + { "verbose", parse_log_level, c, NULL }, + { "resample-method", parse_resample_method, c, NULL }, + { "default-sample-format", parse_sample_format, c, NULL }, + { "default-sample-rate", parse_sample_rate, c, NULL }, + { "alternate-sample-rate", parse_alternate_sample_rate, c, NULL }, + { "default-sample-channels", parse_sample_channels, &ci, NULL }, + { "default-channel-map", parse_channel_map, &ci, NULL }, + { "default-fragments", parse_fragments, c, NULL }, + { "default-fragment-size-msec", parse_fragment_size_msec, c, NULL }, + { "deferred-volume-safety-margin-usec", + pa_config_parse_unsigned, &c->deferred_volume_safety_margin_usec, NULL }, + { "deferred-volume-extra-delay-usec", + pa_config_parse_int, &c->deferred_volume_extra_delay_usec, NULL }, + { "nice-level", parse_nice_level, c, NULL }, + { "avoid-resampling", pa_config_parse_bool, &c->avoid_resampling, NULL }, + { "disable-remixing", pa_config_parse_bool, &c->disable_remixing, NULL }, + { "enable-remixing", pa_config_parse_not_bool, &c->disable_remixing, NULL }, + { "remixing-use-all-sink-channels", + pa_config_parse_bool, &c->remixing_use_all_sink_channels, NULL }, + { "disable-lfe-remixing", parse_disable_lfe_remix, c, NULL }, + { "enable-lfe-remixing", parse_enable_lfe_remix, c, NULL }, + { "remixing-produce-lfe", pa_config_parse_bool, &c->remixing_produce_lfe, NULL }, + { "remixing-consume-lfe", pa_config_parse_bool, &c->remixing_consume_lfe, NULL }, + { "lfe-crossover-freq", pa_config_parse_unsigned, &c->lfe_crossover_freq, NULL }, + { "load-default-script-file", pa_config_parse_bool, &c->load_default_script_file, NULL }, + { "shm-size-bytes", pa_config_parse_size, &c->shm_size, NULL }, + { "log-meta", pa_config_parse_bool, &c->log_meta, NULL }, + { "log-time", pa_config_parse_bool, &c->log_time, NULL }, + { "log-backtrace", pa_config_parse_unsigned, &c->log_backtrace, NULL }, +#ifdef HAVE_SYS_RESOURCE_H + { "rlimit-fsize", parse_rlimit, &c->rlimit_fsize, NULL }, + { "rlimit-data", parse_rlimit, &c->rlimit_data, NULL }, + { "rlimit-stack", parse_rlimit, &c->rlimit_stack, NULL }, + { "rlimit-core", parse_rlimit, &c->rlimit_core, NULL }, +#ifdef RLIMIT_RSS + { "rlimit-rss", parse_rlimit, &c->rlimit_rss, NULL }, +#endif +#ifdef RLIMIT_NOFILE + { "rlimit-nofile", parse_rlimit, &c->rlimit_nofile, NULL }, +#endif +#ifdef RLIMIT_AS + { "rlimit-as", parse_rlimit, &c->rlimit_as, NULL }, +#endif +#ifdef RLIMIT_NPROC + { "rlimit-nproc", parse_rlimit, &c->rlimit_nproc, NULL }, +#endif +#ifdef RLIMIT_MEMLOCK + { "rlimit-memlock", parse_rlimit, &c->rlimit_memlock, NULL }, +#endif +#ifdef RLIMIT_LOCKS + { "rlimit-locks", parse_rlimit, &c->rlimit_locks, NULL }, +#endif +#ifdef RLIMIT_SIGPENDING + { "rlimit-sigpending", parse_rlimit, &c->rlimit_sigpending, NULL }, +#endif +#ifdef RLIMIT_MSGQUEUE + { "rlimit-msgqueue", parse_rlimit, &c->rlimit_msgqueue, NULL }, +#endif +#ifdef RLIMIT_NICE + { "rlimit-nice", parse_rlimit, &c->rlimit_nice, NULL }, +#endif +#ifdef RLIMIT_RTPRIO + { "rlimit-rtprio", parse_rlimit, &c->rlimit_rtprio, NULL }, +#endif +#ifdef RLIMIT_RTTIME + { "rlimit-rttime", parse_rlimit, &c->rlimit_rttime, NULL }, +#endif +#endif + { NULL, NULL, NULL, NULL }, + }; + + pa_xfree(c->config_file); + c->config_file = NULL; + + f = filename ? + pa_fopen_cloexec(c->config_file = pa_xstrdup(filename), "r") : + pa_open_config_file(DEFAULT_CONFIG_FILE, DEFAULT_CONFIG_FILE_USER, ENV_CONFIG_FILE, &c->config_file); + + if (!f && errno != ENOENT) { + pa_log_warn(_("Failed to open configuration file: %s"), pa_cstrerror(errno)); + goto finish; + } + + ci.default_channel_map_set = ci.default_sample_spec_set = false; + ci.conf = c; + + r = f ? pa_config_parse(c->config_file, f, table, NULL, true, NULL) : 0; + + if (r >= 0) { + + /* Make sure that channel map and sample spec fit together */ + + if (ci.default_sample_spec_set && + ci.default_channel_map_set && + c->default_channel_map.channels != c->default_sample_spec.channels) { + pa_log_error(_("The specified default channel map has a different number of channels than the specified default number of channels.")); + r = -1; + goto finish; + } else if (ci.default_sample_spec_set) + pa_channel_map_init_extend(&c->default_channel_map, c->default_sample_spec.channels, PA_CHANNEL_MAP_DEFAULT); + else if (ci.default_channel_map_set) + c->default_sample_spec.channels = c->default_channel_map.channels; + } + +finish: + if (f) + fclose(f); + + return r; +} + +int pa_daemon_conf_env(pa_daemon_conf *c) { + char *e; + pa_assert(c); + + if ((e = getenv(ENV_DL_SEARCH_PATH))) { + pa_xfree(c->dl_search_path); + c->dl_search_path = pa_xstrdup(e); + } + if ((e = getenv(ENV_SCRIPT_FILE))) { + pa_xfree(c->default_script_file); + c->default_script_file = pa_xstrdup(e); + } + + return 0; +} + +const char *pa_daemon_conf_get_default_script_file(pa_daemon_conf *c) { + pa_assert(c); + + if (!c->default_script_file) { + if (c->system_instance) + c->default_script_file = pa_find_config_file(DEFAULT_SYSTEM_SCRIPT_FILE, NULL, ENV_SCRIPT_FILE); + else + c->default_script_file = pa_find_config_file(DEFAULT_SCRIPT_FILE, DEFAULT_SCRIPT_FILE_USER, ENV_SCRIPT_FILE); + } + + return c->default_script_file; +} + +FILE *pa_daemon_conf_open_default_script_file(pa_daemon_conf *c) { + FILE *f; + pa_assert(c); + + if (!c->default_script_file) { + if (c->system_instance) + f = pa_open_config_file(DEFAULT_SYSTEM_SCRIPT_FILE, NULL, ENV_SCRIPT_FILE, &c->default_script_file); + else + f = pa_open_config_file(DEFAULT_SCRIPT_FILE, DEFAULT_SCRIPT_FILE_USER, ENV_SCRIPT_FILE, &c->default_script_file); + } else + f = pa_fopen_cloexec(c->default_script_file, "r"); + + return f; +} + +char *pa_daemon_conf_dump(pa_daemon_conf *c) { + static const char* const log_level_to_string[] = { + [PA_LOG_DEBUG] = "debug", + [PA_LOG_INFO] = "info", + [PA_LOG_NOTICE] = "notice", + [PA_LOG_WARN] = "warning", + [PA_LOG_ERROR] = "error" + }; + +#ifdef HAVE_DBUS + static const char* const server_type_to_string[] = { + [PA_SERVER_TYPE_UNSET] = "!!UNSET!!", + [PA_SERVER_TYPE_USER] = "user", + [PA_SERVER_TYPE_SYSTEM] = "system", + [PA_SERVER_TYPE_NONE] = "none" + }; +#endif + + pa_strbuf *s; + char cm[PA_CHANNEL_MAP_SNPRINT_MAX]; + char *log_target = NULL; + + pa_assert(c); + + s = pa_strbuf_new(); + + if (c->config_file) + pa_strbuf_printf(s, _("### Read from configuration file: %s ###\n"), c->config_file); + + pa_assert(c->log_level < PA_LOG_LEVEL_MAX); + + if (c->log_target) + log_target = pa_log_target_to_string(c->log_target); + + pa_strbuf_printf(s, "daemonize = %s\n", pa_yes_no(c->daemonize)); + pa_strbuf_printf(s, "fail = %s\n", pa_yes_no(c->fail)); + pa_strbuf_printf(s, "high-priority = %s\n", pa_yes_no(c->high_priority)); + pa_strbuf_printf(s, "nice-level = %i\n", c->nice_level); + pa_strbuf_printf(s, "realtime-scheduling = %s\n", pa_yes_no(c->realtime_scheduling)); + pa_strbuf_printf(s, "realtime-priority = %i\n", c->realtime_priority); + pa_strbuf_printf(s, "allow-module-loading = %s\n", pa_yes_no(!c->disallow_module_loading)); + pa_strbuf_printf(s, "allow-exit = %s\n", pa_yes_no(!c->disallow_exit)); + pa_strbuf_printf(s, "use-pid-file = %s\n", pa_yes_no(c->use_pid_file)); + pa_strbuf_printf(s, "system-instance = %s\n", pa_yes_no(c->system_instance)); +#ifdef HAVE_DBUS + pa_strbuf_printf(s, "local-server-type = %s\n", server_type_to_string[c->local_server_type]); +#endif + pa_strbuf_printf(s, "cpu-limit = %s\n", pa_yes_no(!c->no_cpu_limit)); + pa_strbuf_printf(s, "enable-shm = %s\n", pa_yes_no(!c->disable_shm)); + pa_strbuf_printf(s, "flat-volumes = %s\n", pa_yes_no(c->flat_volumes)); + pa_strbuf_printf(s, "rescue-streams = %s\n", pa_yes_no(c->rescue_streams)); + pa_strbuf_printf(s, "lock-memory = %s\n", pa_yes_no(c->lock_memory)); + pa_strbuf_printf(s, "exit-idle-time = %i\n", c->exit_idle_time); + pa_strbuf_printf(s, "scache-idle-time = %i\n", c->scache_idle_time); + pa_strbuf_printf(s, "dl-search-path = %s\n", pa_strempty(c->dl_search_path)); + pa_strbuf_printf(s, "default-script-file = %s\n", pa_strempty(pa_daemon_conf_get_default_script_file(c))); + pa_strbuf_printf(s, "load-default-script-file = %s\n", pa_yes_no(c->load_default_script_file)); + pa_strbuf_printf(s, "log-target = %s\n", pa_strempty(log_target)); + pa_strbuf_printf(s, "log-level = %s\n", log_level_to_string[c->log_level]); + pa_strbuf_printf(s, "resample-method = %s\n", pa_resample_method_to_string(c->resample_method)); + pa_strbuf_printf(s, "avoid-resampling = %s\n", pa_yes_no(c->avoid_resampling)); + pa_strbuf_printf(s, "enable-remixing = %s\n", pa_yes_no(!c->disable_remixing)); + pa_strbuf_printf(s, "remixing-use-all-sink-channels = %s\n", pa_yes_no(c->remixing_use_all_sink_channels)); + pa_strbuf_printf(s, "remixing-produce-lfe = %s\n", pa_yes_no(c->remixing_produce_lfe)); + pa_strbuf_printf(s, "remixing-consume-lfe = %s\n", pa_yes_no(c->remixing_consume_lfe)); + pa_strbuf_printf(s, "lfe-crossover-freq = %u\n", c->lfe_crossover_freq); + pa_strbuf_printf(s, "default-sample-format = %s\n", pa_sample_format_to_string(c->default_sample_spec.format)); + pa_strbuf_printf(s, "default-sample-rate = %u\n", c->default_sample_spec.rate); + pa_strbuf_printf(s, "alternate-sample-rate = %u\n", c->alternate_sample_rate); + pa_strbuf_printf(s, "default-sample-channels = %u\n", c->default_sample_spec.channels); + pa_strbuf_printf(s, "default-channel-map = %s\n", pa_channel_map_snprint(cm, sizeof(cm), &c->default_channel_map)); + pa_strbuf_printf(s, "default-fragments = %u\n", c->default_n_fragments); + pa_strbuf_printf(s, "default-fragment-size-msec = %u\n", c->default_fragment_size_msec); + pa_strbuf_printf(s, "enable-deferred-volume = %s\n", pa_yes_no(c->deferred_volume)); + pa_strbuf_printf(s, "deferred-volume-safety-margin-usec = %u\n", c->deferred_volume_safety_margin_usec); + pa_strbuf_printf(s, "deferred-volume-extra-delay-usec = %d\n", c->deferred_volume_extra_delay_usec); + pa_strbuf_printf(s, "shm-size-bytes = %lu\n", (unsigned long) c->shm_size); + pa_strbuf_printf(s, "log-meta = %s\n", pa_yes_no(c->log_meta)); + pa_strbuf_printf(s, "log-time = %s\n", pa_yes_no(c->log_time)); + pa_strbuf_printf(s, "log-backtrace = %u\n", c->log_backtrace); +#ifdef HAVE_SYS_RESOURCE_H + pa_strbuf_printf(s, "rlimit-fsize = %li\n", c->rlimit_fsize.is_set ? (long int) c->rlimit_fsize.value : -1); + pa_strbuf_printf(s, "rlimit-data = %li\n", c->rlimit_data.is_set ? (long int) c->rlimit_data.value : -1); + pa_strbuf_printf(s, "rlimit-stack = %li\n", c->rlimit_stack.is_set ? (long int) c->rlimit_stack.value : -1); + pa_strbuf_printf(s, "rlimit-core = %li\n", c->rlimit_core.is_set ? (long int) c->rlimit_core.value : -1); +#ifdef RLIMIT_RSS + pa_strbuf_printf(s, "rlimit-rss = %li\n", c->rlimit_rss.is_set ? (long int) c->rlimit_rss.value : -1); +#endif +#ifdef RLIMIT_AS + pa_strbuf_printf(s, "rlimit-as = %li\n", c->rlimit_as.is_set ? (long int) c->rlimit_as.value : -1); +#endif +#ifdef RLIMIT_NPROC + pa_strbuf_printf(s, "rlimit-nproc = %li\n", c->rlimit_nproc.is_set ? (long int) c->rlimit_nproc.value : -1); +#endif +#ifdef RLIMIT_NOFILE + pa_strbuf_printf(s, "rlimit-nofile = %li\n", c->rlimit_nofile.is_set ? (long int) c->rlimit_nofile.value : -1); +#endif +#ifdef RLIMIT_MEMLOCK + pa_strbuf_printf(s, "rlimit-memlock = %li\n", c->rlimit_memlock.is_set ? (long int) c->rlimit_memlock.value : -1); +#endif +#ifdef RLIMIT_LOCKS + pa_strbuf_printf(s, "rlimit-locks = %li\n", c->rlimit_locks.is_set ? (long int) c->rlimit_locks.value : -1); +#endif +#ifdef RLIMIT_SIGPENDING + pa_strbuf_printf(s, "rlimit-sigpending = %li\n", c->rlimit_sigpending.is_set ? (long int) c->rlimit_sigpending.value : -1); +#endif +#ifdef RLIMIT_MSGQUEUE + pa_strbuf_printf(s, "rlimit-msgqueue = %li\n", c->rlimit_msgqueue.is_set ? (long int) c->rlimit_msgqueue.value : -1); +#endif +#ifdef RLIMIT_NICE + pa_strbuf_printf(s, "rlimit-nice = %li\n", c->rlimit_nice.is_set ? (long int) c->rlimit_nice.value : -1); +#endif +#ifdef RLIMIT_RTPRIO + pa_strbuf_printf(s, "rlimit-rtprio = %li\n", c->rlimit_rtprio.is_set ? (long int) c->rlimit_rtprio.value : -1); +#endif +#ifdef RLIMIT_RTTIME + pa_strbuf_printf(s, "rlimit-rttime = %li\n", c->rlimit_rttime.is_set ? (long int) c->rlimit_rttime.value : -1); +#endif +#endif + + pa_xfree(log_target); + + return pa_strbuf_to_string_free(s); +} diff --git a/src/daemon/daemon-conf.h b/src/daemon/daemon-conf.h new file mode 100644 index 0000000..fa713b9 --- /dev/null +++ b/src/daemon/daemon-conf.h @@ -0,0 +1,169 @@ +#ifndef foodaemonconfhfoo +#define foodaemonconfhfoo + +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#include +#include + +#include +#include +#include +#include + +#ifdef HAVE_SYS_RESOURCE_H +#include +#endif + +/* The actual command to execute */ +typedef enum pa_daemon_conf_cmd { + PA_CMD_DAEMON, /* the default */ + PA_CMD_START, + PA_CMD_HELP, + PA_CMD_VERSION, + PA_CMD_DUMP_CONF, + PA_CMD_DUMP_MODULES, + PA_CMD_KILL, + PA_CMD_CHECK, + PA_CMD_DUMP_RESAMPLE_METHODS, + PA_CMD_CLEANUP_SHM +} pa_daemon_conf_cmd_t; + +#ifdef HAVE_SYS_RESOURCE_H +typedef struct pa_rlimit { + rlim_t value; + bool is_set; +} pa_rlimit; +#endif + +/* A structure containing configuration data for the PulseAudio server . */ +typedef struct pa_daemon_conf { + pa_daemon_conf_cmd_t cmd; + bool daemonize, + fail, + high_priority, + realtime_scheduling, + disallow_module_loading, + use_pid_file, + system_instance, + no_cpu_limit, + disable_shm, + disable_memfd, + avoid_resampling, + disable_remixing, + remixing_use_all_sink_channels, + remixing_produce_lfe, + remixing_consume_lfe, + load_default_script_file, + disallow_exit, + log_meta, + log_time, + flat_volumes, + rescue_streams, + lock_memory, + deferred_volume; + pa_server_type_t local_server_type; + int exit_idle_time, + scache_idle_time, + realtime_priority, + nice_level, + resample_method; + char *script_commands, *dl_search_path, *default_script_file; + pa_log_target *log_target; + pa_log_level_t log_level; + unsigned log_backtrace; + char *config_file; + +#ifdef HAVE_SYS_RESOURCE_H + pa_rlimit rlimit_fsize, rlimit_data, rlimit_stack, rlimit_core; +#ifdef RLIMIT_RSS + pa_rlimit rlimit_rss; +#endif +#ifdef RLIMIT_NOFILE + pa_rlimit rlimit_nofile; +#endif +#ifdef RLIMIT_AS + pa_rlimit rlimit_as; +#endif +#ifdef RLIMIT_NPROC + pa_rlimit rlimit_nproc; +#endif +#ifdef RLIMIT_MEMLOCK + pa_rlimit rlimit_memlock; +#endif +#ifdef RLIMIT_LOCKS + pa_rlimit rlimit_locks; +#endif +#ifdef RLIMIT_SIGPENDING + pa_rlimit rlimit_sigpending; +#endif +#ifdef RLIMIT_MSGQUEUE + pa_rlimit rlimit_msgqueue; +#endif +#ifdef RLIMIT_NICE + pa_rlimit rlimit_nice; +#endif +#ifdef RLIMIT_RTPRIO + pa_rlimit rlimit_rtprio; +#endif +#ifdef RLIMIT_RTTIME + pa_rlimit rlimit_rttime; +#endif +#endif + + unsigned default_n_fragments, default_fragment_size_msec; + unsigned deferred_volume_safety_margin_usec; + int deferred_volume_extra_delay_usec; + unsigned lfe_crossover_freq; + pa_sample_spec default_sample_spec; + uint32_t alternate_sample_rate; + pa_channel_map default_channel_map; + size_t shm_size; +} pa_daemon_conf; + +/* Allocate a new structure and fill it with sane defaults */ +pa_daemon_conf* pa_daemon_conf_new(void); +void pa_daemon_conf_free(pa_daemon_conf*c); + +/* Load configuration data from the specified file overwriting the + * current settings in *c. If filename is NULL load the default daemon + * configuration file */ +int pa_daemon_conf_load(pa_daemon_conf *c, const char *filename); + +/* Pretty print the current configuration data of the daemon. The + * returned string has to be freed manually. The output of this + * function may be parsed with pa_daemon_conf_load(). */ +char *pa_daemon_conf_dump(pa_daemon_conf *c); + +/* Load the configuration data from the process' environment + * overwriting the current settings in *c. */ +int pa_daemon_conf_env(pa_daemon_conf *c); + +/* Set these configuration variables in the structure by passing a string */ +int pa_daemon_conf_set_log_target(pa_daemon_conf *c, const char *string); +int pa_daemon_conf_set_log_level(pa_daemon_conf *c, const char *string); +int pa_daemon_conf_set_resample_method(pa_daemon_conf *c, const char *string); +int pa_daemon_conf_set_local_server_type(pa_daemon_conf *c, const char *string); + +const char *pa_daemon_conf_get_default_script_file(pa_daemon_conf *c); +FILE *pa_daemon_conf_open_default_script_file(pa_daemon_conf *c); + +#endif diff --git a/src/daemon/daemon.conf.in b/src/daemon/daemon.conf.in new file mode 100644 index 0000000..7409976 --- /dev/null +++ b/src/daemon/daemon.conf.in @@ -0,0 +1,97 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +## Configuration file for the PulseAudio daemon. See pulse-daemon.conf(5) for +## more information. Default values are commented out. Use either ; or # for +## commenting. +changequote(`[', `]')dnl Set up m4 quoting + +; daemonize = no +; fail = yes +; allow-module-loading = yes +; allow-exit = yes +; use-pid-file = yes +; system-instance = no +ifelse(@HAVE_DBUS@, 1, [dnl +; local-server-type = user +])dnl +; enable-shm = yes +; enable-memfd = yes +; shm-size-bytes = 0 # setting this 0 will use the system-default, usually 64 MiB +; lock-memory = no +; cpu-limit = no + +; high-priority = yes +; nice-level = -11 + +; realtime-scheduling = yes +; realtime-priority = 5 + +; exit-idle-time = 20 +; scache-idle-time = 20 + +; dl-search-path = (depends on architecture) + +; load-default-script-file = yes +; default-script-file = @PA_DEFAULT_CONFIG_DIR@/default.pa + +; log-target = auto +; log-level = notice +; log-meta = no +; log-time = no +; log-backtrace = 0 + +; resample-method = speex-float-1 +; avoid-resampling = false +; enable-remixing = yes +; remixing-use-all-sink-channels = yes +; remixing-produce-lfe = no +; remixing-consume-lfe = no +; lfe-crossover-freq = 0 + +; flat-volumes = no + +; rescue-streams = yes + +ifelse(@HAVE_SYS_RESOURCE_H@, 1, [dnl +; rlimit-fsize = -1 +; rlimit-data = -1 +; rlimit-stack = -1 +; rlimit-core = -1 +; rlimit-as = -1 +; rlimit-rss = -1 +; rlimit-nproc = -1 +; rlimit-nofile = 256 +; rlimit-memlock = -1 +; rlimit-locks = -1 +; rlimit-sigpending = -1 +; rlimit-msgqueue = -1 +; rlimit-nice = 31 +; rlimit-rtprio = 9 +; rlimit-rttime = 200000 +])dnl + +; default-sample-format = s16le +; default-sample-rate = 44100 +; alternate-sample-rate = 48000 +; default-sample-channels = 2 +; default-channel-map = front-left,front-right + +; default-fragments = 4 +; default-fragment-size-msec = 25 + +; enable-deferred-volume = yes +; deferred-volume-safety-margin-usec = 8000 +; deferred-volume-extra-delay-usec = 0 diff --git a/src/daemon/default.pa.in b/src/daemon/default.pa.in new file mode 100755 index 0000000..030334f --- /dev/null +++ b/src/daemon/default.pa.in @@ -0,0 +1,175 @@ +#!@PA_BINARY@ -nF +# +# This file is part of PulseAudio. +# +# PulseAudio 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 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +# This startup script is used only if PulseAudio is started per-user +# (i.e. not in system mode) +changequote(`[', `]')dnl Set up m4 quoting + +.fail + +### Automatically restore the volume of streams and devices +load-module module-device-restore +load-module module-stream-restore +load-module module-card-restore + +### Automatically augment property information from .desktop files +### stored in /usr/share/application +load-module module-augment-properties + +### Should be after module-*-restore but before module-*-detect +load-module module-switch-on-port-available + +### Load audio drivers statically +### (it's probably better to not load these drivers manually, but instead +### use module-udev-detect -- see below -- for doing this automatically) +ifelse(@HAVE_ALSA@, 1, [dnl +#load-module module-alsa-sink +#load-module module-alsa-source device=hw:1,0 +])dnl +ifelse(@HAVE_OSS_OUTPUT@, 1, [dnl +#load-module module-oss device="/dev/dsp" sink_name=output source_name=input +#load-module module-oss-mmap device="/dev/dsp" sink_name=output source_name=input +])dnl +ifelse(@HAVE_WAVEOUT@, 1, [dnl +load-module module-waveout sink_name=output source_name=input +])dnl +#load-module module-null-sink +ifelse(@HAVE_MKFIFO@, 1, [dnl +#load-module module-pipe-sink +])dnl + +### Automatically load driver modules depending on the hardware available +ifelse(@HAVE_UDEV@, 1, [dnl +.ifexists module-udev-detect@PA_SOEXT@ +load-module module-udev-detect +.else +], @HAVE_COREAUDIO@, 1, [dnl +.ifexists module-coreaudio-detect@PA_SOEXT@ +load-module module-coreaudio-detect +.else +], [dnl +.ifexists module-detect@PA_SOEXT@ +])dnl +### Use the static hardware detection module (for systems that lack udev support) +load-module module-detect +.endif + +### Automatically connect sink and source if JACK server is present +.ifexists module-jackdbus-detect@PA_SOEXT@ +.nofail +load-module module-jackdbus-detect channels=2 +.fail +.endif + +ifelse(@HAVE_BLUEZ@, 1, [dnl +### Automatically load driver modules for Bluetooth hardware +.ifexists module-bluetooth-policy@PA_SOEXT@ +load-module module-bluetooth-policy +.endif + +.ifexists module-bluetooth-discover@PA_SOEXT@ +load-module module-bluetooth-discover +.endif +])dnl + +ifelse(@HAVE_AF_UNIX@, 1, [dnl +### Load several protocols +.ifexists module-esound-protocol-unix@PA_SOEXT@ +load-module module-esound-protocol-unix +.endif +load-module module-native-protocol-unix +])dnl + +### Network access (may be configured with paprefs, so leave this commented +### here if you plan to use paprefs) +#load-module module-esound-protocol-tcp +#load-module module-native-protocol-tcp +ifelse(@HAVE_AVAHI@, 1, [dnl +#load-module module-zeroconf-publish +])dnl + +ifelse(@OS_IS_WIN32@, 0, [dnl +### Load the RTP receiver module (also configured via paprefs, see above) +#load-module module-rtp-recv + +### Load the RTP sender module (also configured via paprefs, see above) +#load-module module-null-sink sink_name=rtp format=s16be channels=2 rate=44100 sink_properties="device.description='RTP Multicast Sink'" +#load-module module-rtp-send source=rtp.monitor + +ifelse(@HAVE_GSETTINGS@, 1, [dnl +### Load additional modules from GSettings. This can be configured with the paprefs tool. +### Please keep in mind that the modules configured by paprefs might conflict with manually +### loaded modules. +.ifexists module-gsettings@PA_SOEXT@ +.nofail +load-module module-gsettings +.fail +.endif +])dnl + +ifelse(@HAVE_GCONF@, 1, [dnl +### Load additional modules from GConf settings. This can be configured with the paprefs tool. +### Please keep in mind that the modules configured by paprefs might conflict with manually +### loaded modules. +.ifexists module-gconf@PA_SOEXT@ +.nofail +load-module module-gconf +.fail +.endif +])dnl + +### Automatically restore the default sink/source when changed by the user +### during runtime +### NOTE: This should be loaded as early as possible so that subsequent modules +### that look up the default sink/source get the right value +load-module module-default-device-restore + +### Make sure we always have a sink around, even if it is a null sink. +load-module module-always-sink + +### Honour intended role device property +load-module module-intended-roles + +### Automatically suspend sinks/sources that become idle for too long +load-module module-suspend-on-idle + +### If autoexit on idle is enabled we want to make sure we only quit +### when no local session needs us anymore. +.ifexists module-console-kit@PA_SOEXT@ +load-module module-console-kit +.endif +.ifexists module-systemd-login@PA_SOEXT@ +load-module module-systemd-login +.endif + +### Enable positioned event sounds +load-module module-position-event-sounds + +### Cork music/video streams when a phone stream is active +load-module module-role-cork + +### Modules to allow autoloading of filters (such as echo cancellation) +### on demand. module-filter-heuristics tries to determine what filters +### make sense, and module-filter-apply does the heavy-lifting of +### loading modules and rerouting streams. +load-module module-filter-heuristics +load-module module-filter-apply +])dnl + +### Make some devices default +#set-default-sink output +#set-default-source input diff --git a/src/daemon/dumpmodules.c b/src/daemon/dumpmodules.c new file mode 100644 index 0000000..8410bbc --- /dev/null +++ b/src/daemon/dumpmodules.c @@ -0,0 +1,154 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include "dumpmodules.h" + +#define PREFIX "module-" + +static void short_info(const char *name, const char *path, pa_modinfo *i) { + pa_assert(name); + pa_assert(i); + + printf("%-40s%s\n", name, i->description ? i->description : "n/a"); +} + +static void long_info(const char *name, const char *path, pa_modinfo *i) { + static int nl = 0; + pa_assert(name); + pa_assert(i); + + if (nl) + printf("\n"); + + nl = 1; + + printf(_("Name: %s\n"), name); + + if (!i->description && !i->version && !i->author && !i->usage) + printf(_("No module information available\n")); + else { + if (i->version) + printf(_("Version: %s\n"), i->version); + if (i->description) + printf(_("Description: %s\n"), i->description); + if (i->author) + printf(_("Author: %s\n"), i->author); + if (i->usage) + printf(_("Usage: %s\n"), i->usage); + printf(_("Load Once: %s\n"), pa_yes_no(i->load_once)); + if (i->deprecated) + printf(_("DEPRECATION WARNING: %s\n"), i->deprecated); + } + + if (path) + printf(_("Path: %s\n"), path); +} + +static void show_info(const char *name, const char *path, void (*info)(const char *name, const char *path, pa_modinfo*i)) { + pa_modinfo *i; + + pa_assert(name); + + if ((i = pa_modinfo_get_by_name(path ? path : name))) { + info(name, path, i); + pa_modinfo_free(i); + } +} + +static int is_preloaded(const char *name) { + const lt_dlsymlist *l; + + for (l = lt_preloaded_symbols; l->name; l++) { + char buf[64], *e; + + if (l->address) + continue; + + pa_snprintf(buf, sizeof(buf), "%s", l->name); + if ((e = strrchr(buf, '.'))) + *e = 0; + + if (pa_streq(name, buf)) + return 1; + } + + return 0; +} + +static int callback(const char *path, lt_ptr data) { + const char *e; + pa_daemon_conf *c = (data); + + e = pa_path_get_filename(path); + + if (strlen(e) <= sizeof(PREFIX)-1 || strncmp(e, PREFIX, sizeof(PREFIX)-1)) + return 0; + + if (is_preloaded(e)) + return 0; + + show_info(e, path, c->log_level >= PA_LOG_INFO ? long_info : short_info); + return 0; +} + +void pa_dump_modules(pa_daemon_conf *c, int argc, char * const argv[]) { + pa_assert(c); + + if (argc > 0) { + int i; + for (i = 0; i < argc; i++) + show_info(argv[i], NULL, long_info); + } else { + const lt_dlsymlist *l; + + for (l = lt_preloaded_symbols; l->name; l++) { + char buf[64], *e; + + if (l->address) + continue; + + if (strlen(l->name) <= sizeof(PREFIX)-1 || strncmp(l->name, PREFIX, sizeof(PREFIX)-1)) + continue; + + pa_snprintf(buf, sizeof(buf), "%s", l->name); + if ((e = strrchr(buf, '.'))) + *e = 0; + + show_info(buf, NULL, c->log_level >= PA_LOG_INFO ? long_info : short_info); + } + + lt_dlforeachfile(NULL, callback, c); + } +} diff --git a/src/daemon/dumpmodules.h b/src/daemon/dumpmodules.h new file mode 100644 index 0000000..289f35d --- /dev/null +++ b/src/daemon/dumpmodules.h @@ -0,0 +1,29 @@ +#ifndef foodumpmoduleshfoo +#define foodumpmoduleshfoo + +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#include "daemon-conf.h" + +/* Dump all available modules to STDOUT. If argc > 0 print information + * about the modules specified in argv[] instead. */ +void pa_dump_modules(pa_daemon_conf *c, int argc, char * const argv[]); + +#endif diff --git a/src/daemon/esdcompat.in b/src/daemon/esdcompat.in new file mode 100755 index 0000000..361ca63 --- /dev/null +++ b/src/daemon/esdcompat.in @@ -0,0 +1,94 @@ +#!/bin/sh + +# This file is part of PulseAudio. +# +# PulseAudio 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 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +VERSION_STRING="@PACKAGE_NAME@ esd wrapper @PACKAGE_VERSION@" + +fail() { + echo "ERROR: $1" + exit 1 +} + +ARGS=" --log-target=syslog" + +while [ "$#" -gt "0" ]; do + + case "$1" in + "") + ;; + + -v|--version) + echo "$VERSION_STRING" + exit 0 + ;; + + -h|--help) + cat < for Cendio AB + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef HAVE_DLFCN_H +#include +#endif + +#ifdef HAVE_SYS_DL_H +#include +#endif + +#include + +#include + +#include +#include +#include + +#include "ltdl-bind-now.h" + +#ifdef RTLD_NOW +#define PA_BIND_NOW RTLD_NOW +#elif defined(DL_NOW) +#define PA_BIND_NOW DL_NOW +#else +#undef PA_BIND_NOW +#endif + +#ifdef OS_IS_WIN32 +#undef PA_BIND_NOW +#endif + +#ifdef PA_BIND_NOW + +/* + To avoid lazy relocations during runtime in our RT threads we add + our own shared object loader with uses RTLD_NOW if it is + available. The standard ltdl loader prefers RTLD_LAZY. + + Please note that this loader doesn't have any influence on + relocations on any libraries that are already loaded into our + process, i.e. because the pulseaudio binary links directly to + them. To disable lazy relocations for those libraries it is possible + to set $LT_BIND_NOW before starting the pulseaudio binary. +*/ + +static lt_module bind_now_open(lt_user_data d, const char *fname, lt_dladvise advise) { + lt_module m; + + pa_assert(fname); + + if (!(m = dlopen(fname, PA_BIND_NOW))) { + pa_log(_("Failed to open module %s: %s"), fname, dlerror()); + lt_dlseterror(LT_ERROR_CANNOT_OPEN); + return NULL; + } + + return m; +} + +static int bind_now_close(lt_user_data d, lt_module m) { + + pa_assert(m); + + if (dlclose(m) != 0) { + lt_dlseterror(LT_ERROR_CANNOT_CLOSE); + return 1; + } + + return 0; +} + +static lt_ptr bind_now_find_sym(lt_user_data d, lt_module m, const char *symbol) { + lt_ptr ptr; + + pa_assert(m); + pa_assert(symbol); + + if (!(ptr = dlsym(m, symbol))) { + lt_dlseterror(LT_ERROR_SYMBOL_NOT_FOUND); + return NULL; + } + + return ptr; +} + +static lt_dlvtable *bindnow_loader = NULL; +#endif + +void pa_ltdl_init(void) { + +#ifdef PA_BIND_NOW + const lt_dlvtable *dlopen_loader; +#endif + + pa_assert_se(lt_dlinit() == 0); + +#ifdef PA_BIND_NOW + /* Already initialised */ + if (bindnow_loader) + return; + + if (!(dlopen_loader = lt_dlloader_find((char*) "lt_dlopen"))) { + pa_log_warn(_("Failed to find original lt_dlopen loader.")); + return; + } + + if (!(bindnow_loader = malloc(sizeof(lt_dlvtable)))) { + pa_log_error(_("Failed to allocate new dl loader.")); + return; + } + + memcpy(bindnow_loader, dlopen_loader, sizeof(*bindnow_loader)); + bindnow_loader->name = "bind-now-loader"; + bindnow_loader->module_open = bind_now_open; + bindnow_loader->module_close = bind_now_close; + bindnow_loader->find_sym = bind_now_find_sym; + bindnow_loader->priority = LT_DLLOADER_PREPEND; + + /* Add our BIND_NOW loader as the default module loader. */ + if (lt_dlloader_add(bindnow_loader) != 0) { + pa_log_warn(_("Failed to add bind-now-loader.")); + free(bindnow_loader); + bindnow_loader = NULL; + } +#endif +} + +void pa_ltdl_done(void) { + pa_assert_se(lt_dlexit() == 0); + +#ifdef PA_BIND_NOW + /* lt_dlexit() will free our loader vtable, hence reset our + * pointer to it here */ + bindnow_loader = NULL; +#endif +} diff --git a/src/daemon/ltdl-bind-now.h b/src/daemon/ltdl-bind-now.h new file mode 100644 index 0000000..bb6d83f --- /dev/null +++ b/src/daemon/ltdl-bind-now.h @@ -0,0 +1,27 @@ +#ifndef foopulsecoreltdlbindnowhfoo +#define foopulsecoreltdlbindnowhfoo + +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +void pa_ltdl_init(void); +void pa_ltdl_done(void); + +#endif + diff --git a/src/daemon/main.c b/src/daemon/main.c new file mode 100644 index 0000000..30ef499 --- /dev/null +++ b/src/daemon/main.c @@ -0,0 +1,1247 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_SYS_MMAN_H +#include +#endif + +#ifdef HAVE_PWD_H +#include +#endif +#ifdef HAVE_GRP_H +#include +#endif + +#ifdef HAVE_LIBWRAP +#include +#include +#endif + +#ifdef HAVE_DBUS +#include +#endif + +#ifdef HAVE_SYSTEMD_DAEMON +#include +#endif + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_DBUS +#include +#endif +#include + +#include "cmdline.h" +#include "cpulimit.h" +#include "daemon-conf.h" +#include "dumpmodules.h" +#include "caps.h" +#include "ltdl-bind-now.h" +#include "server-lookup.h" + +#ifdef DISABLE_LIBTOOL_PRELOAD +/* FIXME: work around a libtool bug by making sure we have 2 elements. Bug has + * been reported: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=29576 */ +const lt_dlsymlist lt_preloaded_symbols[] = { + { "@PROGRAM@", NULL }, + { NULL, NULL } +}; +#endif + +#ifdef HAVE_LIBWRAP +/* Only one instance of these variables */ +int allow_severity = LOG_INFO; +int deny_severity = LOG_WARNING; +#endif + +#ifdef HAVE_OSS_WRAPPER +/* padsp looks for this symbol in the running process and disables + * itself if it finds it and it is set to 7 (which is actually a bit + * mask). For details see padsp. */ +int __padsp_disabled__ = 7; +#endif + +static void signal_callback(pa_mainloop_api* m, pa_signal_event *e, int sig, void *userdata) { + pa_module *module = NULL; + + pa_log_info("Got signal %s.", pa_sig2str(sig)); + + switch (sig) { +#ifdef SIGUSR1 + case SIGUSR1: + pa_module_load(&module, userdata, "module-cli", NULL); + break; +#endif + +#ifdef SIGUSR2 + case SIGUSR2: + pa_module_load(&module, userdata, "module-cli-protocol-unix", NULL); + break; +#endif + +#ifdef SIGHUP + case SIGHUP: { + char *c = pa_full_status_string(userdata); + pa_log_notice("%s", c); + pa_xfree(c); + return; + } +#endif + + case SIGINT: + case SIGTERM: + default: + pa_log_info("Exiting."); + m->quit(m, 0); + break; + } +} + +#if defined(HAVE_PWD_H) && defined(HAVE_GRP_H) + +static int change_user(void) { + struct passwd *pw; + struct group * gr; + int r; + + /* This function is called only in system-wide mode. It creates a + * runtime dir in /var/run/ with proper UID/GID and drops privs + * afterwards. */ + + if (!(pw = getpwnam(PA_SYSTEM_USER))) { + pa_log(_("Failed to find user '%s'."), PA_SYSTEM_USER); + return -1; + } + + if (!(gr = getgrnam(PA_SYSTEM_GROUP))) { + pa_log(_("Failed to find group '%s'."), PA_SYSTEM_GROUP); + return -1; + } + + pa_log_info("Found user '%s' (UID %lu) and group '%s' (GID %lu).", + PA_SYSTEM_USER, (unsigned long) pw->pw_uid, + PA_SYSTEM_GROUP, (unsigned long) gr->gr_gid); + + if (pw->pw_gid != gr->gr_gid) { + pa_log(_("GID of user '%s' and of group '%s' don't match."), PA_SYSTEM_USER, PA_SYSTEM_GROUP); + return -1; + } + + if (!pa_streq(pw->pw_dir, PA_SYSTEM_RUNTIME_PATH)) + pa_log_warn(_("Home directory of user '%s' is not '%s', ignoring."), PA_SYSTEM_USER, PA_SYSTEM_RUNTIME_PATH); + + if (pa_make_secure_dir(PA_SYSTEM_RUNTIME_PATH, 0755, pw->pw_uid, gr->gr_gid, true) < 0) { + pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_RUNTIME_PATH, pa_cstrerror(errno)); + return -1; + } + + if (pa_make_secure_dir(PA_SYSTEM_STATE_PATH, 0700, pw->pw_uid, gr->gr_gid, true) < 0) { + pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_STATE_PATH, pa_cstrerror(errno)); + return -1; + } + + /* We don't create the config dir here, because we don't need to write to it */ + + if (initgroups(PA_SYSTEM_USER, gr->gr_gid) != 0) { + pa_log(_("Failed to change group list: %s"), pa_cstrerror(errno)); + return -1; + } + +#if defined(HAVE_SETRESGID) + r = setresgid(gr->gr_gid, gr->gr_gid, gr->gr_gid); +#elif defined(HAVE_SETEGID) + if ((r = setgid(gr->gr_gid)) >= 0) + r = setegid(gr->gr_gid); +#elif defined(HAVE_SETREGID) + r = setregid(gr->gr_gid, gr->gr_gid); +#else +#error "No API to drop privileges" +#endif + + if (r < 0) { + pa_log(_("Failed to change GID: %s"), pa_cstrerror(errno)); + return -1; + } + +#if defined(HAVE_SETRESUID) + r = setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid); +#elif defined(HAVE_SETEUID) + if ((r = setuid(pw->pw_uid)) >= 0) + r = seteuid(pw->pw_uid); +#elif defined(HAVE_SETREUID) + r = setreuid(pw->pw_uid, pw->pw_uid); +#else +#error "No API to drop privileges" +#endif + + if (r < 0) { + pa_log(_("Failed to change UID: %s"), pa_cstrerror(errno)); + return -1; + } + + pa_drop_caps(); + + pa_set_env("USER", PA_SYSTEM_USER); + pa_set_env("USERNAME", PA_SYSTEM_USER); + pa_set_env("LOGNAME", PA_SYSTEM_USER); + pa_set_env("HOME", PA_SYSTEM_RUNTIME_PATH); + + /* Relevant for pa_runtime_path() */ + if (!getenv("PULSE_RUNTIME_PATH")) + pa_set_env("PULSE_RUNTIME_PATH", PA_SYSTEM_RUNTIME_PATH); + + if (!getenv("PULSE_CONFIG_PATH")) + pa_set_env("PULSE_CONFIG_PATH", PA_SYSTEM_CONFIG_PATH); + + if (!getenv("PULSE_STATE_PATH")) + pa_set_env("PULSE_STATE_PATH", PA_SYSTEM_STATE_PATH); + + pa_log_info("Successfully changed user to \"" PA_SYSTEM_USER "\"."); + + return 0; +} + +#else /* HAVE_PWD_H && HAVE_GRP_H */ + +static int change_user(void) { + pa_log(_("System wide mode unsupported on this platform.")); + return -1; +} + +#endif /* HAVE_PWD_H && HAVE_GRP_H */ + +#ifdef HAVE_SYS_RESOURCE_H + +static int set_one_rlimit(const pa_rlimit *r, int resource, const char *name) { + struct rlimit rl; + pa_assert(r); + + if (!r->is_set) + return 0; + + rl.rlim_cur = rl.rlim_max = r->value; + + if (setrlimit(resource, &rl) < 0) { + pa_log_info("setrlimit(%s, (%u, %u)) failed: %s", name, (unsigned) r->value, (unsigned) r->value, pa_cstrerror(errno)); + return -1; + } + + return 0; +} + +static void set_all_rlimits(const pa_daemon_conf *conf) { + set_one_rlimit(&conf->rlimit_fsize, RLIMIT_FSIZE, "RLIMIT_FSIZE"); + set_one_rlimit(&conf->rlimit_data, RLIMIT_DATA, "RLIMIT_DATA"); + set_one_rlimit(&conf->rlimit_stack, RLIMIT_STACK, "RLIMIT_STACK"); + set_one_rlimit(&conf->rlimit_core, RLIMIT_CORE, "RLIMIT_CORE"); +#ifdef RLIMIT_RSS + set_one_rlimit(&conf->rlimit_rss, RLIMIT_RSS, "RLIMIT_RSS"); +#endif +#ifdef RLIMIT_NPROC + set_one_rlimit(&conf->rlimit_nproc, RLIMIT_NPROC, "RLIMIT_NPROC"); +#endif +#ifdef RLIMIT_NOFILE + set_one_rlimit(&conf->rlimit_nofile, RLIMIT_NOFILE, "RLIMIT_NOFILE"); +#endif +#ifdef RLIMIT_MEMLOCK + set_one_rlimit(&conf->rlimit_memlock, RLIMIT_MEMLOCK, "RLIMIT_MEMLOCK"); +#endif +#ifdef RLIMIT_AS + set_one_rlimit(&conf->rlimit_as, RLIMIT_AS, "RLIMIT_AS"); +#endif +#ifdef RLIMIT_LOCKS + set_one_rlimit(&conf->rlimit_locks, RLIMIT_LOCKS, "RLIMIT_LOCKS"); +#endif +#ifdef RLIMIT_SIGPENDING + set_one_rlimit(&conf->rlimit_sigpending, RLIMIT_SIGPENDING, "RLIMIT_SIGPENDING"); +#endif +#ifdef RLIMIT_MSGQUEUE + set_one_rlimit(&conf->rlimit_msgqueue, RLIMIT_MSGQUEUE, "RLIMIT_MSGQUEUE"); +#endif +#ifdef RLIMIT_NICE + set_one_rlimit(&conf->rlimit_nice, RLIMIT_NICE, "RLIMIT_NICE"); +#endif +#ifdef RLIMIT_RTPRIO + set_one_rlimit(&conf->rlimit_rtprio, RLIMIT_RTPRIO, "RLIMIT_RTPRIO"); +#endif +#ifdef RLIMIT_RTTIME + set_one_rlimit(&conf->rlimit_rttime, RLIMIT_RTTIME, "RLIMIT_RTTIME"); +#endif +} +#endif + +static char *check_configured_address(void) { + char *default_server = NULL; + pa_client_conf *c = pa_client_conf_new(); + + pa_client_conf_load(c, true, true); + + if (c->default_server && *c->default_server) + default_server = pa_xstrdup(c->default_server); + + pa_client_conf_free(c); + + return default_server; +} + +#ifdef HAVE_DBUS +static pa_dbus_connection *register_dbus_name(pa_core *c, DBusBusType bus, const char* name) { + DBusError error; + pa_dbus_connection *conn; + + dbus_error_init(&error); + + if (!(conn = pa_dbus_bus_get(c, bus, &error)) || dbus_error_is_set(&error)) { + pa_log_warn("Unable to contact D-Bus: %s: %s", error.name, error.message); + goto fail; + } + + if (dbus_bus_request_name(pa_dbus_connection_get(conn), name, DBUS_NAME_FLAG_DO_NOT_QUEUE, &error) == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { + pa_log_debug("Got %s!", name); + return conn; + } + + if (dbus_error_is_set(&error)) + pa_log_error("Failed to acquire %s: %s: %s", name, error.name, error.message); + else + pa_log_error("D-Bus name %s already taken.", name); + + /* PA cannot be started twice by the same user and hence we can + * ignore mostly the case that a name is already taken. */ + +fail: + if (conn) + pa_dbus_connection_unref(conn); + + dbus_error_free(&error); + return NULL; +} +#endif + +int main(int argc, char *argv[]) { + pa_core *c = NULL; + pa_strbuf *buf = NULL; + pa_daemon_conf *conf = NULL; + pa_mainloop *mainloop = NULL; + char *s; + char *configured_address; + int r = 0, retval = 1, d = 0; + bool valid_pid_file = false; + bool ltdl_init = false; + int n_fds = 0, *passed_fds = NULL; + const char *e; +#ifdef HAVE_FORK + int daemon_pipe[2] = { -1, -1 }; + int daemon_pipe2[2] = { -1, -1 }; +#endif + int autospawn_fd = -1; + bool autospawn_locked = false; +#ifdef HAVE_DBUS + pa_dbusobj_server_lookup *server_lookup = NULL; /* /org/pulseaudio/server_lookup */ + pa_dbus_connection *lookup_service_bus = NULL; /* Always the user bus. */ + pa_dbus_connection *server_bus = NULL; /* The bus where we reserve org.pulseaudio.Server, either the user or the system bus. */ + bool start_server; +#endif + + pa_log_set_ident("pulseaudio"); + pa_log_set_level(PA_LOG_NOTICE); + pa_log_set_flags(PA_LOG_COLORS|PA_LOG_PRINT_FILE|PA_LOG_PRINT_LEVEL, PA_LOG_RESET); + +#if !defined(HAVE_BIND_NOW) && defined(__linux__) && defined(__OPTIMIZE__) + /* + Disable lazy relocations to make usage of external libraries + more deterministic for our RT threads. We abuse __OPTIMIZE__ as + a check whether we are a debug build or not. This all is + admittedly a bit snake-oilish. + */ + + if (!getenv("LD_BIND_NOW")) { + char *rp; + char *canonical_rp; + + /* We have to execute ourselves, because the libc caches the + * value of $LD_BIND_NOW on initialization. */ + + pa_set_env("LD_BIND_NOW", "1"); + + if ((canonical_rp = pa_realpath(PA_BINARY))) { + + if ((rp = pa_readlink("/proc/self/exe"))) { + + if (pa_streq(rp, canonical_rp)) + pa_assert_se(execv(rp, argv) == 0); + else + pa_log_warn("/proc/self/exe does not point to %s, cannot self execute. Are you playing games?", canonical_rp); + + pa_xfree(rp); + + } else + pa_log_warn("Couldn't read /proc/self/exe, cannot self execute. Running in a chroot()?"); + + pa_xfree(canonical_rp); + + } else + pa_log_warn("Couldn't canonicalize binary path, cannot self execute."); + } +#endif + +#ifdef HAVE_SYSTEMD_DAEMON + n_fds = sd_listen_fds(0); + if (n_fds > 0) { + int i = n_fds; + + passed_fds = pa_xnew(int, n_fds+2); + passed_fds[n_fds] = passed_fds[n_fds+1] = -1; + while (i--) + passed_fds[i] = SD_LISTEN_FDS_START + i; + } +#endif + + if (!passed_fds) { + n_fds = 0; + passed_fds = pa_xnew(int, 2); + passed_fds[0] = passed_fds[1] = -1; + } + + if ((e = getenv("PULSE_PASSED_FD"))) { + int passed_fd = atoi(e); + if (passed_fd > 2) + passed_fds[n_fds] = passed_fd; + } + + /* We might be autospawned, in which case have no idea in which + * context we have been started. Let's cleanup our execution + * context as good as possible */ + + pa_reset_personality(); + pa_drop_root(); + pa_close_allv(passed_fds); + pa_xfree(passed_fds); + pa_reset_sigs(-1); + pa_unblock_sigs(-1); + pa_reset_priority(); + + setlocale(LC_ALL, ""); + pa_init_i18n(); + + conf = pa_daemon_conf_new(); + + if (pa_daemon_conf_load(conf, NULL) < 0) + goto finish; + + if (pa_daemon_conf_env(conf) < 0) + goto finish; + + if (pa_cmdline_parse(conf, argc, argv, &d) < 0) { + pa_log(_("Failed to parse command line.")); + goto finish; + } + + if (conf->log_target) + pa_log_set_target(conf->log_target); + else { + pa_log_target target = { .type = PA_LOG_STDERR, .file = NULL }; + pa_log_set_target(&target); + } + + pa_log_set_level(conf->log_level); + if (conf->log_meta) + pa_log_set_flags(PA_LOG_PRINT_META, PA_LOG_SET); + if (conf->log_time) + pa_log_set_flags(PA_LOG_PRINT_TIME, PA_LOG_SET); + pa_log_set_show_backtrace(conf->log_backtrace); + +#ifdef HAVE_DBUS + /* conf->system_instance and conf->local_server_type control almost the + * same thing; make them agree about what is requested. */ + switch (conf->local_server_type) { + case PA_SERVER_TYPE_UNSET: + conf->local_server_type = conf->system_instance ? PA_SERVER_TYPE_SYSTEM : PA_SERVER_TYPE_USER; + break; + case PA_SERVER_TYPE_USER: + case PA_SERVER_TYPE_NONE: + conf->system_instance = false; + break; + case PA_SERVER_TYPE_SYSTEM: + conf->system_instance = true; + break; + default: + pa_assert_not_reached(); + } + + start_server = conf->local_server_type == PA_SERVER_TYPE_USER || (getuid() == 0 && conf->local_server_type == PA_SERVER_TYPE_SYSTEM); + + if (!start_server && conf->local_server_type == PA_SERVER_TYPE_SYSTEM) { + pa_log_notice(_("System mode refused for non-root user. Only starting the D-Bus server lookup service.")); + conf->system_instance = false; + } +#endif + + LTDL_SET_PRELOADED_SYMBOLS(); + pa_ltdl_init(); + ltdl_init = true; + + if (conf->dl_search_path) + lt_dlsetsearchpath(conf->dl_search_path); + +#ifdef OS_IS_WIN32 + { + WSADATA data; + WSAStartup(MAKEWORD(2, 0), &data); + } +#endif + + pa_random_seed(); + + switch (conf->cmd) { + case PA_CMD_DUMP_MODULES: + pa_dump_modules(conf, argc-d, argv+d); + retval = 0; + goto finish; + + case PA_CMD_DUMP_CONF: { + + if (d < argc) { + pa_log("Too many arguments."); + goto finish; + } + + s = pa_daemon_conf_dump(conf); + fputs(s, stdout); + pa_xfree(s); + retval = 0; + goto finish; + } + + case PA_CMD_DUMP_RESAMPLE_METHODS: { + int i; + + if (d < argc) { + pa_log("Too many arguments."); + goto finish; + } + + for (i = 0; i < PA_RESAMPLER_MAX; i++) + if (pa_resample_method_supported(i)) + printf("%s\n", pa_resample_method_to_string(i)); + + retval = 0; + goto finish; + } + + case PA_CMD_HELP : + pa_cmdline_help(argv[0]); + retval = 0; + goto finish; + + case PA_CMD_VERSION : + + if (d < argc) { + pa_log("Too many arguments."); + goto finish; + } + + printf(PACKAGE_NAME" "PACKAGE_VERSION"\n"); + retval = 0; + goto finish; + + case PA_CMD_CHECK: { + pid_t pid; + + if (d < argc) { + pa_log("Too many arguments."); + goto finish; + } + + if (pa_pid_file_check_running(&pid, "pulseaudio") < 0) + pa_log_info("Daemon not running"); + else { + pa_log_info("Daemon running as PID %u", pid); + retval = 0; + } + + goto finish; + + } + case PA_CMD_KILL: + + if (d < argc) { + pa_log("Too many arguments."); + goto finish; + } + + if (pa_pid_file_kill(SIGINT, NULL, "pulseaudio") < 0) + pa_log(_("Failed to kill daemon: %s"), pa_cstrerror(errno)); + else + retval = 0; + + goto finish; + + case PA_CMD_CLEANUP_SHM: + + if (d < argc) { + pa_log("Too many arguments."); + goto finish; + } + + if (pa_shm_cleanup() >= 0) + retval = 0; + + goto finish; + + default: + pa_assert(conf->cmd == PA_CMD_DAEMON || conf->cmd == PA_CMD_START); + } + + if (d < argc) { + pa_log("Too many arguments."); + goto finish; + } + +#ifdef HAVE_GETUID + if (getuid() == 0 && !conf->system_instance) + pa_log_warn(_("This program is not intended to be run as root (unless --system is specified).")); +#ifndef HAVE_DBUS /* A similar, only a notice worthy check was done earlier, if D-Bus is enabled. */ + else if (getuid() != 0 && conf->system_instance) { + pa_log(_("Root privileges required.")); + goto finish; + } +#endif +#endif /* HAVE_GETUID */ + + if (conf->cmd == PA_CMD_START && conf->system_instance) { + pa_log(_("--start not supported for system instances.")); + goto finish; + } + + if (conf->cmd == PA_CMD_START && (configured_address = check_configured_address())) { + /* There is an server address in our config, but where did it come from? + * By default a standard X11 login will load module-x11-publish which will + * inject PULSE_SERVER X11 property. If the PA daemon crashes, we will end + * up hitting this code path. So we have to check to see if our configured_address + * is the same as the value that would go into this property so that we can + * recover (i.e. autospawn) from a crash. + */ + char *ufn; + bool start_anyway = false; + + if ((ufn = pa_runtime_path(PA_NATIVE_DEFAULT_UNIX_SOCKET))) { + char *id; + + if ((id = pa_machine_id())) { + pa_strlist *server_list; + char formatted_ufn[256]; + + pa_snprintf(formatted_ufn, sizeof(formatted_ufn), "{%s}unix:%s", id, ufn); + pa_xfree(id); + + if ((server_list = pa_strlist_parse(configured_address))) { + char *u = NULL; + + /* We only need to check the first server */ + server_list = pa_strlist_pop(server_list, &u); + pa_strlist_free(server_list); + + start_anyway = (u && pa_streq(formatted_ufn, u)); + pa_xfree(u); + } + } + pa_xfree(ufn); + } + + if (!start_anyway) { + pa_log_notice(_("User-configured server at %s, refusing to start/autospawn."), configured_address); + pa_xfree(configured_address); + retval = 0; + goto finish; + } + + pa_log_notice(_("User-configured server at %s, which appears to be local. Probing deeper."), configured_address); + pa_xfree(configured_address); + } + + if (conf->system_instance && !conf->disallow_exit) + pa_log_warn(_("Running in system mode, but --disallow-exit not set.")); + + if (conf->system_instance && !conf->disallow_module_loading) + pa_log_warn(_("Running in system mode, but --disallow-module-loading not set.")); + + if (conf->system_instance && !conf->disable_shm) { + pa_log_notice(_("Running in system mode, forcibly disabling SHM mode.")); + conf->disable_shm = true; + } + + if (conf->system_instance && conf->exit_idle_time >= 0) { + pa_log_notice(_("Running in system mode, forcibly disabling exit idle time.")); + conf->exit_idle_time = -1; + } + + if (conf->cmd == PA_CMD_START) { + /* If we shall start PA only when it is not running yet, we + * first take the autospawn lock to make things + * synchronous. */ + + /* This locking and thread synchronisation code doesn't work reliably + * on kFreeBSD (Debian bug #705435), or in upstream FreeBSD ports + * (bug reference: ports/128947, patched in SVN r231972). */ +#if !defined(__FreeBSD__) && !defined(__FreeBSD_kernel__) + if ((autospawn_fd = pa_autospawn_lock_init()) < 0) { + pa_log("Failed to initialize autospawn lock"); + goto finish; + } + + if ((pa_autospawn_lock_acquire(true) < 0)) { + pa_log("Failed to acquire autospawn lock"); + goto finish; + } + + autospawn_locked = true; +#endif + } + + if (conf->daemonize) { +#ifdef HAVE_FORK + pid_t child; +#endif + + if (pa_stdio_acquire() < 0) { + pa_log(_("Failed to acquire stdio.")); + goto finish; + } + +#ifdef HAVE_FORK + if (pipe(daemon_pipe) < 0) { + pa_log(_("pipe() failed: %s"), pa_cstrerror(errno)); + goto finish; + } + + if ((child = fork()) < 0) { + pa_log(_("fork() failed: %s"), pa_cstrerror(errno)); + pa_close_pipe(daemon_pipe); + goto finish; + } + + if (child != 0) { + ssize_t n; + /* Father */ + + pa_assert_se(pa_close(daemon_pipe[1]) == 0); + daemon_pipe[1] = -1; + + if ((n = pa_loop_read(daemon_pipe[0], &retval, sizeof(retval), NULL)) != sizeof(retval)) { + + if (n < 0) + pa_log(_("read() failed: %s"), pa_cstrerror(errno)); + + retval = 1; + } + + if (retval) + pa_log(_("Daemon startup failed.")); + else + pa_log_info("Daemon startup successful."); + + goto finish; + } + + if (autospawn_fd >= 0) { + /* The lock file is unlocked from the parent, so we need + * to close it in the child */ + + pa_autospawn_lock_release(); + pa_autospawn_lock_done(true); + + autospawn_locked = false; + autospawn_fd = -1; + } + + pa_assert_se(pa_close(daemon_pipe[0]) == 0); + daemon_pipe[0] = -1; +#endif + + if (!conf->log_target) { +#ifdef HAVE_SYSTEMD_JOURNAL + pa_log_target target = { .type = PA_LOG_JOURNAL, .file = NULL }; +#else + pa_log_target target = { .type = PA_LOG_SYSLOG, .file = NULL }; +#endif + pa_log_set_target(&target); + } + +#ifdef HAVE_SETSID + if (setsid() < 0) { + pa_log(_("setsid() failed: %s"), pa_cstrerror(errno)); + goto finish; + } +#endif + +#ifdef HAVE_FORK + /* We now are a session and process group leader. Let's fork + * again and let the father die, so that we'll become a + * process that can never acquire a TTY again, in a session and + * process group without leader */ + + if (pipe(daemon_pipe2) < 0) { + pa_log(_("pipe() failed: %s"), pa_cstrerror(errno)); + goto finish; + } + + if ((child = fork()) < 0) { + pa_log(_("fork() failed: %s"), pa_cstrerror(errno)); + pa_close_pipe(daemon_pipe2); + goto finish; + } + + if (child != 0) { + ssize_t n; + /* Father */ + + pa_assert_se(pa_close(daemon_pipe2[1]) == 0); + daemon_pipe2[1] = -1; + + if ((n = pa_loop_read(daemon_pipe2[0], &retval, sizeof(retval), NULL)) != sizeof(retval)) { + + if (n < 0) + pa_log(_("read() failed: %s"), pa_cstrerror(errno)); + + retval = 1; + } + + /* We now have to take care of signalling the first fork with + * the return value we've received from this fork... */ + pa_assert(daemon_pipe[1] >= 0); + + pa_loop_write(daemon_pipe[1], &retval, sizeof(retval), NULL); + pa_close(daemon_pipe[1]); + daemon_pipe[1] = -1; + + goto finish; + } + + pa_assert_se(pa_close(daemon_pipe2[0]) == 0); + daemon_pipe2[0] = -1; + + /* We no longer need the (first) daemon_pipe as it's handled in our child above */ + pa_close_pipe(daemon_pipe); +#endif + +#ifdef SIGTTOU + signal(SIGTTOU, SIG_IGN); +#endif +#ifdef SIGTTIN + signal(SIGTTIN, SIG_IGN); +#endif +#ifdef SIGTSTP + signal(SIGTSTP, SIG_IGN); +#endif + + pa_nullify_stdfds(); + } + + pa_set_env_and_record("PULSE_INTERNAL", "1"); + pa_assert_se(chdir("/") == 0); + umask(0077); + +#ifdef HAVE_SYS_RESOURCE_H + set_all_rlimits(conf); +#endif + pa_rtclock_hrtimer_enable(); + + if (conf->high_priority) + pa_raise_priority(conf->nice_level); + + if (conf->system_instance) + if (change_user() < 0) + goto finish; + + pa_set_env_and_record("PULSE_SYSTEM", conf->system_instance ? "1" : "0"); + + pa_log_info("This is PulseAudio %s", PACKAGE_VERSION); + pa_log_debug("Compilation CFLAGS: %s", PA_CFLAGS); + +#ifdef HAVE_LIBSAMPLERATE + pa_log_warn("Compiled with DEPRECATED libsamplerate support!"); +#endif + + s = pa_uname_string(); + pa_log_debug("Running on host: %s", s); + pa_xfree(s); + + pa_log_debug("Found %u CPUs.", pa_ncpus()); + + pa_log_info("Page size is %zu bytes", pa_page_size()); + +#ifdef HAVE_VALGRIND_MEMCHECK_H + pa_log_debug("Compiled with Valgrind support: yes"); +#else + pa_log_debug("Compiled with Valgrind support: no"); +#endif + + pa_log_debug("Running in valgrind mode: %s", pa_yes_no(pa_in_valgrind())); + + pa_log_debug("Running in VM: %s", pa_yes_no(pa_running_in_vm())); + +#ifdef HAVE_RUNNING_FROM_BUILD_TREE + pa_log_debug("Running from build tree: %s", pa_yes_no(pa_run_from_build_tree())); +#else + pa_log_debug("Running from build tree: no"); +#endif + +#ifdef __OPTIMIZE__ + pa_log_debug("Optimized build: yes"); +#else + pa_log_debug("Optimized build: no"); +#endif + +#ifdef NDEBUG + pa_log_debug("NDEBUG defined, all asserts disabled."); +#elif defined(FASTPATH) + pa_log_debug("FASTPATH defined, only fast path asserts disabled."); +#else + pa_log_debug("All asserts enabled."); +#endif + + if (!(s = pa_machine_id())) { + pa_log(_("Failed to get machine ID")); + goto finish; + } + pa_log_info("Machine ID is %s.", s); + pa_xfree(s); + + if ((s = pa_session_id())) { + pa_log_info("Session ID is %s.", s); + pa_xfree(s); + } + + if (!(s = pa_get_runtime_dir())) + goto finish; + pa_log_info("Using runtime directory %s.", s); + pa_xfree(s); + + if (!(s = pa_get_state_dir())) + goto finish; + pa_log_info("Using state directory %s.", s); + pa_xfree(s); + + pa_log_info("Using modules directory %s.", conf->dl_search_path); + + pa_log_info("Running in system mode: %s", pa_yes_no(pa_in_system_mode())); + + if (pa_in_system_mode()) + pa_log_warn(_("OK, so you are running PA in system mode. Please make sure that you actually do want to do that.\n" + "Please read http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/WhatIsWrongWithSystemWide/ for an explanation why system mode is usually a bad idea.")); + + if (conf->use_pid_file) { + int z; + + if ((z = pa_pid_file_create("pulseaudio")) != 0) { + + if (conf->cmd == PA_CMD_START && z > 0) { + /* If we are already running and with are run in + * --start mode, then let's return this as success. */ + + retval = 0; + goto finish; + } + + pa_log(_("pa_pid_file_create() failed.")); + goto finish; + } + + valid_pid_file = true; + } + + pa_disable_sigpipe(); + + if (pa_rtclock_hrtimer()) + pa_log_info("System supports high resolution timers"); + else + pa_log_info("System appears to not support high resolution timers"); + + if (conf->lock_memory) { +#if defined(HAVE_SYS_MMAN_H) && !defined(__ANDROID__) + if (mlockall(MCL_FUTURE) < 0) + pa_log_warn("mlockall() failed: %s", pa_cstrerror(errno)); + else + pa_log_info("Successfully locked process into memory."); +#else + pa_log_warn("Memory locking requested but not supported on platform."); +#endif + } + + pa_memtrap_install(); + + pa_assert_se(mainloop = pa_mainloop_new()); + + if (!(c = pa_core_new(pa_mainloop_get_api(mainloop), !conf->disable_shm, + !conf->disable_shm && !conf->disable_memfd && pa_memfd_is_locally_supported(), + conf->shm_size))) { + pa_log(_("pa_core_new() failed.")); + goto finish; + } + + c->default_sample_spec = conf->default_sample_spec; + c->alternate_sample_rate = conf->alternate_sample_rate; + c->default_channel_map = conf->default_channel_map; + c->default_n_fragments = conf->default_n_fragments; + c->default_fragment_size_msec = conf->default_fragment_size_msec; + c->deferred_volume_safety_margin_usec = conf->deferred_volume_safety_margin_usec; + c->deferred_volume_extra_delay_usec = conf->deferred_volume_extra_delay_usec; + c->lfe_crossover_freq = conf->lfe_crossover_freq; + c->exit_idle_time = conf->exit_idle_time; + c->scache_idle_time = conf->scache_idle_time; + c->resample_method = conf->resample_method; + c->realtime_priority = conf->realtime_priority; + c->realtime_scheduling = conf->realtime_scheduling; + c->avoid_resampling = conf->avoid_resampling; + c->disable_remixing = conf->disable_remixing; + c->remixing_use_all_sink_channels = conf->remixing_use_all_sink_channels; + c->remixing_produce_lfe = conf->remixing_produce_lfe; + c->remixing_consume_lfe = conf->remixing_consume_lfe; + c->deferred_volume = conf->deferred_volume; + c->running_as_daemon = conf->daemonize; + c->disallow_exit = conf->disallow_exit; + c->flat_volumes = conf->flat_volumes; + c->rescue_streams = conf->rescue_streams; +#ifdef HAVE_DBUS + c->server_type = conf->local_server_type; +#endif + + pa_core_check_idle(c); + + c->state = PA_CORE_RUNNING; + + pa_cpu_init(&c->cpu_info); + + pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop)) == 0); + pa_signal_new(SIGINT, signal_callback, c); + pa_signal_new(SIGTERM, signal_callback, c); +#ifdef SIGUSR1 + pa_signal_new(SIGUSR1, signal_callback, c); +#endif +#ifdef SIGUSR2 + pa_signal_new(SIGUSR2, signal_callback, c); +#endif +#ifdef SIGHUP + pa_signal_new(SIGHUP, signal_callback, c); +#endif + + if (!conf->no_cpu_limit) + pa_assert_se(pa_cpu_limit_init(pa_mainloop_get_api(mainloop)) == 0); + + buf = pa_strbuf_new(); + +#ifdef HAVE_DBUS + pa_assert_se(dbus_threads_init_default()); + + if (start_server) +#endif + { + const char *command_source = NULL; + + if (conf->load_default_script_file) { + FILE *f; + + if ((f = pa_daemon_conf_open_default_script_file(conf))) { + r = pa_cli_command_execute_file_stream(c, f, buf, &conf->fail); + fclose(f); + command_source = pa_daemon_conf_get_default_script_file(conf); + } + } + + if (r >= 0) { + r = pa_cli_command_execute(c, conf->script_commands, buf, &conf->fail); + command_source = _("command line arguments"); + } + + pa_log_error("%s", s = pa_strbuf_to_string_free(buf)); + pa_xfree(s); + + if (r < 0 && conf->fail) { + pa_log(_("Failed to initialize daemon due to errors while executing startup commands. Source of commands: %s"), command_source); + goto finish; + } + + if (!c->modules || pa_idxset_size(c->modules) == 0) { + pa_log(_("Daemon startup without any loaded modules, refusing to work.")); + goto finish; + } +#ifdef HAVE_DBUS + } else { + /* When we just provide the D-Bus server lookup service, we don't want + * any modules to be loaded. We haven't loaded any so far, so one might + * think there's no way to contact the server, but receiving certain + * signals could still cause modules to load. */ + conf->disallow_module_loading = true; +#endif + } + + /* We completed the initial module loading, so let's disable it + * from now on, if requested */ + c->disallow_module_loading = conf->disallow_module_loading; + +#ifdef HAVE_DBUS + if (!conf->system_instance) { + if ((server_lookup = pa_dbusobj_server_lookup_new(c))) { + if (!(lookup_service_bus = register_dbus_name(c, DBUS_BUS_SESSION, "org.PulseAudio1"))) + goto finish; + } + } + + if (start_server) + server_bus = register_dbus_name(c, conf->system_instance ? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION, "org.pulseaudio.Server"); +#endif + +#ifdef HAVE_FORK + if (daemon_pipe2[1] >= 0) { + int ok = 0; + pa_loop_write(daemon_pipe2[1], &ok, sizeof(ok), NULL); + pa_close(daemon_pipe2[1]); + daemon_pipe2[1] = -1; + } +#endif + + pa_log_info("Daemon startup complete."); + +#ifdef HAVE_SYSTEMD_DAEMON + sd_notify(0, "READY=1"); +#endif + + retval = 0; + if (pa_mainloop_run(mainloop, &retval) < 0) + goto finish; + + pa_log_info("Daemon shutdown initiated."); + +#ifdef HAVE_SYSTEMD_DAEMON + sd_notify(0, "STOPPING=1"); +#endif + +finish: +#ifdef HAVE_DBUS + if (server_bus) + pa_dbus_connection_unref(server_bus); + if (lookup_service_bus) + pa_dbus_connection_unref(lookup_service_bus); + if (server_lookup) + pa_dbusobj_server_lookup_free(server_lookup); +#endif + + if (autospawn_fd >= 0) { + if (autospawn_locked) + pa_autospawn_lock_release(); + + pa_autospawn_lock_done(false); + } + + if (c) { + /* Ensure all the modules/samples are unloaded when the core is still ref'ed, + * as unlink callback hooks in modules may need the core to be ref'ed */ + pa_module_unload_all(c); + pa_scache_free_all(c); + + pa_core_unref(c); + pa_log_info("Daemon terminated."); + } + + if (!conf->no_cpu_limit) + pa_cpu_limit_done(); + + pa_signal_done(); + +#ifdef HAVE_FORK + /* If we have daemon_pipe[1] still open, this means we've failed after + * the first fork, but before the second. Therefore just write to it. */ + if (daemon_pipe[1] >= 0) + pa_loop_write(daemon_pipe[1], &retval, sizeof(retval), NULL); + else if (daemon_pipe2[1] >= 0) + pa_loop_write(daemon_pipe2[1], &retval, sizeof(retval), NULL); + + pa_close_pipe(daemon_pipe2); + pa_close_pipe(daemon_pipe); +#endif + + if (mainloop) + pa_mainloop_free(mainloop); + + if (conf) + pa_daemon_conf_free(conf); + + if (valid_pid_file) + pa_pid_file_remove(); + + /* This has no real purpose except making things valgrind-clean */ + pa_unset_env_recorded(); + +#ifdef OS_IS_WIN32 + WSACleanup(); +#endif + + if (ltdl_init) + pa_ltdl_done(); + +#ifdef HAVE_DBUS + dbus_shutdown(); +#endif + + return retval; +} diff --git a/src/daemon/meson.build b/src/daemon/meson.build new file mode 100644 index 0000000..9c9f807 --- /dev/null +++ b/src/daemon/meson.build @@ -0,0 +1,159 @@ +pulseaudio_sources = [ + 'caps.c', + 'cmdline.c', + 'cpulimit.c', + 'daemon-conf.c', + 'dumpmodules.c', + 'ltdl-bind-now.c', + 'main.c', +] + +pulseaudio_headers = [ + 'caps.h', + 'cmdline.h', + 'cpulimit.h', + 'daemon-conf.h', + 'dumpmodules.h', + 'ltdl-bind-now.h', +] + +if dbus_dep.found() + pulseaudio_sources += 'server-lookup.c' + pulseaudio_headers += 'server-lookup.h' +endif + +# FIXME: dependencies +executable('pulseaudio', + pulseaudio_sources, + pulseaudio_headers, + install: true, + install_rpath : privlibdir, + include_directories : [configinc, topinc], + link_args : ['-ffast-math'], + link_with : [libpulsecore, libpulsecommon, libpulse], + dependencies : [ltdl_dep, cap_dep, dbus_dep, libsystemd_dep, dl_dep, libintl_dep], + c_args : pa_c_args, +) + +if x11_dep.found() + conf = configuration_data() + conf.set('PACTL_BINARY', join_paths(bindir, 'pactl')) + + configure_file( + input : 'start-pulseaudio-x11.in', + output : 'start-pulseaudio-x11', + configuration : conf, + install : true, + install_dir : bindir, + ) + + desktop_file = i18n.merge_file( + input : 'pulseaudio.desktop.in', + output : 'pulseaudio.desktop', + po_dir : po_dir, + type : 'desktop', + install : true, + install_dir : join_paths(sysconfdir, 'xdg', 'autostart'), + ) + + desktop_utils = find_program('desktop-file-validate', required: false) + if desktop_utils.found() + test('Validate desktop file', desktop_utils, + args: [ desktop_file ], + ) + endif +endif + +# Configuration files + +m4 = find_program('m4', required: true) + +daemon_conf = configuration_data() +daemon_conf.merge_from(cdata) +daemon_conf.set('PA_DEFAULT_CONFIG_DIR', cdata.get_unquoted('PA_DEFAULT_CONFIG_DIR')) + +daemon_template_file = configure_file( + input : 'daemon.conf.in', + output : 'daemon.conf.tmp', + configuration : daemon_conf, +) + +custom_target('daemon.conf', + input : daemon_template_file, + output : 'daemon.conf', + capture : true, + command : [m4, '@INPUT@'], + build_by_default : true, + install : true, + install_dir : pulsesysconfdir, +) + +default_conf = configuration_data() +default_conf.merge_from(cdata) +default_conf.set('PA_BINARY', cdata.get_unquoted('PA_BINARY')) +default_conf.set('PA_SOEXT', cdata.get_unquoted('PA_SOEXT')) +default_conf.set10('HAVE_AF_UNIX', cc.has_header('sys/un.h')) +default_conf.set10('OS_IS_WIN32', host_machine.system() == 'windows') +default_conf.set10('HAVE_MKFIFO', cc.has_function('mkfifo')) +# We don't support the deprecated GConf option in meson +default_conf.set10('HAVE_GCONF', 0) + +default_template_file = configure_file( + input : 'default.pa.in', + output : 'default.pa.tmp', + configuration : default_conf, +) + +custom_target('default.pa', + input : default_template_file, + output : 'default.pa', + capture : true, + command : [m4, '@INPUT@'], + build_by_default : true, + install : true, + install_dir : pulsesysconfdir, +) + +system_conf = configuration_data() +system_conf.merge_from(cdata) +system_conf.set('PA_BINARY', cdata.get_unquoted('PA_BINARY')) +system_conf.set('PA_SOEXT', cdata.get_unquoted('PA_SOEXT')) + +system_template_file = configure_file( + input : 'system.pa.in', + output : 'system.pa.tmp', + configuration : system_conf, +) + +custom_target('system.pa', + input : system_template_file, + output : 'system.pa', + capture : true, + command : [m4, '@INPUT@'], + build_by_default : true, + install : true, + install_dir : pulsesysconfdir, +) + +if dbus_dep.found() + install_data('pulseaudio-system.conf', + install_dir : join_paths(sysconfdir, 'dbus-1', 'system.d') + ) +endif + +if systemd_dep.found() + sd_user_service_conf = configuration_data() + sd_user_service_conf.set('PA_BINARY', cdata.get_unquoted('PA_BINARY')) + + sd_user_service_file = configure_file( + input : 'systemd/user/pulseaudio.service.in', + output : 'pulseaudio.service', + configuration : sd_user_service_conf, + install : true, + install_dir : systemduserunitdir, + ) + + install_data('systemd/user/pulseaudio.socket', + install_dir: systemduserunitdir, + ) +endif diff --git a/src/daemon/pulseaudio-system.conf b/src/daemon/pulseaudio-system.conf new file mode 100644 index 0000000..2eb342e --- /dev/null +++ b/src/daemon/pulseaudio-system.conf @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + diff --git a/src/daemon/pulseaudio.desktop.in b/src/daemon/pulseaudio.desktop.in new file mode 100644 index 0000000..2e85202 --- /dev/null +++ b/src/daemon/pulseaudio.desktop.in @@ -0,0 +1,9 @@ +[Desktop Entry] +Version=1.0 +Name=PulseAudio Sound System +Comment=Start the PulseAudio Sound System +Exec=start-pulseaudio-x11 +Terminal=false +Type=Application +X-GNOME-Autostart-Phase=Initialization +X-KDE-autostart-phase=1 diff --git a/src/daemon/server-lookup.c b/src/daemon/server-lookup.c new file mode 100644 index 0000000..ca390c7 --- /dev/null +++ b/src/daemon/server-lookup.c @@ -0,0 +1,492 @@ +/*** + This file is part of PulseAudio. + + Copyright 2009 Tanu Kaskinen + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include "server-lookup.h" + +#define OBJECT_PATH "/org/pulseaudio/server_lookup1" +#define INTERFACE "org.PulseAudio.ServerLookup1" + +struct pa_dbusobj_server_lookup { + pa_core *core; + pa_dbus_connection *conn; + bool path_registered; +}; + +static const char introspection[] = + DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE + "" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + "\n"; + +static void unregister_cb(DBusConnection *conn, void *user_data) { + pa_dbusobj_server_lookup *sl = user_data; + + pa_assert(sl); + pa_assert(sl->path_registered); + + sl->path_registered = false; +} + +static DBusHandlerResult handle_introspect(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_server_lookup *sl) { + DBusHandlerResult r = DBUS_HANDLER_RESULT_HANDLED; + const char *i = introspection; + DBusMessage *reply = NULL; + + pa_assert(conn); + pa_assert(msg); + + if (!(reply = dbus_message_new_method_return(msg))) { + r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + goto finish; + } + if (!dbus_message_append_args(reply, DBUS_TYPE_STRING, &i, DBUS_TYPE_INVALID)) { + r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + goto finish; + } + if (!dbus_connection_send(conn, reply, NULL)) { + r = DBUS_HANDLER_RESULT_NEED_MEMORY; + goto finish; + } + +finish: + if (reply) + dbus_message_unref(reply); + + return r; +} + +enum get_address_result_t { + SUCCESS, + SERVER_FROM_TYPE_FAILED +}; + +/* Caller frees the returned address. */ +static enum get_address_result_t get_address(pa_server_type_t server_type, char **address) { + enum get_address_result_t r = SUCCESS; + pa_client_conf *conf = pa_client_conf_new(); + + *address = NULL; + + pa_client_conf_load(conf, false, false); + + if (conf->default_dbus_server) + *address = pa_xstrdup(conf->default_dbus_server); + else if (!(*address = pa_get_dbus_address_from_server_type(server_type))) { + r = SERVER_FROM_TYPE_FAILED; + goto finish; + } + +finish: + pa_client_conf_free(conf); + return r; +} + +static DBusHandlerResult handle_get_address(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_server_lookup *sl) { + DBusHandlerResult r = DBUS_HANDLER_RESULT_HANDLED; + DBusMessage *reply = NULL; + char *address = NULL; + DBusMessageIter msg_iter; + DBusMessageIter variant_iter; + + pa_assert(conn); + pa_assert(msg); + pa_assert(sl); + + switch (get_address(sl->core->server_type, &address)) { + case SUCCESS: + if (!(reply = dbus_message_new_method_return(msg))) { + r = DBUS_HANDLER_RESULT_NEED_MEMORY; + goto finish; + } + dbus_message_iter_init_append(reply, &msg_iter); + if (!dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_VARIANT, "s", &variant_iter)) { + r = DBUS_HANDLER_RESULT_NEED_MEMORY; + goto finish; + } + if (!dbus_message_iter_append_basic(&variant_iter, DBUS_TYPE_STRING, &address)) { + r = DBUS_HANDLER_RESULT_NEED_MEMORY; + goto finish; + } + if (!dbus_message_iter_close_container(&msg_iter, &variant_iter)) { + r = DBUS_HANDLER_RESULT_NEED_MEMORY; + goto finish; + } + if (!dbus_connection_send(conn, reply, NULL)) { + r = DBUS_HANDLER_RESULT_NEED_MEMORY; + goto finish; + } + r = DBUS_HANDLER_RESULT_HANDLED; + goto finish; + + case SERVER_FROM_TYPE_FAILED: + if (!(reply = dbus_message_new_error(msg, DBUS_ERROR_FAILED, "PulseAudio internal error: get_dbus_server_from_type() failed."))) { + r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + goto finish; + } + if (!dbus_connection_send(conn, reply, NULL)) { + r = DBUS_HANDLER_RESULT_NEED_MEMORY; + goto finish; + } + r = DBUS_HANDLER_RESULT_HANDLED; + goto finish; + + default: + pa_assert_not_reached(); + } + +finish: + pa_xfree(address); + if (reply) + dbus_message_unref(reply); + + return r; +} + +static DBusHandlerResult handle_get(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_server_lookup *sl) { + DBusHandlerResult r = DBUS_HANDLER_RESULT_HANDLED; + const char* interface; + const char* property; + DBusMessage *reply = NULL; + + pa_assert(conn); + pa_assert(msg); + pa_assert(sl); + + if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &property, DBUS_TYPE_INVALID)) { + if (!(reply = dbus_message_new_error(msg, DBUS_ERROR_INVALID_ARGS, "Invalid arguments"))) { + r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + goto finish; + } + if (!dbus_connection_send(conn, reply, NULL)) { + r = DBUS_HANDLER_RESULT_NEED_MEMORY; + goto finish; + } + r = DBUS_HANDLER_RESULT_HANDLED; + goto finish; + } + + if (*interface && !pa_streq(interface, INTERFACE)) { + r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + goto finish; + } + + if (!pa_streq(property, "Address")) { + if (!(reply = dbus_message_new_error_printf(msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "%s: No such property", property))) { + r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + goto finish; + } + if (!dbus_connection_send(conn, reply, NULL)) { + r = DBUS_HANDLER_RESULT_NEED_MEMORY; + goto finish; + } + r = DBUS_HANDLER_RESULT_HANDLED; + goto finish; + } + + r = handle_get_address(conn, msg, sl); + +finish: + if (reply) + dbus_message_unref(reply); + + return r; +} + +static DBusHandlerResult handle_set(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_server_lookup *sl) { + DBusHandlerResult r = DBUS_HANDLER_RESULT_HANDLED; + const char* interface; + const char* property; + DBusMessage *reply = NULL; + + pa_assert(conn); + pa_assert(msg); + pa_assert(sl); + + if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &property, DBUS_TYPE_INVALID)) { + if (!(reply = dbus_message_new_error(msg, DBUS_ERROR_INVALID_ARGS, "Invalid arguments"))) { + r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + goto finish; + } + if (!dbus_connection_send(conn, reply, NULL)) { + r = DBUS_HANDLER_RESULT_NEED_MEMORY; + goto finish; + } + r = DBUS_HANDLER_RESULT_HANDLED; + goto finish; + } + + if (*interface && !pa_streq(interface, INTERFACE)) { + r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + goto finish; + } + + if (!pa_streq(property, "Address")) { + if (!(reply = dbus_message_new_error_printf(msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "%s: No such property", property))) { + r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + goto finish; + } + if (!dbus_connection_send(conn, reply, NULL)) { + r = DBUS_HANDLER_RESULT_NEED_MEMORY; + goto finish; + } + r = DBUS_HANDLER_RESULT_HANDLED; + goto finish; + } + + if (!(reply = dbus_message_new_error_printf(msg, DBUS_ERROR_ACCESS_DENIED, "%s: Property not settable", property))) { + r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + goto finish; + } + if (!dbus_connection_send(conn, reply, NULL)) { + r = DBUS_HANDLER_RESULT_NEED_MEMORY; + goto finish; + } + r = DBUS_HANDLER_RESULT_HANDLED; + +finish: + if (reply) + dbus_message_unref(reply); + + return r; +} + +static DBusHandlerResult handle_get_all(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_server_lookup *sl) { + DBusHandlerResult r = DBUS_HANDLER_RESULT_HANDLED; + DBusMessage *reply = NULL; + const char *property = "Address"; + char *interface = NULL; + char *address = NULL; + DBusMessageIter msg_iter; + DBusMessageIter dict_iter; + DBusMessageIter dict_entry_iter; + DBusMessageIter variant_iter; + + pa_assert(conn); + pa_assert(msg); + pa_assert(sl); + + if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_INVALID)) { + if (!(reply = dbus_message_new_error(msg, DBUS_ERROR_INVALID_ARGS, "Invalid arguments"))) { + r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + goto finish; + } + if (!dbus_connection_send(conn, reply, NULL)) { + r = DBUS_HANDLER_RESULT_NEED_MEMORY; + goto finish; + } + r = DBUS_HANDLER_RESULT_HANDLED; + goto finish; + } + + switch (get_address(sl->core->server_type, &address)) { + case SUCCESS: + if (!(reply = dbus_message_new_method_return(msg))) { + r = DBUS_HANDLER_RESULT_NEED_MEMORY; + goto finish; + } + dbus_message_iter_init_append(reply, &msg_iter); + if (!dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter)) { + r = DBUS_HANDLER_RESULT_NEED_MEMORY; + goto finish; + } + if (!dbus_message_iter_open_container(&dict_iter, DBUS_TYPE_DICT_ENTRY, NULL, &dict_entry_iter)) { + r = DBUS_HANDLER_RESULT_NEED_MEMORY; + goto finish; + } + if (!dbus_message_iter_append_basic(&dict_entry_iter, DBUS_TYPE_STRING, &property)) { + r = DBUS_HANDLER_RESULT_NEED_MEMORY; + goto finish; + } + if (!dbus_message_iter_open_container(&dict_entry_iter, DBUS_TYPE_VARIANT, "s", &variant_iter)) { + r = DBUS_HANDLER_RESULT_NEED_MEMORY; + goto finish; + } + if (!dbus_message_iter_append_basic(&variant_iter, DBUS_TYPE_STRING, &address)) { + r = DBUS_HANDLER_RESULT_NEED_MEMORY; + goto finish; + } + if (!dbus_message_iter_close_container(&dict_entry_iter, &variant_iter)) { + r = DBUS_HANDLER_RESULT_NEED_MEMORY; + goto finish; + } + if (!dbus_message_iter_close_container(&dict_iter, &dict_entry_iter)) { + r = DBUS_HANDLER_RESULT_NEED_MEMORY; + goto finish; + } + if (!dbus_message_iter_close_container(&msg_iter, &dict_iter)) { + r = DBUS_HANDLER_RESULT_NEED_MEMORY; + goto finish; + } + if (!dbus_connection_send(conn, reply, NULL)) { + r = DBUS_HANDLER_RESULT_NEED_MEMORY; + goto finish; + } + r = DBUS_HANDLER_RESULT_HANDLED; + goto finish; + + case SERVER_FROM_TYPE_FAILED: + if (!(reply = dbus_message_new_error(msg, DBUS_ERROR_FAILED, "PulseAudio internal error: get_dbus_server_from_type() failed."))) { + r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + goto finish; + } + if (!dbus_connection_send(conn, reply, NULL)) { + r = DBUS_HANDLER_RESULT_NEED_MEMORY; + goto finish; + } + r = DBUS_HANDLER_RESULT_HANDLED; + goto finish; + + default: + pa_assert_not_reached(); + } + +finish: + pa_xfree(address); + if (reply) + dbus_message_unref(reply); + + return r; +} + +static DBusHandlerResult message_cb(DBusConnection *conn, DBusMessage *msg, void *user_data) { + pa_dbusobj_server_lookup *sl = user_data; + + pa_assert(conn); + pa_assert(msg); + pa_assert(sl); + + /* pa_log("Got message! type = %s path = %s iface = %s member = %s dest = %s", dbus_message_type_to_string(dbus_message_get_type(msg)), dbus_message_get_path(msg), dbus_message_get_interface(msg), dbus_message_get_member(msg), dbus_message_get_destination(msg)); */ + + if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_METHOD_CALL) + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + if (dbus_message_is_method_call(msg, DBUS_INTERFACE_INTROSPECTABLE, "Introspect") || + (!dbus_message_get_interface(msg) && dbus_message_has_member(msg, "Introspect"))) + return handle_introspect(conn, msg, sl); + + if (dbus_message_is_method_call(msg, DBUS_INTERFACE_PROPERTIES, "Get") || + (!dbus_message_get_interface(msg) && dbus_message_has_member(msg, "Get"))) + return handle_get(conn, msg, sl); + + if (dbus_message_is_method_call(msg, DBUS_INTERFACE_PROPERTIES, "Set") || + (!dbus_message_get_interface(msg) && dbus_message_has_member(msg, "Set"))) + return handle_set(conn, msg, sl); + + if (dbus_message_is_method_call(msg, DBUS_INTERFACE_PROPERTIES, "GetAll") || + (!dbus_message_get_interface(msg) && dbus_message_has_member(msg, "GetAll"))) + return handle_get_all(conn, msg, sl); + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +static DBusObjectPathVTable vtable = { + .unregister_function = unregister_cb, + .message_function = message_cb, + .dbus_internal_pad1 = NULL, + .dbus_internal_pad2 = NULL, + .dbus_internal_pad3 = NULL, + .dbus_internal_pad4 = NULL +}; + +pa_dbusobj_server_lookup *pa_dbusobj_server_lookup_new(pa_core *c) { + pa_dbusobj_server_lookup *sl; + DBusError error; + + dbus_error_init(&error); + + sl = pa_xnew(pa_dbusobj_server_lookup, 1); + sl->core = c; + sl->path_registered = false; + + if (!(sl->conn = pa_dbus_bus_get(c, DBUS_BUS_SESSION, &error)) || dbus_error_is_set(&error)) { + pa_log_warn("Unable to contact D-Bus: %s: %s", error.name, error.message); + goto fail; + } + + if (!dbus_connection_register_object_path(pa_dbus_connection_get(sl->conn), OBJECT_PATH, &vtable, sl)) { + pa_log("dbus_connection_register_object_path() failed for " OBJECT_PATH "."); + goto fail; + } + + sl->path_registered = true; + + return sl; + +fail: + dbus_error_free(&error); + + pa_dbusobj_server_lookup_free(sl); + + return NULL; +} + +void pa_dbusobj_server_lookup_free(pa_dbusobj_server_lookup *sl) { + pa_assert(sl); + + if (sl->path_registered) { + pa_assert(sl->conn); + if (!dbus_connection_unregister_object_path(pa_dbus_connection_get(sl->conn), OBJECT_PATH)) + pa_log_debug("dbus_connection_unregister_object_path() failed for " OBJECT_PATH "."); + } + + if (sl->conn) + pa_dbus_connection_unref(sl->conn); + + pa_xfree(sl); +} diff --git a/src/daemon/server-lookup.h b/src/daemon/server-lookup.h new file mode 100644 index 0000000..935baf6 --- /dev/null +++ b/src/daemon/server-lookup.h @@ -0,0 +1,38 @@ +#ifndef fooserverlookuphfoo +#define fooserverlookuphfoo + +/*** + This file is part of PulseAudio. + + Copyright 2009 Tanu Kaskinen + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +/* This object implements the D-Bus object at path + * /org/pulseaudio/server_lookup. Implemented interfaces + * are org.pulseaudio.ServerLookup and org.freedesktop.DBus.Introspectable. + * + * See http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/Developer/Clients/DBus/ConnectingToServer/ + * for the ServerLookup interface documentation. + */ + +#include + +typedef struct pa_dbusobj_server_lookup pa_dbusobj_server_lookup; + +pa_dbusobj_server_lookup *pa_dbusobj_server_lookup_new(pa_core *c); +void pa_dbusobj_server_lookup_free(pa_dbusobj_server_lookup *sl); + +#endif diff --git a/src/daemon/start-pulseaudio-x11.in b/src/daemon/start-pulseaudio-x11.in new file mode 100755 index 0000000..0e84315 --- /dev/null +++ b/src/daemon/start-pulseaudio-x11.in @@ -0,0 +1,37 @@ +#!/bin/sh + +# This file is part of PulseAudio. +# +# PulseAudio 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 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +set -e + +if [ x"$DISPLAY" != x ] ; then + + @PACTL_BINARY@ load-module module-x11-publish "display=$DISPLAY xauthority=$XAUTHORITY" > /dev/null + @PACTL_BINARY@ load-module module-x11-cork-request "display=$DISPLAY xauthority=$XAUTHORITY" > /dev/null + + # KDE plasma versions older than 5.17.0 use module-device-manager's routing API. + # Check for current plasma version and load module if it's necessary. + if [ x"$KDE_FULL_SESSION" = x"true" ]; then + plasmaversion="$(plasmashell -v 2>/dev/null | sed -n 's/^plasmashell \([0-9][0-9]*\)\.\([0-9][0-9]*\)\.\([0-9][0-9]*\)/\1*1000000+\2*1000+\3/p' | head -1)" + if [ -n "$plasmaversion" ] && [ "$(($plasmaversion))" -lt "5017000" ]; then + @PACTL_BINARY@ load-module module-device-manager "do_routing=1" > /dev/null + fi + fi + + if [ x"$SESSION_MANAGER" != x ] ; then + @PACTL_BINARY@ load-module module-x11-xsmp "display=$DISPLAY xauthority=$XAUTHORITY session_manager=$SESSION_MANAGER" > /dev/null + fi +fi diff --git a/src/daemon/system.pa.in b/src/daemon/system.pa.in new file mode 100755 index 0000000..73e39ec --- /dev/null +++ b/src/daemon/system.pa.in @@ -0,0 +1,62 @@ +#!@PA_BINARY@ -nF +# +# This file is part of PulseAudio. +# +# PulseAudio 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 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +# This startup script is used only if PulseAudio is started in system +# mode. +changequote(`[', `]')dnl Set up m4 quoting + +### Automatically restore the volume of streams and devices +load-module module-device-restore +load-module module-stream-restore +load-module module-card-restore + +### Automatically load driver modules depending on the hardware available +ifelse(@HAVE_UDEV@, 1, [dnl +.ifexists module-udev-detect@PA_SOEXT@ +load-module module-udev-detect +.else +], @HAVE_COREAUDIO@, 1, [dnl +.ifexists module-coreaudio-detect@PA_SOEXT@ +load-module module-coreaudio-detect +.else +], [dnl +.ifexists module-detect@PA_SOEXT@ +])dnl +### Use the static hardware detection module (for systems that lack udev/hal support) +load-module module-detect +.endif + +### Load several protocols +.ifexists module-esound-protocol-unix@PA_SOEXT@ +load-module module-esound-protocol-unix +.endif +load-module module-native-protocol-unix + +### Automatically restore the default sink/source when changed by the user +### during runtime +### NOTE: This should be loaded as early as possible so that subsequent modules +### that look up the default sink/source get the right value +load-module module-default-device-restore + +### Make sure we always have a sink around, even if it is a null sink. +load-module module-always-sink + +### Automatically suspend sinks/sources that become idle for too long +load-module module-suspend-on-idle + +### Enable positioned event sounds +load-module module-position-event-sounds diff --git a/src/daemon/systemd/user/pulseaudio.service.in b/src/daemon/systemd/user/pulseaudio.service.in new file mode 100644 index 0000000..ae0caf8 --- /dev/null +++ b/src/daemon/systemd/user/pulseaudio.service.in @@ -0,0 +1,34 @@ +[Unit] +Description=Sound Service + +# We require pulseaudio.socket to be active before starting the daemon, because +# while it is possible to use the service without the socket, it is not clear +# why it would be desirable. +# +# A user installing pulseaudio and doing `systemctl --user start pulseaudio` +# will not get the socket started, which might be confusing and problematic if +# the server is to be restarted later on, as the client autospawn feature +# might kick in. Also, a start of the socket unit will fail, adding to the +# confusion. +# +# After=pulseaudio.socket is not needed, as it is already implicit in the +# socket-service relationship, see systemd.socket(5). +Requires=pulseaudio.socket +ConditionUser=!root + +[Service] +ExecStart=@PA_BINARY@ --daemonize=no --log-target=journal +LockPersonality=yes +MemoryDenyWriteExecute=yes +NoNewPrivileges=yes +Restart=on-failure +RestrictNamespaces=yes +SystemCallArchitectures=native +SystemCallFilter=@system-service +# Note that notify will only work if --daemonize=no +Type=notify +UMask=0077 + +[Install] +Also=pulseaudio.socket +WantedBy=default.target diff --git a/src/daemon/systemd/user/pulseaudio.socket b/src/daemon/systemd/user/pulseaudio.socket new file mode 100644 index 0000000..98c1002 --- /dev/null +++ b/src/daemon/systemd/user/pulseaudio.socket @@ -0,0 +1,11 @@ +[Unit] +Description=Sound System +ConditionUser=!root + +[Socket] +Priority=6 +Backlog=5 +ListenStream=%t/pulse/native + +[Install] +WantedBy=sockets.target diff --git a/src/depmod.py b/src/depmod.py new file mode 100755 index 0000000..39b50ce --- /dev/null +++ b/src/depmod.py @@ -0,0 +1,70 @@ +#!/usr/bin/python + +# This file is part of PulseAudio. +# +# PulseAudio 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 2 of the License, or +# (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +import sys, os, string + +exported_symbols = {} +imported_symbols = {} + +for fn in sys.argv[1:]: + f = os.popen("nm '%s'" % fn, "r") + + imported_symbols[fn] = [] + + for line in f: + sym_address = line[:7].strip() + sym_type = line[9].strip() + sym_name = line[11:].strip() + + if sym_name in ('_fini', '_init'): + continue + + if sym_type in ('T', 'B', 'R', 'D' 'G', 'S', 'D'): + if exported_symbols.has_key(sym_name): + sys.stderr.write("CONFLICT: %s defined in both '%s' and '%s'.\n" % (sym_name, fn, exported_symbols[sym_name])) + else: + exported_symbols[sym_name] = fn + elif sym_type in ('U',): + if sym_name[:3] == 'pa_': + imported_symbols[fn].append(sym_name) + + f.close() + +dependencies = {} +unresolved_symbols = {} + +for fn in imported_symbols: + dependencies[fn] = [] + + for sym in imported_symbols[fn]: + if exported_symbols.has_key(sym): + if exported_symbols[sym] not in dependencies[fn]: + dependencies[fn].append(exported_symbols[sym]) + else: + if unresolved_symbols.has_key(sym): + unresolved_symbols[sym].append(fn) + else: + unresolved_symbols[sym] = [fn] + +for sym, files in unresolved_symbols.iteritems(): + print "WARNING: Unresolved symbol '%s' in %s" % (sym, `files`) + +k = dependencies.keys() +k.sort() +for fn in k: + dependencies[fn].sort() + print "%s: %s" % (fn, string.join(dependencies[fn], " ")) diff --git a/src/map-file b/src/map-file new file mode 100644 index 0000000..b0cd1bf --- /dev/null +++ b/src/map-file @@ -0,0 +1,392 @@ +PULSE_0 { +global: +pa_ascii_filter; +pa_ascii_valid; +pa_bytes_per_second; +pa_bytes_snprint; +pa_bytes_to_usec; +pa_channel_map_can_balance; +pa_channel_map_can_fade; +pa_channel_map_can_lfe_balance; +pa_channel_map_compatible; +pa_channel_map_equal; +pa_channel_map_has_position; +pa_channel_map_init; +pa_channel_map_init_auto; +pa_channel_map_init_extend; +pa_channel_map_init_mono; +pa_channel_map_init_stereo; +pa_channel_map_mask; +pa_channel_map_parse; +pa_channel_map_snprint; +pa_channel_map_superset; +pa_channel_map_to_name; +pa_channel_map_to_pretty_name; +pa_channel_map_valid; +pa_channel_position_from_string; +pa_channel_position_to_pretty_string; +pa_channel_position_to_string; +pa_channels_valid; +pa_context_add_autoload; +pa_context_connect; +pa_context_disconnect; +pa_context_drain; +pa_context_errno; +pa_context_exit_daemon; +pa_context_get_autoload_info_by_index; +pa_context_get_autoload_info_by_name; +pa_context_get_autoload_info_list; +pa_context_get_card_info_by_index; +pa_context_get_card_info_by_name; +pa_context_get_card_info_list; +pa_context_get_client_info; +pa_context_get_client_info_list; +pa_context_get_index; +pa_context_get_module_info; +pa_context_get_module_info_list; +pa_context_get_protocol_version; +pa_context_get_sample_info_by_index; +pa_context_get_sample_info_by_name; +pa_context_get_sample_info_list; +pa_context_get_server; +pa_context_get_server_info; +pa_context_get_server_protocol_version; +pa_context_get_sink_info_by_index; +pa_context_get_sink_info_by_name; +pa_context_get_sink_info_list; +pa_context_get_sink_input_info; +pa_context_get_sink_input_info_list; +pa_context_get_source_info_by_index; +pa_context_get_source_info_by_name; +pa_context_get_source_info_list; +pa_context_get_source_output_info; +pa_context_get_source_output_info_list; +pa_context_set_port_latency_offset; +pa_context_get_state; +pa_context_get_tile_size; +pa_context_is_local; +pa_context_is_pending; +pa_context_kill_client; +pa_context_kill_sink_input; +pa_context_kill_source_output; +pa_context_load_cookie_from_file; +pa_context_load_module; +pa_context_move_sink_input_by_index; +pa_context_move_sink_input_by_name; +pa_context_move_source_output_by_index; +pa_context_move_source_output_by_name; +pa_context_new; +pa_context_new_with_proplist; +pa_context_play_sample; +pa_context_play_sample_with_proplist; +pa_context_proplist_remove; +pa_context_proplist_update; +pa_context_ref; +pa_context_remove_autoload_by_index; +pa_context_remove_autoload_by_name; +pa_context_remove_sample; +pa_context_rttime_new; +pa_context_rttime_restart; +pa_context_set_card_profile_by_index; +pa_context_set_card_profile_by_name; +pa_context_set_default_sink; +pa_context_set_default_source; +pa_context_set_event_callback; +pa_context_set_name; +pa_context_set_sink_input_mute; +pa_context_set_sink_input_volume; +pa_context_set_sink_mute_by_index; +pa_context_set_sink_mute_by_name; +pa_context_set_sink_port_by_index; +pa_context_set_sink_port_by_name; +pa_context_set_sink_volume_by_index; +pa_context_set_sink_volume_by_name; +pa_context_set_source_output_mute; +pa_context_set_source_output_volume; +pa_context_set_source_mute_by_index; +pa_context_set_source_mute_by_name; +pa_context_set_source_port_by_index; +pa_context_set_source_port_by_name; +pa_context_set_source_volume_by_index; +pa_context_set_source_volume_by_name; +pa_context_set_state_callback; +pa_context_set_subscribe_callback; +pa_context_stat; +pa_context_subscribe; +pa_context_suspend_sink_by_index; +pa_context_suspend_sink_by_name; +pa_context_suspend_source_by_index; +pa_context_suspend_source_by_name; +pa_context_unload_module; +pa_context_unref; +pa_cvolume_avg; +pa_cvolume_avg_mask; +pa_cvolume_channels_equal_to; +pa_cvolume_compatible; +pa_cvolume_compatible_with_channel_map; +pa_cvolume_dec; +pa_cvolume_equal; +pa_cvolume_get_balance; +pa_cvolume_get_fade; +pa_cvolume_get_lfe_balance; +pa_cvolume_get_position; +pa_cvolume_inc; +pa_cvolume_inc_clamp; +pa_cvolume_init; +pa_cvolume_max; +pa_cvolume_max_mask; +pa_cvolume_merge; +pa_cvolume_min; +pa_cvolume_min_mask; +pa_cvolume_remap; +pa_cvolume_scale; +pa_cvolume_scale_mask; +pa_cvolume_set; +pa_cvolume_set_balance; +pa_cvolume_set_fade; +pa_cvolume_set_lfe_balance; +pa_cvolume_set_position; +pa_cvolume_snprint; +pa_cvolume_snprint_verbose; +pa_cvolume_valid; +pa_direction_to_string; +pa_direction_valid; +pa_encoding_from_string; +pa_encoding_to_string; +pa_ext_device_manager_delete; +pa_ext_device_manager_enable_role_device_priority_routing; +pa_ext_device_manager_read; +pa_ext_device_manager_reorder_devices_for_role; +pa_ext_device_manager_set_device_description; +pa_ext_device_manager_set_subscribe_cb; +pa_ext_device_manager_subscribe; +pa_ext_device_manager_test; +pa_ext_device_restore_read_formats; +pa_ext_device_restore_read_formats_all; +pa_ext_device_restore_save_formats; +pa_ext_device_restore_set_subscribe_cb; +pa_ext_device_restore_subscribe; +pa_ext_device_restore_test; +pa_ext_stream_restore_delete; +pa_ext_stream_restore_read; +pa_ext_stream_restore_set_subscribe_cb; +pa_ext_stream_restore_subscribe; +pa_ext_stream_restore_test; +pa_ext_stream_restore_write; +pa_format_info_copy; +pa_format_info_free; +pa_format_info_from_string; +pa_format_info_from_sample_spec; +pa_format_info_get_channel_map; +pa_format_info_get_channels; +pa_format_info_get_prop_type; +pa_format_info_get_prop_int; +pa_format_info_get_prop_int_range; +pa_format_info_get_prop_int_array; +pa_format_info_get_prop_string; +pa_format_info_get_prop_string_array; +pa_format_info_get_rate; +pa_format_info_get_sample_format; +pa_format_info_free_string_array; +pa_format_info_is_compatible; +pa_format_info_is_pcm; +pa_format_info_new; +pa_format_info_set_channel_map; +pa_format_info_set_channels; +pa_format_info_set_prop_int; +pa_format_info_set_prop_int_array; +pa_format_info_set_prop_int_range; +pa_format_info_set_prop_string; +pa_format_info_set_prop_string_array; +pa_format_info_set_rate; +pa_format_info_set_sample_format; +pa_format_info_snprint; +pa_format_info_to_sample_spec; +pa_format_info_valid; +pa_frame_size; +pa_get_binary_name; +pa_get_fqdn; +pa_get_home_dir; +pa_get_host_name; +pa_get_library_version; +pa_gettimeofday; +pa_get_user_name; +pa_glib_mainloop_free; +pa_glib_mainloop_get_api; +pa_glib_mainloop_new; +pa_locale_to_utf8; +pa_mainloop_api_once; +pa_mainloop_dispatch; +pa_mainloop_free; +pa_mainloop_get_api; +pa_mainloop_get_retval; +pa_mainloop_iterate; +pa_mainloop_new; +pa_mainloop_poll; +pa_mainloop_prepare; +pa_mainloop_quit; +pa_mainloop_run; +pa_mainloop_set_poll_func; +pa_mainloop_wakeup; +pa_msleep; +pa_thread_make_realtime; +pa_operation_cancel; +pa_operation_get_state; +pa_operation_ref; +pa_operation_set_state_callback; +pa_operation_unref; +pa_parse_sample_format; +pa_path_get_filename; +pa_proplist_clear; +pa_proplist_contains; +pa_proplist_copy; +pa_proplist_equal; +pa_proplist_free; +pa_proplist_from_string; +pa_proplist_get; +pa_proplist_gets; +pa_proplist_isempty; +pa_proplist_iterate; +pa_proplist_key_valid; +pa_proplist_new; +pa_proplist_set; +pa_proplist_setf; +pa_proplist_setp; +pa_proplist_sets; +pa_proplist_size; +pa_proplist_to_string; +pa_proplist_to_string_sep; +pa_proplist_unset; +pa_proplist_unset_many; +pa_proplist_update; +pa_rtclock_now; +pa_sample_format_is_be; +pa_sample_format_is_le; +pa_sample_format_to_string; +pa_sample_format_valid; +pa_sample_rate_valid; +pa_sample_size; +pa_sample_size_of_format; +pa_sample_spec_equal; +pa_sample_spec_init; +pa_sample_spec_snprint; +pa_sample_spec_valid; +pa_signal_done; +pa_signal_free; +pa_signal_init; +pa_signal_new; +pa_signal_set_destroy; +pa_simple_drain; +pa_simple_flush; +pa_simple_free; +pa_simple_get_latency; +pa_simple_new; +pa_simple_read; +pa_simple_write; +pa_stream_begin_write; +pa_stream_cancel_write; +pa_stream_connect_playback; +pa_stream_connect_record; +pa_stream_connect_upload; +pa_stream_cork; +pa_stream_disconnect; +pa_stream_drain; +pa_stream_drop; +pa_stream_finish_upload; +pa_stream_flush; +pa_stream_get_buffer_attr; +pa_stream_get_channel_map; +pa_stream_get_context; +pa_stream_get_device_index; +pa_stream_get_device_name; +pa_stream_get_format_info; +pa_stream_get_index; +pa_stream_get_latency; +pa_stream_get_monitor_stream; +pa_stream_get_sample_spec; +pa_stream_get_state; +pa_stream_get_time; +pa_stream_get_timing_info; +pa_stream_get_underflow_index; +pa_stream_is_corked; +pa_stream_is_suspended; +pa_stream_new; +pa_stream_new_extended; +pa_stream_new_with_proplist; +pa_stream_peek; +pa_stream_prebuf; +pa_stream_proplist_remove; +pa_stream_proplist_update; +pa_stream_readable_size; +pa_stream_ref; +pa_stream_set_buffer_attr; +pa_stream_set_buffer_attr_callback; +pa_stream_set_event_callback; +pa_stream_set_latency_update_callback; +pa_stream_set_monitor_stream; +pa_stream_set_moved_callback; +pa_stream_set_name; +pa_stream_set_overflow_callback; +pa_stream_set_read_callback; +pa_stream_set_started_callback; +pa_stream_set_state_callback; +pa_stream_set_suspended_callback; +pa_stream_set_underflow_callback; +pa_stream_set_write_callback; +pa_stream_trigger; +pa_stream_unref; +pa_stream_update_sample_rate; +pa_stream_update_timing_info; +pa_stream_writable_size; +pa_stream_write; +pa_stream_write_ext_free; +pa_strerror; +pa_sw_cvolume_divide; +pa_sw_cvolume_divide_scalar; +pa_sw_cvolume_multiply; +pa_sw_cvolume_multiply_scalar; +pa_sw_cvolume_snprint_dB; +pa_sw_volume_divide; +pa_sw_volume_from_dB; +pa_sw_volume_from_linear; +pa_sw_volume_multiply; +pa_sw_volume_snprint_dB; +pa_sw_volume_to_dB; +pa_sw_volume_to_linear; +pa_threaded_mainloop_accept; +pa_threaded_mainloop_free; +pa_threaded_mainloop_get_api; +pa_threaded_mainloop_get_retval; +pa_threaded_mainloop_in_thread; +pa_threaded_mainloop_lock; +pa_threaded_mainloop_new; +pa_threaded_mainloop_once_unlocked; +pa_threaded_mainloop_set_name; +pa_threaded_mainloop_signal; +pa_threaded_mainloop_start; +pa_threaded_mainloop_stop; +pa_threaded_mainloop_unlock; +pa_threaded_mainloop_wait; +pa_timeval_add; +pa_timeval_age; +pa_timeval_cmp; +pa_timeval_diff; +pa_timeval_load; +pa_timeval_store; +pa_timeval_sub; +pa_usec_to_bytes; +pa_utf8_filter; +pa_utf8_to_locale; +pa_utf8_valid; +pa_volume_snprint; +pa_volume_snprint_verbose; +pa_xfree; +pa_xmalloc; +pa_xmalloc0; +pa_xmemdup; +pa_xrealloc; +pa_xstrdup; +pa_xstrndup; +local: +*; +}; diff --git a/src/meson.build b/src/meson.build new file mode 100644 index 0000000..8d74a31 --- /dev/null +++ b/src/meson.build @@ -0,0 +1,203 @@ +libpulsecommon_sources = [ + 'pulse/client-conf.c', + 'pulse/error.c', + 'pulse/fork-detect.c', + 'pulse/format.c', + 'pulse/json.c', + 'pulse/mainloop-api.c', + 'pulse/xmalloc.c', + 'pulse/proplist.c', + 'pulse/utf8.c', + 'pulse/channelmap.c', + 'pulse/sample.c', + 'pulse/util.c', + 'pulse/timeval.c', + 'pulse/rtclock.c', + 'pulse/volume.c', + 'pulsecore/authkey.c', + 'pulsecore/conf-parser.c', + 'pulsecore/core-error.c', + 'pulsecore/core-format.c', + 'pulsecore/core-rtclock.c', + 'pulsecore/core-util.c', + 'pulsecore/dynarray.c', + 'pulsecore/fdsem.c', + 'pulsecore/flist.c', + 'pulsecore/g711.c', + 'pulsecore/hashmap.c', + 'pulsecore/i18n.c', + 'pulsecore/idxset.c', + 'pulsecore/arpa-inet.c', + 'pulsecore/iochannel.c', + 'pulsecore/ioline.c', + 'pulsecore/ipacl.c', + 'pulsecore/lock-autospawn.c', + 'pulsecore/log.c', + 'pulsecore/ratelimit.c', + 'pulsecore/mcalign.c', + 'pulsecore/memblock.c', + 'pulsecore/memblockq.c', + 'pulsecore/memchunk.c', + 'pulsecore/mutex-posix.c', + 'pulsecore/native-common.c', + 'pulsecore/once.c', + 'pulsecore/packet.c', + 'pulsecore/parseaddr.c', + 'pulsecore/pdispatch.c', + 'pulsecore/pid.c', + 'pulsecore/pipe.c', + 'pulsecore/memtrap.c', + 'pulsecore/aupdate.c', + 'pulsecore/proplist-util.c', + 'pulsecore/pstream-util.c', + 'pulsecore/pstream.c', + 'pulsecore/queue.c', + 'pulsecore/random.c', + 'pulsecore/srbchannel.c', + 'pulsecore/sample-util.c', + 'pulsecore/semaphore-posix.c', + 'pulsecore/shm.c', + 'pulsecore/bitset.c', + 'pulsecore/socket-client.c', + 'pulsecore/socket-server.c', + 'pulsecore/socket-util.c', + 'pulsecore/strbuf.c', + 'pulsecore/strlist.c', + 'pulsecore/tagstruct.c', + 'pulsecore/thread-posix.c', + 'pulsecore/time-smoother.c', + 'pulsecore/tokenizer.c', + 'pulsecore/usergroup.c', + 'pulsecore/sndfile-util.c', +] + +libpulsecommon_headers = [ + 'pulse/client-conf.h', + 'pulse/error.h', + 'pulse/fork-detect.h', + 'pulse/format.h', + 'pulse/json.h', + 'pulse/mainloop-api.h', + 'pulse/xmalloc.h', + 'pulse/proplist.h', + 'pulse/utf8.h', + 'pulse/channelmap.h', + 'pulse/sample.h', + 'pulse/util.h', + 'pulse/timeval.h', + 'pulse/rtclock.h', + 'pulse/volume.h', + 'pulsecore/atomic.h', + 'pulsecore/authkey.h', + 'pulsecore/conf-parser.h', + 'pulsecore/core-error.h', + 'pulsecore/core-format.h', + 'pulsecore/core-rtclock.h', + 'pulsecore/core-util.h', + 'pulsecore/creds.h', + 'pulsecore/dynarray.h', + 'pulsecore/endianmacros.h', + 'pulsecore/fdsem.h', + 'pulsecore/flist.h', + 'pulsecore/g711.h', + 'pulsecore/hashmap.h', + 'pulsecore/i18n.h', + 'pulsecore/idxset.h', + 'pulsecore/arpa-inet.h', + 'pulsecore/iochannel.h', + 'pulsecore/ioline.h', + 'pulsecore/ipacl.h', + 'pulsecore/llist.h', + 'pulsecore/lock-autospawn.h', + 'pulsecore/log.h', + 'pulsecore/ratelimit.h', + 'pulsecore/macro.h', + 'pulsecore/mcalign.h', + 'pulsecore/mem.h', + 'pulsecore/memblock.h', + 'pulsecore/memblockq.h', + 'pulsecore/memchunk.h', + 'pulsecore/mutex.h', + 'pulsecore/native-common.h', + 'pulsecore/once.h', + 'pulsecore/packet.h', + 'pulsecore/parseaddr.h', + 'pulsecore/pdispatch.h', + 'pulsecore/pid.h', + 'pulsecore/pipe.h', + 'pulsecore/memtrap.h', + 'pulsecore/aupdate.h', + 'pulsecore/proplist-util.h', + 'pulsecore/pstream-util.h', + 'pulsecore/pstream.h', + 'pulsecore/queue.h', + 'pulsecore/random.h', + 'pulsecore/refcnt.h', + 'pulsecore/srbchannel.h', + 'pulsecore/sample-util.h', + 'pulsecore/semaphore.h', + 'pulsecore/shm.h', + 'pulsecore/bitset.h', + 'pulsecore/socket-client.h', + 'pulsecore/socket-server.h', + 'pulsecore/socket-util.h', + 'pulsecore/strbuf.h', + 'pulsecore/strlist.h', + 'pulsecore/tagstruct.h', + 'pulsecore/thread.h', + 'pulsecore/time-smoother.h', + 'pulsecore/tokenizer.h', + 'pulsecore/usergroup.h', + 'pulsecore/sndfile-util.h', + 'pulsecore/socket.h', +] + +if dbus_dep.found() + libpulsecommon_sources += [ + 'pulsecore/dbus-util.c', + 'pulsecore/rtkit.c', + ] + libpulsecommon_headers += [ + 'pulsecore/dbus-util.h', + 'pulsecore/rtkit.h', + ] +endif + +if x11_dep.found() + libpulsecommon_sources += [ + 'pulse/client-conf-x11.c', + 'pulsecore/x11prop.c', + ] + libpulsecommon_headers += [ + 'pulse/client-conf-x11.h', + 'pulsecore/x11prop.h', + ] +endif + +# FIXME: Do non-POSIX thread things +# FIXME: Do SIMD things + +libpulsecommon = shared_library('pulsecommon-' + pa_version_major_minor, + libpulsecommon_sources, + libpulsecommon_headers, + include_directories : [configinc, topinc], + c_args : [pa_c_args], + link_args : [nodelete_link_args], + install : true, + install_dir : privlibdir, + dependencies : [ + libm_dep, thread_dep, dl_dep, shm_dep, iconv_dep, sndfile_dep, dbus_dep, + x11_dep, libsystemd_dep, glib_dep, gtk_dep, asyncns_dep, libintl_dep, + ], + implicit_include_directories : false) + +libpulsecommon_dep = declare_dependency(link_with: libpulsecommon) + +subdir('pulse') +subdir('pulsecore') +subdir('daemon') +subdir('modules') +if get_option('tests') + subdir('tests') +endif +subdir('utils') diff --git a/src/modules/alsa/90-pulseaudio.rules b/src/modules/alsa/90-pulseaudio.rules new file mode 100644 index 0000000..7bfacda --- /dev/null +++ b/src/modules/alsa/90-pulseaudio.rules @@ -0,0 +1,170 @@ +# do not edit this file, it will be overwritten on update + +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 PulseAudio; if not, see . + +SUBSYSTEM!="sound", GOTO="pulseaudio_end" +ACTION!="change", GOTO="pulseaudio_end" +KERNEL!="card*", GOTO="pulseaudio_end" +SUBSYSTEMS=="usb", GOTO="pulseaudio_check_usb" +SUBSYSTEMS=="pci", GOTO="pulseaudio_check_pci" +SUBSYSTEMS=="firewire", GOTO="pulseaudio_firewire_quirk" + +SUBSYSTEMS=="platform", DRIVERS=="thinkpad_acpi", ENV{PULSE_IGNORE}="1" + +# Force enable speaker and internal mic for some laptops +# This should only be necessary for kernels 3.3, 3.4 and 3.5 (as they are lacking the phantom jack kctls). +# Acer AOA150 +ATTRS{subsystem_vendor}=="0x1025", ATTRS{subsystem_device}=="0x015b", ENV{PULSE_PROFILE_SET}="force-speaker-and-int-mic.conf" +# Acer Aspire 4810TZ +ATTRS{subsystem_vendor}=="0x1025", ATTRS{subsystem_device}=="0x022a", ENV{PULSE_PROFILE_SET}="force-speaker-and-int-mic.conf" +# Packard bell dot m/a +ATTRS{subsystem_vendor}=="0x1025", ATTRS{subsystem_device}=="0x028c", ENV{PULSE_PROFILE_SET}="force-speaker-and-int-mic.conf" +# Acer Aspire 1810TZ +ATTRS{subsystem_vendor}=="0x1025", ATTRS{subsystem_device}=="0x029b", ENV{PULSE_PROFILE_SET}="force-speaker-and-int-mic.conf" +# Acer AOD260 and AO532h +ATTRS{subsystem_vendor}=="0x1025", ATTRS{subsystem_device}=="0x0349", ENV{PULSE_PROFILE_SET}="force-speaker-and-int-mic.conf" +# Dell MXC051 +ATTRS{subsystem_vendor}=="0x1028", ATTRS{subsystem_device}=="0x01b5", ENV{PULSE_PROFILE_SET}="force-speaker.conf" +# Dell Inspiron 6400 and E1505 +ATTRS{subsystem_vendor}=="0x1028", ATTRS{subsystem_device}=="0x01bd", ENV{PULSE_PROFILE_SET}="force-speaker.conf" +# Dell Latitude D620 +ATTRS{subsystem_vendor}=="0x1028", ATTRS{subsystem_device}=="0x01c2", ENV{PULSE_PROFILE_SET}="force-speaker-and-int-mic.conf" +# Dell Latitude D820 +ATTRS{subsystem_vendor}=="0x1028", ATTRS{subsystem_device}=="0x01cc", ENV{PULSE_PROFILE_SET}="force-speaker-and-int-mic.conf" +# Dell Latitude D520 +ATTRS{subsystem_vendor}=="0x1028", ATTRS{subsystem_device}=="0x01d4", ENV{PULSE_PROFILE_SET}="force-speaker-and-int-mic.conf" +# Dell Latitude D420 +ATTRS{subsystem_vendor}=="0x1028", ATTRS{subsystem_device}=="0x01d6", ENV{PULSE_PROFILE_SET}="force-speaker-and-int-mic.conf" +# Dell Inspiron 1525 +ATTRS{subsystem_vendor}=="0x1028", ATTRS{subsystem_device}=="0x022f", ENV{PULSE_PROFILE_SET}="force-speaker-and-int-mic.conf" +# Dell Inspiron 1011 +ATTRS{subsystem_vendor}=="0x1028", ATTRS{subsystem_device}=="0x02f4", ENV{PULSE_PROFILE_SET}="force-speaker-and-int-mic.conf" +# Dell XPS 14 (L401X) +ATTRS{subsystem_vendor}=="0x1028", ATTRS{subsystem_device}=="0x0468", ENV{PULSE_PROFILE_SET}="force-speaker-and-int-mic.conf" +# Dell XPS 15 (L501X) +ATTRS{subsystem_vendor}=="0x1028", ATTRS{subsystem_device}=="0x046e", ENV{PULSE_PROFILE_SET}="force-speaker-and-int-mic.conf" +# Dell XPS 15 (L502X) +ATTRS{subsystem_vendor}=="0x1028", ATTRS{subsystem_device}=="0x050e", ENV{PULSE_PROFILE_SET}="force-speaker-and-int-mic.conf" +# Dell Inspiron 3420 +ATTRS{subsystem_vendor}=="0x1028", ATTRS{subsystem_device}=="0x0553", ENV{PULSE_PROFILE_SET}="force-speaker.conf" +# Dell Inspiron 3520 +ATTRS{subsystem_vendor}=="0x1028", ATTRS{subsystem_device}=="0x0555", ENV{PULSE_PROFILE_SET}="force-speaker.conf" +# Dell Vostro 2420 +ATTRS{subsystem_vendor}=="0x1028", ATTRS{subsystem_device}=="0x0556", ENV{PULSE_PROFILE_SET}="force-speaker.conf" +# Dell Vostro 2520 +ATTRS{subsystem_vendor}=="0x1028", ATTRS{subsystem_device}=="0x0558", ENV{PULSE_PROFILE_SET}="force-speaker.conf" +# Dell Inspiron One 2020 +ATTRS{subsystem_vendor}=="0x1028", ATTRS{subsystem_device}=="0x0579", ENV{PULSE_PROFILE_SET}="force-speaker-and-int-mic.conf" +# Asus 904HA (1000H) +ATTRS{subsystem_vendor}=="0x1043", ATTRS{subsystem_device}=="0x831a", ENV{PULSE_PROFILE_SET}="force-speaker-and-int-mic.conf" +# Asus T101MT +ATTRS{subsystem_vendor}=="0x1043", ATTRS{subsystem_device}=="0x83ce", ENV{PULSE_PROFILE_SET}="force-speaker-and-int-mic.conf" +# Sony Vaio VGN-SR21M +ATTRS{subsystem_vendor}=="0x104d", ATTRS{subsystem_device}=="0x9033", ENV{PULSE_PROFILE_SET}="force-speaker-and-int-mic.conf" +# Sony Vaio VPC-W115XG +ATTRS{subsystem_vendor}=="0x104d", ATTRS{subsystem_device}=="0x9064", ENV{PULSE_PROFILE_SET}="force-speaker-and-int-mic.conf" +# Fujitsu Lifebook S7110 +ATTRS{subsystem_vendor}=="0x10cf", ATTRS{subsystem_device}=="0x1397", ENV{PULSE_PROFILE_SET}="force-speaker-and-int-mic.conf" +# Fujitsu Lifebook A530 +ATTRS{subsystem_vendor}=="0x10cf", ATTRS{subsystem_device}=="0x1531", ENV{PULSE_PROFILE_SET}="force-speaker-and-int-mic.conf" +# Toshiba A200 +ATTRS{subsystem_vendor}=="0x1179", ATTRS{subsystem_device}=="0xff00", ENV{PULSE_PROFILE_SET}="force-speaker-and-int-mic.conf" +# MSI X360 +ATTRS{subsystem_vendor}=="0x1462", ATTRS{subsystem_device}=="0x1053", ENV{PULSE_PROFILE_SET}="force-speaker-and-int-mic.conf" +# Lenovo 3000 Y410 +ATTRS{subsystem_vendor}=="0x17aa", ATTRS{subsystem_device}=="0x384e", ENV{PULSE_PROFILE_SET}="force-speaker.conf" + +GOTO="pulseaudio_end" + +LABEL="pulseaudio_check_usb" +ATTRS{idVendor}=="17cc", ATTRS{idProduct}=="1978", ENV{PULSE_PROFILE_SET}="native-instruments-audio8dj.conf" +ATTRS{idVendor}=="17cc", ATTRS{idProduct}=="0839", ENV{PULSE_PROFILE_SET}="native-instruments-audio4dj.conf" +ATTRS{idVendor}=="17cc", ATTRS{idProduct}=="baff", ENV{PULSE_PROFILE_SET}="native-instruments-traktorkontrol-s4.conf" +ATTRS{idVendor}=="17cc", ATTRS{idProduct}=="4711", ENV{PULSE_PROFILE_SET}="native-instruments-korecontroller.conf" + +# This ID 17cc:041c is verified for the older Audio 2 DJ model (pre-2014 ish). +ATTRS{idVendor}=="17cc", ATTRS{idProduct}=="041c", ENV{PULSE_PROFILE_SET}="native-instruments-traktor-audio2.conf" +ATTRS{idVendor}=="17cc", ATTRS{idProduct}=="041d", ENV{PULSE_PROFILE_SET}="native-instruments-traktor-audio2.conf" + +# There appear to be two IDs in use for Traktor Audio 6 (or maybe 17cc:1011 +# is just incorrect - 17cc:1010 has been verified to be correct at least +# for some hardware). +ATTRS{idVendor}=="17cc", ATTRS{idProduct}=="1010", ENV{PULSE_PROFILE_SET}="native-instruments-traktor-audio6.conf" +ATTRS{idVendor}=="17cc", ATTRS{idProduct}=="1011", ENV{PULSE_PROFILE_SET}="native-instruments-traktor-audio6.conf" + +ATTRS{idVendor}=="17cc", ATTRS{idProduct}=="1021", ENV{PULSE_PROFILE_SET}="native-instruments-traktor-audio10.conf" +ATTRS{idVendor}=="0763", ATTRS{idProduct}=="2012", ENV{PULSE_PROFILE_SET}="maudio-fasttrack-pro.conf" +ATTRS{idVendor}=="045e", ATTRS{idProduct}=="02bb", ENV{PULSE_PROFILE_SET}="kinect-audio.conf" +ATTRS{idVendor}=="041e", ATTRS{idProduct}=="322c", ENV{PULSE_PROFILE_SET}="sb-omni-surround-5.1.conf" +ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="4014", ENV{PULSE_PROFILE_SET}="dell-dock-tb16-usb-audio.conf" + +# ID 1038:12ad is for the 2018 refresh of the Arctis 7. +# ID 1038:1294 is for Arctis Pro Wireless (which works with the Arctis 7 configuration). +ATTRS{idVendor}=="1038", ATTRS{idProduct}=="1260", ENV{PULSE_PROFILE_SET}="usb-gaming-headset.conf" +ATTRS{idVendor}=="1038", ATTRS{idProduct}=="12ad", ENV{PULSE_PROFILE_SET}="usb-gaming-headset.conf" +ATTRS{idVendor}=="1038", ATTRS{idProduct}=="1294", ENV{PULSE_PROFILE_SET}="usb-gaming-headset.conf" +ATTRS{idVendor}=="1038", ATTRS{idProduct}=="1730", ENV{PULSE_PROFILE_SET}="usb-gaming-headset.conf" +# Lucidsound LS31 +ATTRS{idVendor}=="2f12", ATTRS{idProduct}=="0109", ENV{PULSE_PROFILE_SET}="usb-gaming-headset.conf" +# ID 9886:002c is for the Astro A50 Gen4 +ATTRS{idVendor}=="9886", ATTRS{idProduct}=="002c", ENV{PULSE_PROFILE_SET}="usb-gaming-headset.conf" +# ID 1532:0520 is for the Razer Kraken Tournament Edition +ATTRS{idVendor}=="1532", ATTRS{idProduct}=="0520", ENV{PULSE_PROFILE_SET}="usb-gaming-headset.conf" + + +# ID 1038:1250 is for the Arctis 5 +# ID 1037:12aa is for the Arctis 5 2019 +# ID 1038:1252 is for the Arctis Pro 2019 edition +ATTRS{idVendor}=="1038", ATTRS{idProduct}=="1250", ENV{PULSE_PROFILE_SET}="steelseries-arctis-common-usb-audio.conf" +ATTRS{idVendor}=="1038", ATTRS{idProduct}=="12aa", ENV{PULSE_PROFILE_SET}="steelseries-arctis-common-usb-audio.conf" +ATTRS{idVendor}=="1038", ATTRS{idProduct}=="1252", ENV{PULSE_PROFILE_SET}="steelseries-arctis-common-usb-audio.conf" + +ATTRS{idVendor}=="147a", ATTRS{idProduct}=="e055", ENV{PULSE_PROFILE_SET}="cmedia-high-speed-true-hdaudio.conf" + +# HyperX Cloud Orbit S has three modes. Each mode has a separate product ID. +# ID_SERIAL for this device is the device name + mode repeated three times. +# ID_SERIAL is used for the ID_ID property, and the ID_ID property is used in +# the card name in PulseAudio. The resulting card name is too long for the name +# length limit, so we set a more sensible ID_ID here (the same as the default +# ID_ID, but without repetition in the serial part). +ATTRS{idVendor}=="0951", ATTRS{idProduct}=="16ff", ENV{ID_ID}="usb-HyperX_Cloud_Orbit_S_2Ch-$env{ID_USB_INTERFACE_NUM}" +ATTRS{idVendor}=="0951", ATTRS{idProduct}=="1702", ENV{ID_ID}="usb-HyperX_Cloud_Orbit_S_Hi-Res_2Ch-$env{ID_USB_INTERFACE_NUM}" +ATTRS{idVendor}=="0951", ATTRS{idProduct}=="1703", ENV{ID_ID}="usb-HyperX_Cloud_Orbit_S_3D_8Ch-$env{ID_USB_INTERFACE_NUM}" + +GOTO="pulseaudio_end" + +LABEL="pulseaudio_check_pci" + +# Creative SoundBlaster Audigy-based cards +# EMU10k2/CA0100/CA0102/CA10200 +ATTRS{vendor}=="0x1102", ATTRS{device}=="0x0004", ENV{PULSE_PROFILE_SET}="audigy.conf" +# CA0108/CA10300 +ATTRS{vendor}=="0x1102", ATTRS{device}=="0x0008", ENV{PULSE_PROFILE_SET}="audigy.conf" + +GOTO="pulseaudio_end" + +LABEL="pulseaudio_firewire_quirk" + +# Focusrite Saffire Pro 10/26 i/o has a quirk to disappear from IEEE 1394 bus when losing connections. +# https://bugzilla.kernel.org/show_bug.cgi?id=199365 +ENV{ID_VENDOR_ID}=="0x00130e", ENV{ID_MODEL_ID}=="0x000003", ENV{PULSE_IGNORE}="1" +# Both of Saffire Pro 10 i/o and Liquid Saffire 56 have the same ID_MODEL_ID +# (0x000006), but Liquid Saffire 56 doesn't suffer from the problem, so we +# can't use ID_MODEL_ID to identify the problematic card. ID_MODEL works +# better here. +ENV{ID_VENDOR_ID}=="0x00130e", ENV{ID_MODEL}=="Pro10IO" ENV{PULSE_IGNORE}="1" + +LABEL="pulseaudio_end" diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c new file mode 100644 index 0000000..e494a12 --- /dev/null +++ b/src/modules/alsa/alsa-mixer.c @@ -0,0 +1,5386 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2009 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#ifdef HAVE_VALGRIND_MEMCHECK_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "alsa-mixer.h" +#include "alsa-util.h" + +#ifdef HAVE_VALGRIND_MEMCHECK_H +/* These macros are workarounds for a bug in valgrind, which is not handling the + * ALSA TLV syscalls correctly. See + * http://valgrind.10908.n7.nabble.com/Missing-ioctl-for-SNDRV-CTL-IOCTL-TLV-READ-td42711.html */ + +static inline int vgfix_get_capture_dB(snd_mixer_elem_t *a, snd_mixer_selem_channel_id_t b, long *c) { + int r = snd_mixer_selem_get_capture_dB(a, b, c); + VALGRIND_MAKE_MEM_DEFINED(c, sizeof(*c)); + return r; +} + +static inline int vgfix_get_playback_dB(snd_mixer_elem_t *a, snd_mixer_selem_channel_id_t b, long *c) { + int r = snd_mixer_selem_get_playback_dB(a, b, c); + VALGRIND_MAKE_MEM_DEFINED(c, sizeof(*c)); + return r; +} + +static inline int vgfix_ask_capture_vol_dB(snd_mixer_elem_t *a, long b, long *c) { + int r = snd_mixer_selem_ask_capture_vol_dB(a, b, c); + VALGRIND_MAKE_MEM_DEFINED(c, sizeof(*c)); + return r; +} + +static inline int vgfix_ask_playback_vol_dB(snd_mixer_elem_t *a, long b, long *c) { + int r = snd_mixer_selem_ask_playback_vol_dB(a, b, c); + VALGRIND_MAKE_MEM_DEFINED(c, sizeof(*c)); + return r; +} + +static inline int vgfix_get_capture_dB_range(snd_mixer_elem_t *a, long *b, long *c) { + int r = snd_mixer_selem_get_capture_dB_range(a, b, c); + VALGRIND_MAKE_MEM_DEFINED(b, sizeof(*b)); + VALGRIND_MAKE_MEM_DEFINED(c, sizeof(*c)); + return r; +} + +static inline int vgfix_get_playback_dB_range(snd_mixer_elem_t *a, long *b, long *c) { + int r = snd_mixer_selem_get_playback_dB_range(a, b, c); + VALGRIND_MAKE_MEM_DEFINED(b, sizeof(*b)); + VALGRIND_MAKE_MEM_DEFINED(c, sizeof(*c)); + return r; +} + +#define snd_mixer_selem_get_capture_dB(a, b, c) vgfix_get_capture_dB(a, b, c) +#define snd_mixer_selem_get_playback_dB(a, b, c) vgfix_get_playback_dB(a, b, c) +#define snd_mixer_selem_ask_capture_vol_dB(a, b, c) vgfix_ask_capture_vol_dB(a, b, c) +#define snd_mixer_selem_ask_playback_vol_dB(a, b, c) vgfix_ask_playback_vol_dB(a, b, c) +#define snd_mixer_selem_get_capture_dB_range(a, b, c) vgfix_get_capture_dB_range(a, b, c) +#define snd_mixer_selem_get_playback_dB_range(a, b, c) vgfix_get_playback_dB_range(a, b, c) + +#endif + +static int setting_select(pa_alsa_setting *s, snd_mixer_t *m); + +struct description_map { + const char *key; + const char *description; +}; + +struct description2_map { + const char *key; + const char *description; + pa_device_port_type_t type; +}; + +char *pa_alsa_mixer_id_to_string(char *dst, size_t dst_len, pa_alsa_mixer_id *id) { + if (id->index > 0) { + snprintf(dst, dst_len, "'%s',%d", id->name, id->index); + } else { + snprintf(dst, dst_len, "'%s'", id->name); + } + return dst; +} + +static int alsa_id_decode(const char *src, char *name, int *index) { + char *idx, c; + int i; + + *index = 0; + c = src[0]; + /* Strip quotes in entries such as 'Speaker',1 or "Speaker",1 */ + if (c == '\'' || c == '"') { + strcpy(name, src + 1); + for (i = 0; name[i] != '\0' && name[i] != c; i++); + idx = NULL; + if (name[i]) { + name[i] = '\0'; + idx = strchr(name + i + 1, ','); + } + } else { + strcpy(name, src); + idx = strchr(name, ','); + } + if (idx == NULL) + return 0; + *idx = '\0'; + idx++; + if (*idx < '0' || *idx > '9') { + pa_log("Element %s: index value is invalid", src); + return 1; + } + *index = atoi(idx); + return 0; +} + +pa_alsa_jack *pa_alsa_jack_new(pa_alsa_path *path, const char *mixer_device_name, const char *name, int index) { + pa_alsa_jack *jack; + + pa_assert(name); + + jack = pa_xnew0(pa_alsa_jack, 1); + jack->path = path; + jack->mixer_device_name = pa_xstrdup(mixer_device_name); + jack->name = pa_xstrdup(name); + jack->alsa_id.name = pa_sprintf_malloc("%s Jack", name); + jack->alsa_id.index = index; + jack->state_unplugged = PA_AVAILABLE_NO; + jack->state_plugged = PA_AVAILABLE_YES; + jack->ucm_devices = pa_dynarray_new(NULL); + jack->ucm_hw_mute_devices = pa_dynarray_new(NULL); + + return jack; +} + +void pa_alsa_jack_free(pa_alsa_jack *jack) { + pa_assert(jack); + + pa_dynarray_free(jack->ucm_hw_mute_devices); + pa_dynarray_free(jack->ucm_devices); + + pa_xfree(jack->alsa_id.name); + pa_xfree(jack->name); + pa_xfree(jack->mixer_device_name); + pa_xfree(jack); +} + +void pa_alsa_jack_set_has_control(pa_alsa_jack *jack, bool has_control) { + pa_alsa_ucm_device *device; + unsigned idx; + + pa_assert(jack); + + if (has_control == jack->has_control) + return; + + jack->has_control = has_control; + + PA_DYNARRAY_FOREACH(device, jack->ucm_hw_mute_devices, idx) + pa_alsa_ucm_device_update_available(device); + + PA_DYNARRAY_FOREACH(device, jack->ucm_devices, idx) + pa_alsa_ucm_device_update_available(device); +} + +void pa_alsa_jack_set_plugged_in(pa_alsa_jack *jack, bool plugged_in) { + pa_alsa_ucm_device *device; + unsigned idx; + + pa_assert(jack); + + if (plugged_in == jack->plugged_in) + return; + + jack->plugged_in = plugged_in; + + /* XXX: If this is a headphone jack that mutes speakers when plugged in, + * and the headphones get unplugged, then the headphone device must be set + * to unavailable and the speaker device must be set to unknown. So far so + * good. But there's an ugly detail: we must first set the availability of + * the speakers and then the headphones. We shouldn't need to care about + * the order, but we have to, because module-switch-on-port-available gets + * separate events for the two devices, and the intermediate state between + * the two events is such that the second event doesn't trigger the desired + * port switch, if the event order is "wrong". + * + * These are the transitions when the event order is "right": + * + * speakers: 1) unavailable -> 2) unknown -> 3) unknown + * headphones: 1) available -> 2) available -> 3) unavailable + * + * In the 2 -> 3 transition, headphones become unavailable, and + * module-switch-on-port-available sees that speakers can be used, so the + * port gets changed as it should. + * + * These are the transitions when the event order is "wrong": + * + * speakers: 1) unavailable -> 2) unavailable -> 3) unknown + * headphones: 1) available -> 2) unavailable -> 3) unavailable + * + * In the 1 -> 2 transition, headphones become unavailable, and there are + * no available ports to use, so no port change happens. In the 2 -> 3 + * transition, speaker availability becomes unknown, but that's not + * a strong enough signal for module-switch-on-port-available, so it still + * doesn't do the port switch. + * + * We should somehow merge the two events so that + * module-switch-on-port-available would handle both transitions in one go. + * If module-switch-on-port-available used a defer event to delay + * the port availability processing, that would probably do the trick. */ + + PA_DYNARRAY_FOREACH(device, jack->ucm_hw_mute_devices, idx) + pa_alsa_ucm_device_update_available(device); + + PA_DYNARRAY_FOREACH(device, jack->ucm_devices, idx) + pa_alsa_ucm_device_update_available(device); +} + +void pa_alsa_jack_add_ucm_device(pa_alsa_jack *jack, pa_alsa_ucm_device *device) { + pa_alsa_ucm_device *idevice; + unsigned idx, prio, iprio; + + pa_assert(jack); + pa_assert(device); + + /* store the ucm device with the sequence of priority from low to high. this + * could guarantee when the jack state is changed, the device with highest + * priority will send to the module-switch-on-port-available last */ + prio = device->playback_priority ? device->playback_priority : device->capture_priority; + + PA_DYNARRAY_FOREACH(idevice, jack->ucm_devices, idx) { + iprio = idevice->playback_priority ? idevice->playback_priority : idevice->capture_priority; + if (iprio > prio) + break; + } + pa_dynarray_insert_by_index(jack->ucm_devices, device, idx); +} + +void pa_alsa_jack_add_ucm_hw_mute_device(pa_alsa_jack *jack, pa_alsa_ucm_device *device) { + pa_assert(jack); + pa_assert(device); + + pa_dynarray_append(jack->ucm_hw_mute_devices, device); +} + +static const char *lookup_description(const char *key, const struct description_map dm[], unsigned n) { + unsigned i; + + if (!key) + return NULL; + + for (i = 0; i < n; i++) + if (pa_streq(dm[i].key, key)) + return _(dm[i].description); + + return NULL; +} + +static const struct description2_map *lookup_description2(const char *key, const struct description2_map dm[], unsigned n) { + unsigned i; + + if (!key) + return NULL; + + for (i = 0; i < n; i++) + if (pa_streq(dm[i].key, key)) + return &dm[i]; + + return NULL; +} + +struct pa_alsa_fdlist { + unsigned num_fds; + struct pollfd *fds; + /* This is a temporary buffer used to avoid lots of mallocs */ + struct pollfd *work_fds; + + snd_mixer_t *mixer; + snd_hctl_t *hctl; + + pa_mainloop_api *m; + pa_defer_event *defer; + pa_io_event **ios; + + bool polled; + + void (*cb)(void *userdata); + void *userdata; +}; + +static void io_cb(pa_mainloop_api *a, pa_io_event *e, int fd, pa_io_event_flags_t events, void *userdata) { + + struct pa_alsa_fdlist *fdl = userdata; + int err; + unsigned i; + unsigned short revents; + + pa_assert(a); + pa_assert(fdl); + pa_assert(fdl->mixer || fdl->hctl); + pa_assert(fdl->fds); + pa_assert(fdl->work_fds); + + if (fdl->polled) + return; + + fdl->polled = true; + + memcpy(fdl->work_fds, fdl->fds, sizeof(struct pollfd) * fdl->num_fds); + + for (i = 0; i < fdl->num_fds; i++) { + if (e == fdl->ios[i]) { + if (events & PA_IO_EVENT_INPUT) + fdl->work_fds[i].revents |= POLLIN; + if (events & PA_IO_EVENT_OUTPUT) + fdl->work_fds[i].revents |= POLLOUT; + if (events & PA_IO_EVENT_ERROR) + fdl->work_fds[i].revents |= POLLERR; + if (events & PA_IO_EVENT_HANGUP) + fdl->work_fds[i].revents |= POLLHUP; + break; + } + } + + pa_assert(i != fdl->num_fds); + + if (fdl->hctl) + err = snd_hctl_poll_descriptors_revents(fdl->hctl, fdl->work_fds, fdl->num_fds, &revents); + else + err = snd_mixer_poll_descriptors_revents(fdl->mixer, fdl->work_fds, fdl->num_fds, &revents); + + if (err < 0) { + pa_log_error("Unable to get poll revent: %s", pa_alsa_strerror(err)); + return; + } + + a->defer_enable(fdl->defer, 1); + + if (revents) { + if (fdl->hctl) + snd_hctl_handle_events(fdl->hctl); + else + snd_mixer_handle_events(fdl->mixer); + } +} + +static void defer_cb(pa_mainloop_api *a, pa_defer_event *e, void *userdata) { + struct pa_alsa_fdlist *fdl = userdata; + unsigned num_fds, i; + int err, n; + struct pollfd *temp; + + pa_assert(a); + pa_assert(fdl); + pa_assert(fdl->mixer || fdl->hctl); + + a->defer_enable(fdl->defer, 0); + + if (fdl->hctl) + n = snd_hctl_poll_descriptors_count(fdl->hctl); + else + n = snd_mixer_poll_descriptors_count(fdl->mixer); + + if (n < 0) { + pa_log("snd_mixer_poll_descriptors_count() failed: %s", pa_alsa_strerror(n)); + return; + } + else if (n == 0) { + pa_log_warn("Mixer has no poll descriptors. Please control mixer from PulseAudio only."); + return; + } + num_fds = (unsigned) n; + + if (num_fds != fdl->num_fds) { + if (fdl->fds) + pa_xfree(fdl->fds); + if (fdl->work_fds) + pa_xfree(fdl->work_fds); + fdl->fds = pa_xnew0(struct pollfd, num_fds); + fdl->work_fds = pa_xnew(struct pollfd, num_fds); + } + + memset(fdl->work_fds, 0, sizeof(struct pollfd) * num_fds); + + if (fdl->hctl) + err = snd_hctl_poll_descriptors(fdl->hctl, fdl->work_fds, num_fds); + else + err = snd_mixer_poll_descriptors(fdl->mixer, fdl->work_fds, num_fds); + + if (err < 0) { + pa_log_error("Unable to get poll descriptors: %s", pa_alsa_strerror(err)); + return; + } + + fdl->polled = false; + + if (memcmp(fdl->fds, fdl->work_fds, sizeof(struct pollfd) * num_fds) == 0) + return; + + if (fdl->ios) { + for (i = 0; i < fdl->num_fds; i++) + a->io_free(fdl->ios[i]); + + if (num_fds != fdl->num_fds) { + pa_xfree(fdl->ios); + fdl->ios = NULL; + } + } + + if (!fdl->ios) + fdl->ios = pa_xnew(pa_io_event*, num_fds); + + /* Swap pointers */ + temp = fdl->work_fds; + fdl->work_fds = fdl->fds; + fdl->fds = temp; + + fdl->num_fds = num_fds; + + for (i = 0;i < num_fds;i++) + fdl->ios[i] = a->io_new(a, fdl->fds[i].fd, + ((fdl->fds[i].events & POLLIN) ? PA_IO_EVENT_INPUT : 0) | + ((fdl->fds[i].events & POLLOUT) ? PA_IO_EVENT_OUTPUT : 0), + io_cb, fdl); +} + +struct pa_alsa_fdlist *pa_alsa_fdlist_new(void) { + struct pa_alsa_fdlist *fdl; + + fdl = pa_xnew0(struct pa_alsa_fdlist, 1); + + return fdl; +} + +void pa_alsa_fdlist_free(struct pa_alsa_fdlist *fdl) { + pa_assert(fdl); + + if (fdl->defer) { + pa_assert(fdl->m); + fdl->m->defer_free(fdl->defer); + } + + if (fdl->ios) { + unsigned i; + pa_assert(fdl->m); + for (i = 0; i < fdl->num_fds; i++) + fdl->m->io_free(fdl->ios[i]); + pa_xfree(fdl->ios); + } + + if (fdl->fds) + pa_xfree(fdl->fds); + if (fdl->work_fds) + pa_xfree(fdl->work_fds); + + pa_xfree(fdl); +} + +/* We can listen to either a snd_hctl_t or a snd_mixer_t, but not both */ +int pa_alsa_fdlist_set_handle(struct pa_alsa_fdlist *fdl, snd_mixer_t *mixer_handle, snd_hctl_t *hctl_handle, pa_mainloop_api *m) { + pa_assert(fdl); + pa_assert(hctl_handle || mixer_handle); + pa_assert(!(hctl_handle && mixer_handle)); + pa_assert(m); + pa_assert(!fdl->m); + + fdl->hctl = hctl_handle; + fdl->mixer = mixer_handle; + fdl->m = m; + fdl->defer = m->defer_new(m, defer_cb, fdl); + + return 0; +} + +struct pa_alsa_mixer_pdata { + pa_rtpoll *rtpoll; + pa_rtpoll_item *poll_item; + snd_mixer_t *mixer; +}; + +struct pa_alsa_mixer_pdata *pa_alsa_mixer_pdata_new(void) { + struct pa_alsa_mixer_pdata *pd; + + pd = pa_xnew0(struct pa_alsa_mixer_pdata, 1); + + return pd; +} + +void pa_alsa_mixer_pdata_free(struct pa_alsa_mixer_pdata *pd) { + pa_assert(pd); + + if (pd->poll_item) { + pa_rtpoll_item_free(pd->poll_item); + } + + pa_xfree(pd); +} + +static int rtpoll_work_cb(pa_rtpoll_item *i) { + struct pa_alsa_mixer_pdata *pd; + struct pollfd *p; + unsigned n_fds; + unsigned short revents = 0; + int err, ret = 0; + + pd = pa_rtpoll_item_get_work_userdata(i); + pa_assert_fp(pd); + pa_assert_fp(i == pd->poll_item); + + p = pa_rtpoll_item_get_pollfd(i, &n_fds); + + if ((err = snd_mixer_poll_descriptors_revents(pd->mixer, p, n_fds, &revents)) < 0) { + pa_log_error("Unable to get poll revent: %s", pa_alsa_strerror(err)); + ret = -1; + goto fail; + } + + if (revents) { + if (revents & (POLLNVAL | POLLERR)) { + pa_log_debug("Device disconnected, stopping poll on mixer"); + goto fail; + } else if (revents & POLLERR) { + /* This shouldn't happen. */ + pa_log_error("Got a POLLERR (revents = %04x), stopping poll on mixer", revents); + goto fail; + } + + err = snd_mixer_handle_events(pd->mixer); + + if (PA_LIKELY(err >= 0)) { + pa_rtpoll_item_free(i); + pa_alsa_set_mixer_rtpoll(pd, pd->mixer, pd->rtpoll); + } else { + pa_log_error("Error handling mixer event: %s", pa_alsa_strerror(err)); + ret = -1; + goto fail; + } + } + + return ret; + +fail: + pa_rtpoll_item_free(i); + + pd->poll_item = NULL; + pd->rtpoll = NULL; + pd->mixer = NULL; + + return ret; +} + +int pa_alsa_set_mixer_rtpoll(struct pa_alsa_mixer_pdata *pd, snd_mixer_t *mixer, pa_rtpoll *rtp) { + pa_rtpoll_item *i; + struct pollfd *p; + int err, n; + + pa_assert(pd); + pa_assert(mixer); + pa_assert(rtp); + + if ((n = snd_mixer_poll_descriptors_count(mixer)) < 0) { + pa_log("snd_mixer_poll_descriptors_count() failed: %s", pa_alsa_strerror(n)); + return -1; + } + else if (n == 0) { + pa_log_warn("Mixer has no poll descriptors. Please control mixer from PulseAudio only."); + return 0; + } + + i = pa_rtpoll_item_new(rtp, PA_RTPOLL_LATE, (unsigned) n); + + p = pa_rtpoll_item_get_pollfd(i, NULL); + + memset(p, 0, sizeof(struct pollfd) * n); + + if ((err = snd_mixer_poll_descriptors(mixer, p, (unsigned) n)) < 0) { + pa_log_error("Unable to get poll descriptors: %s", pa_alsa_strerror(err)); + pa_rtpoll_item_free(i); + return -1; + } + + pd->rtpoll = rtp; + pd->poll_item = i; + pd->mixer = mixer; + + pa_rtpoll_item_set_work_callback(i, rtpoll_work_cb, pd); + + return 0; +} + +static const snd_mixer_selem_channel_id_t alsa_channel_ids[PA_CHANNEL_POSITION_MAX] = { + [PA_CHANNEL_POSITION_MONO] = SND_MIXER_SCHN_MONO, /* The ALSA name is just an alias! */ + + [PA_CHANNEL_POSITION_FRONT_CENTER] = SND_MIXER_SCHN_FRONT_CENTER, + [PA_CHANNEL_POSITION_FRONT_LEFT] = SND_MIXER_SCHN_FRONT_LEFT, + [PA_CHANNEL_POSITION_FRONT_RIGHT] = SND_MIXER_SCHN_FRONT_RIGHT, + + [PA_CHANNEL_POSITION_REAR_CENTER] = SND_MIXER_SCHN_REAR_CENTER, + [PA_CHANNEL_POSITION_REAR_LEFT] = SND_MIXER_SCHN_REAR_LEFT, + [PA_CHANNEL_POSITION_REAR_RIGHT] = SND_MIXER_SCHN_REAR_RIGHT, + + [PA_CHANNEL_POSITION_LFE] = SND_MIXER_SCHN_WOOFER, + + [PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER] = SND_MIXER_SCHN_UNKNOWN, + + [PA_CHANNEL_POSITION_SIDE_LEFT] = SND_MIXER_SCHN_SIDE_LEFT, + [PA_CHANNEL_POSITION_SIDE_RIGHT] = SND_MIXER_SCHN_SIDE_RIGHT, + + [PA_CHANNEL_POSITION_AUX0] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX1] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX2] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX3] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX4] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX5] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX6] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX7] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX8] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX9] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX10] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX11] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX12] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX13] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX14] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX15] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX16] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX17] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX18] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX19] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX20] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX21] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX22] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX23] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX24] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX25] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX26] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX27] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX28] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX29] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX30] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_AUX31] = SND_MIXER_SCHN_UNKNOWN, + + [PA_CHANNEL_POSITION_TOP_CENTER] = SND_MIXER_SCHN_UNKNOWN, + + [PA_CHANNEL_POSITION_TOP_FRONT_CENTER] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_TOP_FRONT_LEFT] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_TOP_FRONT_RIGHT] = SND_MIXER_SCHN_UNKNOWN, + + [PA_CHANNEL_POSITION_TOP_REAR_CENTER] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_TOP_REAR_LEFT] = SND_MIXER_SCHN_UNKNOWN, + [PA_CHANNEL_POSITION_TOP_REAR_RIGHT] = SND_MIXER_SCHN_UNKNOWN +}; + +static snd_mixer_selem_channel_id_t alsa_channel_positions[POSITION_MASK_CHANNELS] = { + SND_MIXER_SCHN_FRONT_LEFT, + SND_MIXER_SCHN_FRONT_RIGHT, + SND_MIXER_SCHN_REAR_LEFT, + SND_MIXER_SCHN_REAR_RIGHT, + SND_MIXER_SCHN_FRONT_CENTER, + SND_MIXER_SCHN_WOOFER, + SND_MIXER_SCHN_SIDE_LEFT, + SND_MIXER_SCHN_SIDE_RIGHT, +#if POSITION_MASK_CHANNELS > 8 +#error "Extend alsa_channel_positions[] array (9+)" +#endif +}; + +static void setting_free(pa_alsa_setting *s) { + pa_assert(s); + + if (s->options) + pa_idxset_free(s->options, NULL); + + pa_xfree(s->name); + pa_xfree(s->description); + pa_xfree(s); +} + +static void option_free(pa_alsa_option *o) { + pa_assert(o); + + pa_xfree(o->alsa_name); + pa_xfree(o->name); + pa_xfree(o->description); + pa_xfree(o); +} + +static void decibel_fix_free(pa_alsa_decibel_fix *db_fix) { + pa_assert(db_fix); + + pa_xfree(db_fix->name); + pa_xfree(db_fix->db_values); + + pa_xfree(db_fix->key); + pa_xfree(db_fix); +} + +static void element_free(pa_alsa_element *e) { + pa_alsa_option *o; + pa_assert(e); + + while ((o = e->options)) { + PA_LLIST_REMOVE(pa_alsa_option, e->options, o); + option_free(o); + } + + if (e->db_fix) + decibel_fix_free(e->db_fix); + + pa_xfree(e->alsa_id.name); + pa_xfree(e); +} + +void pa_alsa_path_free(pa_alsa_path *p) { + pa_alsa_jack *j; + pa_alsa_element *e; + pa_alsa_setting *s; + + pa_assert(p); + + while ((j = p->jacks)) { + PA_LLIST_REMOVE(pa_alsa_jack, p->jacks, j); + pa_alsa_jack_free(j); + } + + while ((e = p->elements)) { + PA_LLIST_REMOVE(pa_alsa_element, p->elements, e); + element_free(e); + } + + while ((s = p->settings)) { + PA_LLIST_REMOVE(pa_alsa_setting, p->settings, s); + setting_free(s); + } + + pa_proplist_free(p->proplist); + pa_xfree(p->availability_group); + pa_xfree(p->name); + pa_xfree(p->description); + pa_xfree(p->description_key); + pa_xfree(p); +} + +void pa_alsa_path_set_free(pa_alsa_path_set *ps) { + pa_assert(ps); + + if (ps->paths) + pa_hashmap_free(ps->paths); + + pa_xfree(ps); +} + +int pa_alsa_path_set_is_empty(pa_alsa_path_set *ps) { + if (ps && !pa_hashmap_isempty(ps->paths)) + return 0; + return 1; +} + +static long to_alsa_dB(pa_volume_t v) { + return lround(pa_sw_volume_to_dB(v) * 100.0); +} + +static pa_volume_t from_alsa_dB(long v) { + return pa_sw_volume_from_dB((double) v / 100.0); +} + +static long to_alsa_volume(pa_volume_t v, long min, long max) { + long w; + + w = (long) round(((double) v * (double) (max - min)) / PA_VOLUME_NORM) + min; + return PA_CLAMP_UNLIKELY(w, min, max); +} + +static pa_volume_t from_alsa_volume(long v, long min, long max) { + return (pa_volume_t) round(((double) (v - min) * PA_VOLUME_NORM) / (double) (max - min)); +} + +#define SELEM_INIT(sid, aid) \ + do { \ + snd_mixer_selem_id_alloca(&(sid)); \ + snd_mixer_selem_id_set_name((sid), (aid)->name); \ + snd_mixer_selem_id_set_index((sid), (aid)->index); \ + } while(false) + +static int element_get_volume(pa_alsa_element *e, snd_mixer_t *m, const pa_channel_map *cm, pa_cvolume *v) { + snd_mixer_selem_id_t *sid; + snd_mixer_elem_t *me; + snd_mixer_selem_channel_id_t c; + pa_channel_position_mask_t mask = 0; + char buf[64]; + unsigned k; + + pa_assert(m); + pa_assert(e); + pa_assert(cm); + pa_assert(v); + + SELEM_INIT(sid, &e->alsa_id); + if (!(me = snd_mixer_find_selem(m, sid))) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_warn("Element %s seems to have disappeared.", buf); + return -1; + } + + pa_cvolume_mute(v, cm->channels); + + /* We take the highest volume of all channels that match */ + + for (c = 0; c <= SND_MIXER_SCHN_LAST; c++) { + int r; + pa_volume_t f; + + if (e->has_dB) { + long value = 0; + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) { + if (snd_mixer_selem_has_playback_channel(me, c)) { + if (e->db_fix) { + if ((r = snd_mixer_selem_get_playback_volume(me, c, &value)) >= 0) { + /* If the channel volume is outside the limits set + * by the dB fix, we clamp the hw volume to be + * within the limits. */ + if (value < e->db_fix->min_step) { + value = e->db_fix->min_step; + snd_mixer_selem_set_playback_volume(me, c, value); + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_debug("Playback volume for element %s channel %i was below the dB fix limit. " + "Volume reset to %0.2f dB.", buf, c, + e->db_fix->db_values[value - e->db_fix->min_step] / 100.0); + } else if (value > e->db_fix->max_step) { + value = e->db_fix->max_step; + snd_mixer_selem_set_playback_volume(me, c, value); + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_debug("Playback volume for element %s channel %i was over the dB fix limit. " + "Volume reset to %0.2f dB.", buf, c, + e->db_fix->db_values[value - e->db_fix->min_step] / 100.0); + } + + /* Volume step -> dB value conversion. */ + value = e->db_fix->db_values[value - e->db_fix->min_step]; + } + } else + r = snd_mixer_selem_get_playback_dB(me, c, &value); + } else + r = -1; + } else { + if (snd_mixer_selem_has_capture_channel(me, c)) { + if (e->db_fix) { + if ((r = snd_mixer_selem_get_capture_volume(me, c, &value)) >= 0) { + /* If the channel volume is outside the limits set + * by the dB fix, we clamp the hw volume to be + * within the limits. */ + if (value < e->db_fix->min_step) { + value = e->db_fix->min_step; + snd_mixer_selem_set_capture_volume(me, c, value); + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_debug("Capture volume for element %s channel %i was below the dB fix limit. " + "Volume reset to %0.2f dB.", buf, c, + e->db_fix->db_values[value - e->db_fix->min_step] / 100.0); + } else if (value > e->db_fix->max_step) { + value = e->db_fix->max_step; + snd_mixer_selem_set_capture_volume(me, c, value); + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_debug("Capture volume for element %s channel %i was over the dB fix limit. " + "Volume reset to %0.2f dB.", buf, c, + e->db_fix->db_values[value - e->db_fix->min_step] / 100.0); + } + + /* Volume step -> dB value conversion. */ + value = e->db_fix->db_values[value - e->db_fix->min_step]; + } + } else + r = snd_mixer_selem_get_capture_dB(me, c, &value); + } else + r = -1; + } + + if (r < 0) + continue; + +#ifdef HAVE_VALGRIND_MEMCHECK_H + VALGRIND_MAKE_MEM_DEFINED(&value, sizeof(value)); +#endif + + f = from_alsa_dB(value); + + } else { + long value = 0; + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) { + if (snd_mixer_selem_has_playback_channel(me, c)) + r = snd_mixer_selem_get_playback_volume(me, c, &value); + else + r = -1; + } else { + if (snd_mixer_selem_has_capture_channel(me, c)) + r = snd_mixer_selem_get_capture_volume(me, c, &value); + else + r = -1; + } + + if (r < 0) + continue; + + f = from_alsa_volume(value, e->min_volume, e->max_volume); + } + + for (k = 0; k < cm->channels; k++) + if (e->masks[c][e->n_channels-1] & PA_CHANNEL_POSITION_MASK(cm->map[k])) + if (v->values[k] < f) + v->values[k] = f; + + mask |= e->masks[c][e->n_channels-1]; + } + + for (k = 0; k < cm->channels; k++) + if (!(mask & PA_CHANNEL_POSITION_MASK(cm->map[k]))) + v->values[k] = PA_VOLUME_NORM; + + return 0; +} + +int pa_alsa_path_get_volume(pa_alsa_path *p, snd_mixer_t *m, const pa_channel_map *cm, pa_cvolume *v) { + pa_alsa_element *e; + + pa_assert(m); + pa_assert(p); + pa_assert(cm); + pa_assert(v); + + if (!p->has_volume) + return -1; + + pa_cvolume_reset(v, cm->channels); + + PA_LLIST_FOREACH(e, p->elements) { + pa_cvolume ev; + + if (e->volume_use != PA_ALSA_VOLUME_MERGE) + continue; + + pa_assert(!p->has_dB || e->has_dB); + + if (element_get_volume(e, m, cm, &ev) < 0) + return -1; + + /* If we have no dB information all we can do is take the first element and leave */ + if (!p->has_dB) { + *v = ev; + return 0; + } + + pa_sw_cvolume_multiply(v, v, &ev); + } + + return 0; +} + +static int element_get_switch(pa_alsa_element *e, snd_mixer_t *m, bool *b) { + snd_mixer_selem_id_t *sid; + snd_mixer_elem_t *me; + snd_mixer_selem_channel_id_t c; + char buf[64]; + + pa_assert(m); + pa_assert(e); + pa_assert(b); + + SELEM_INIT(sid, &e->alsa_id); + if (!(me = snd_mixer_find_selem(m, sid))) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_warn("Element %s seems to have disappeared.", buf); + return -1; + } + + /* We return muted if at least one channel is muted */ + + for (c = 0; c <= SND_MIXER_SCHN_LAST; c++) { + int r; + int value = 0; + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) { + if (snd_mixer_selem_has_playback_channel(me, c)) + r = snd_mixer_selem_get_playback_switch(me, c, &value); + else + r = -1; + } else { + if (snd_mixer_selem_has_capture_channel(me, c)) + r = snd_mixer_selem_get_capture_switch(me, c, &value); + else + r = -1; + } + + if (r < 0) + continue; + + if (!value) { + *b = false; + return 0; + } + } + + *b = true; + return 0; +} + +int pa_alsa_path_get_mute(pa_alsa_path *p, snd_mixer_t *m, bool *muted) { + pa_alsa_element *e; + + pa_assert(m); + pa_assert(p); + pa_assert(muted); + + if (!p->has_mute) + return -1; + + PA_LLIST_FOREACH(e, p->elements) { + bool b; + + if (e->switch_use != PA_ALSA_SWITCH_MUTE) + continue; + + if (element_get_switch(e, m, &b) < 0) + return -1; + + if (!b) { + *muted = true; + return 0; + } + } + + *muted = false; + return 0; +} + +/* Finds the closest item in db_fix->db_values and returns the corresponding + * step. *db_value is replaced with the value from the db_values table. + * Rounding is done based on the rounding parameter: -1 means rounding down and + * +1 means rounding up. */ +static long decibel_fix_get_step(pa_alsa_decibel_fix *db_fix, long *db_value, int rounding) { + unsigned i = 0; + unsigned max_i = 0; + + pa_assert(db_fix); + pa_assert(db_value); + pa_assert(rounding != 0); + + max_i = db_fix->max_step - db_fix->min_step; + + if (rounding > 0) { + for (i = 0; i < max_i; i++) { + if (db_fix->db_values[i] >= *db_value) + break; + } + } else { + for (i = 0; i < max_i; i++) { + if (db_fix->db_values[i + 1] > *db_value) + break; + } + } + + *db_value = db_fix->db_values[i]; + + return i + db_fix->min_step; +} + +/* Alsa lib documentation says for snd_mixer_selem_set_playback_dB() direction argument, + * that "-1 = accurate or first below, 0 = accurate, 1 = accurate or first above". + * But even with accurate nearest dB volume step is not selected, so that is why we need + * this function. Returns 0 and nearest selectable volume in *value_dB on success or + * negative error code if fails. */ +static int element_get_nearest_alsa_dB(snd_mixer_elem_t *me, snd_mixer_selem_channel_id_t c, pa_alsa_direction_t d, long *value_dB) { + + long alsa_val; + long value_high; + long value_low; + int r = -1; + + pa_assert(me); + pa_assert(value_dB); + + if (d == PA_ALSA_DIRECTION_OUTPUT) { + if ((r = snd_mixer_selem_ask_playback_dB_vol(me, *value_dB, +1, &alsa_val)) >= 0) + r = snd_mixer_selem_ask_playback_vol_dB(me, alsa_val, &value_high); + + if (r < 0) + return r; + + if (value_high == *value_dB) + return r; + + if ((r = snd_mixer_selem_ask_playback_dB_vol(me, *value_dB, -1, &alsa_val)) >= 0) + r = snd_mixer_selem_ask_playback_vol_dB(me, alsa_val, &value_low); + } else { + if ((r = snd_mixer_selem_ask_capture_dB_vol(me, *value_dB, +1, &alsa_val)) >= 0) + r = snd_mixer_selem_ask_capture_vol_dB(me, alsa_val, &value_high); + + if (r < 0) + return r; + + if (value_high == *value_dB) + return r; + + if ((r = snd_mixer_selem_ask_capture_dB_vol(me, *value_dB, -1, &alsa_val)) >= 0) + r = snd_mixer_selem_ask_capture_vol_dB(me, alsa_val, &value_low); + } + + if (r < 0) + return r; + + if (labs(value_high - *value_dB) < labs(value_low - *value_dB)) + *value_dB = value_high; + else + *value_dB = value_low; + + return r; +} + +static int element_set_volume(pa_alsa_element *e, snd_mixer_t *m, const pa_channel_map *cm, pa_cvolume *v, bool deferred_volume, bool write_to_hw) { + + snd_mixer_selem_id_t *sid; + pa_cvolume rv; + snd_mixer_elem_t *me; + snd_mixer_selem_channel_id_t c; + pa_channel_position_mask_t mask = 0; + char buf[64]; + unsigned k; + + pa_assert(m); + pa_assert(e); + pa_assert(cm); + pa_assert(v); + pa_assert(pa_cvolume_compatible_with_channel_map(v, cm)); + + SELEM_INIT(sid, &e->alsa_id); + if (!(me = snd_mixer_find_selem(m, sid))) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_warn("Element %s seems to have disappeared.", buf); + return -1; + } + + pa_cvolume_mute(&rv, cm->channels); + + for (c = 0; c <= SND_MIXER_SCHN_LAST; c++) { + int r; + pa_volume_t f = PA_VOLUME_MUTED; + bool found = false; + + for (k = 0; k < cm->channels; k++) + if (e->masks[c][e->n_channels-1] & PA_CHANNEL_POSITION_MASK(cm->map[k])) { + found = true; + if (v->values[k] > f) + f = v->values[k]; + } + + if (!found) { + /* Hmm, so this channel does not exist in the volume + * struct, so let's bind it to the overall max of the + * volume. */ + f = pa_cvolume_max(v); + } + + if (e->has_dB) { + long value = to_alsa_dB(f); + int rounding; + + if (e->volume_limit >= 0 && value > (e->max_dB * 100)) + value = e->max_dB * 100; + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) { + /* If we call set_playback_volume() without checking first + * if the channel is available, ALSA behaves very + * strangely and doesn't fail the call */ + if (snd_mixer_selem_has_playback_channel(me, c)) { + rounding = +1; + if (e->db_fix) { + if (write_to_hw) + r = snd_mixer_selem_set_playback_volume(me, c, decibel_fix_get_step(e->db_fix, &value, rounding)); + else { + decibel_fix_get_step(e->db_fix, &value, rounding); + r = 0; + } + + } else { + if (write_to_hw) { + if (deferred_volume) { + if ((r = element_get_nearest_alsa_dB(me, c, PA_ALSA_DIRECTION_OUTPUT, &value)) >= 0) + r = snd_mixer_selem_set_playback_dB(me, c, value, 0); + } else { + if ((r = snd_mixer_selem_set_playback_dB(me, c, value, rounding)) >= 0) + r = snd_mixer_selem_get_playback_dB(me, c, &value); + } + } else { + long alsa_val; + if ((r = snd_mixer_selem_ask_playback_dB_vol(me, value, rounding, &alsa_val)) >= 0) + r = snd_mixer_selem_ask_playback_vol_dB(me, alsa_val, &value); + } + } + } else + r = -1; + } else { + if (snd_mixer_selem_has_capture_channel(me, c)) { + rounding = -1; + if (e->db_fix) { + if (write_to_hw) + r = snd_mixer_selem_set_capture_volume(me, c, decibel_fix_get_step(e->db_fix, &value, rounding)); + else { + decibel_fix_get_step(e->db_fix, &value, rounding); + r = 0; + } + + } else { + if (write_to_hw) { + if (deferred_volume) { + if ((r = element_get_nearest_alsa_dB(me, c, PA_ALSA_DIRECTION_INPUT, &value)) >= 0) + r = snd_mixer_selem_set_capture_dB(me, c, value, 0); + } else { + if ((r = snd_mixer_selem_set_capture_dB(me, c, value, rounding)) >= 0) + r = snd_mixer_selem_get_capture_dB(me, c, &value); + } + } else { + long alsa_val; + if ((r = snd_mixer_selem_ask_capture_dB_vol(me, value, rounding, &alsa_val)) >= 0) + r = snd_mixer_selem_ask_capture_vol_dB(me, alsa_val, &value); + } + } + } else + r = -1; + } + + if (r < 0) + continue; + + f = from_alsa_dB(value); + + } else { + long value; + + value = to_alsa_volume(f, e->min_volume, e->max_volume); + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) { + if (snd_mixer_selem_has_playback_channel(me, c)) { + if ((r = snd_mixer_selem_set_playback_volume(me, c, value)) >= 0) + r = snd_mixer_selem_get_playback_volume(me, c, &value); + } else + r = -1; + } else { + if (snd_mixer_selem_has_capture_channel(me, c)) { + if ((r = snd_mixer_selem_set_capture_volume(me, c, value)) >= 0) + r = snd_mixer_selem_get_capture_volume(me, c, &value); + } else + r = -1; + } + + if (r < 0) + continue; + + f = from_alsa_volume(value, e->min_volume, e->max_volume); + } + + for (k = 0; k < cm->channels; k++) + if (e->masks[c][e->n_channels-1] & PA_CHANNEL_POSITION_MASK(cm->map[k])) + if (rv.values[k] < f) + rv.values[k] = f; + + mask |= e->masks[c][e->n_channels-1]; + } + + for (k = 0; k < cm->channels; k++) + if (!(mask & PA_CHANNEL_POSITION_MASK(cm->map[k]))) + rv.values[k] = PA_VOLUME_NORM; + + *v = rv; + return 0; +} + +int pa_alsa_path_set_volume(pa_alsa_path *p, snd_mixer_t *m, const pa_channel_map *cm, pa_cvolume *v, bool deferred_volume, bool write_to_hw) { + + pa_alsa_element *e; + pa_cvolume rv; + + pa_assert(m); + pa_assert(p); + pa_assert(cm); + pa_assert(v); + pa_assert(pa_cvolume_compatible_with_channel_map(v, cm)); + + if (!p->has_volume) + return -1; + + rv = *v; /* Remaining adjustment */ + pa_cvolume_reset(v, cm->channels); /* Adjustment done */ + + PA_LLIST_FOREACH(e, p->elements) { + pa_cvolume ev; + + if (e->volume_use != PA_ALSA_VOLUME_MERGE) + continue; + + pa_assert(!p->has_dB || e->has_dB); + + ev = rv; + if (element_set_volume(e, m, cm, &ev, deferred_volume, write_to_hw) < 0) + return -1; + + if (!p->has_dB) { + *v = ev; + return 0; + } + + pa_sw_cvolume_multiply(v, v, &ev); + pa_sw_cvolume_divide(&rv, &rv, &ev); + } + + return 0; +} + +static int element_set_switch(pa_alsa_element *e, snd_mixer_t *m, bool b) { + snd_mixer_elem_t *me; + snd_mixer_selem_id_t *sid; + char buf[64]; + int r; + + pa_assert(m); + pa_assert(e); + + SELEM_INIT(sid, &e->alsa_id); + if (!(me = snd_mixer_find_selem(m, sid))) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_warn("Element %s seems to have disappeared.", buf); + return -1; + } + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) + r = snd_mixer_selem_set_playback_switch_all(me, b); + else + r = snd_mixer_selem_set_capture_switch_all(me, b); + + if (r < 0) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_warn("Failed to set switch of %s: %s", buf, pa_alsa_strerror(errno)); + } + + return r; +} + +int pa_alsa_path_set_mute(pa_alsa_path *p, snd_mixer_t *m, bool muted) { + pa_alsa_element *e; + + pa_assert(m); + pa_assert(p); + + if (!p->has_mute) + return -1; + + PA_LLIST_FOREACH(e, p->elements) { + + if (e->switch_use != PA_ALSA_SWITCH_MUTE) + continue; + + if (element_set_switch(e, m, !muted) < 0) + return -1; + } + + return 0; +} + +/* Depending on whether e->volume_use is _OFF, _ZERO or _CONSTANT, this + * function sets all channels of the volume element to e->min_volume, 0 dB or + * e->constant_volume. */ +static int element_set_constant_volume(pa_alsa_element *e, snd_mixer_t *m) { + snd_mixer_elem_t *me = NULL; + snd_mixer_selem_id_t *sid = NULL; + int r = 0; + long volume = -1; + bool volume_set = false; + char buf[64]; + + pa_assert(m); + pa_assert(e); + + SELEM_INIT(sid, &e->alsa_id); + if (!(me = snd_mixer_find_selem(m, sid))) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_warn("Element %s seems to have disappeared.", buf); + return -1; + } + + switch (e->volume_use) { + case PA_ALSA_VOLUME_OFF: + volume = e->min_volume; + volume_set = true; + break; + + case PA_ALSA_VOLUME_ZERO: + if (e->db_fix) { + long dB = 0; + + volume = decibel_fix_get_step(e->db_fix, &dB, (e->direction == PA_ALSA_DIRECTION_OUTPUT ? +1 : -1)); + volume_set = true; + } + break; + + case PA_ALSA_VOLUME_CONSTANT: + volume = e->constant_volume; + volume_set = true; + break; + + default: + pa_assert_not_reached(); + } + + if (volume_set) { + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) + r = snd_mixer_selem_set_playback_volume_all(me, volume); + else + r = snd_mixer_selem_set_capture_volume_all(me, volume); + } else { + pa_assert(e->volume_use == PA_ALSA_VOLUME_ZERO); + pa_assert(!e->db_fix); + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) + r = snd_mixer_selem_set_playback_dB_all(me, 0, +1); + else + r = snd_mixer_selem_set_capture_dB_all(me, 0, -1); + } + + if (r < 0) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_warn("Failed to set volume of %s: %s", buf, pa_alsa_strerror(errno)); + } + + return r; +} + +int pa_alsa_path_select(pa_alsa_path *p, pa_alsa_setting *s, snd_mixer_t *m, bool device_is_muted) { + pa_alsa_element *e; + int r = 0; + + pa_assert(m); + pa_assert(p); + + pa_log_debug("Activating path %s", p->name); + pa_alsa_path_dump(p); + + /* First turn on hw mute if available, to avoid noise + * when setting the mixer controls. */ + if (p->mute_during_activation) { + PA_LLIST_FOREACH(e, p->elements) { + if (e->switch_use == PA_ALSA_SWITCH_MUTE) + /* If the muting fails here, that's not a critical problem for + * selecting a path, so we ignore the return value. + * element_set_switch() will print a warning anyway, so this + * won't be a silent failure either. */ + (void) element_set_switch(e, m, false); + } + } + + PA_LLIST_FOREACH(e, p->elements) { + + switch (e->switch_use) { + case PA_ALSA_SWITCH_OFF: + r = element_set_switch(e, m, false); + break; + + case PA_ALSA_SWITCH_ON: + r = element_set_switch(e, m, true); + break; + + case PA_ALSA_SWITCH_MUTE: + case PA_ALSA_SWITCH_IGNORE: + case PA_ALSA_SWITCH_SELECT: + r = 0; + break; + } + + if (r < 0) + return -1; + + switch (e->volume_use) { + case PA_ALSA_VOLUME_OFF: + case PA_ALSA_VOLUME_ZERO: + case PA_ALSA_VOLUME_CONSTANT: + r = element_set_constant_volume(e, m); + break; + + case PA_ALSA_VOLUME_MERGE: + case PA_ALSA_VOLUME_IGNORE: + r = 0; + break; + } + + if (r < 0) + return -1; + } + + if (s) + setting_select(s, m); + + /* Finally restore hw mute to the device mute status. */ + if (p->mute_during_activation) { + PA_LLIST_FOREACH(e, p->elements) { + if (e->switch_use == PA_ALSA_SWITCH_MUTE) { + if (element_set_switch(e, m, !device_is_muted) < 0) + return -1; + } + } + } + + return 0; +} + +static int check_required(pa_alsa_element *e, snd_mixer_elem_t *me) { + bool has_switch; + bool has_enumeration; + bool has_volume; + + pa_assert(e); + pa_assert(me); + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) { + has_switch = + snd_mixer_selem_has_playback_switch(me) || + (e->direction_try_other && snd_mixer_selem_has_capture_switch(me)); + } else { + has_switch = + snd_mixer_selem_has_capture_switch(me) || + (e->direction_try_other && snd_mixer_selem_has_playback_switch(me)); + } + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) { + has_volume = + snd_mixer_selem_has_playback_volume(me) || + (e->direction_try_other && snd_mixer_selem_has_capture_volume(me)); + } else { + has_volume = + snd_mixer_selem_has_capture_volume(me) || + (e->direction_try_other && snd_mixer_selem_has_playback_volume(me)); + } + + has_enumeration = snd_mixer_selem_is_enumerated(me); + + if ((e->required == PA_ALSA_REQUIRED_SWITCH && !has_switch) || + (e->required == PA_ALSA_REQUIRED_VOLUME && !has_volume) || + (e->required == PA_ALSA_REQUIRED_ENUMERATION && !has_enumeration)) + return -1; + + if (e->required == PA_ALSA_REQUIRED_ANY && !(has_switch || has_volume || has_enumeration)) + return -1; + + if ((e->required_absent == PA_ALSA_REQUIRED_SWITCH && has_switch) || + (e->required_absent == PA_ALSA_REQUIRED_VOLUME && has_volume) || + (e->required_absent == PA_ALSA_REQUIRED_ENUMERATION && has_enumeration)) + return -1; + + if (e->required_absent == PA_ALSA_REQUIRED_ANY && (has_switch || has_volume || has_enumeration)) + return -1; + + if (e->required_any != PA_ALSA_REQUIRED_IGNORE) { + switch (e->required_any) { + case PA_ALSA_REQUIRED_VOLUME: + e->path->req_any_present |= (e->volume_use != PA_ALSA_VOLUME_IGNORE); + break; + case PA_ALSA_REQUIRED_SWITCH: + e->path->req_any_present |= (e->switch_use != PA_ALSA_SWITCH_IGNORE); + break; + case PA_ALSA_REQUIRED_ENUMERATION: + e->path->req_any_present |= (e->enumeration_use != PA_ALSA_ENUMERATION_IGNORE); + break; + case PA_ALSA_REQUIRED_ANY: + e->path->req_any_present |= + (e->volume_use != PA_ALSA_VOLUME_IGNORE) || + (e->switch_use != PA_ALSA_SWITCH_IGNORE) || + (e->enumeration_use != PA_ALSA_ENUMERATION_IGNORE); + break; + default: + pa_assert_not_reached(); + } + } + + if (e->enumeration_use == PA_ALSA_ENUMERATION_SELECT) { + pa_alsa_option *o; + PA_LLIST_FOREACH(o, e->options) { + e->path->req_any_present |= (o->required_any != PA_ALSA_REQUIRED_IGNORE) && + (o->alsa_idx >= 0); + if (o->required != PA_ALSA_REQUIRED_IGNORE && o->alsa_idx < 0) + return -1; + if (o->required_absent != PA_ALSA_REQUIRED_IGNORE && o->alsa_idx >= 0) + return -1; + } + } + + return 0; +} + +static int element_ask_vol_dB(snd_mixer_elem_t *me, pa_alsa_direction_t dir, long value, long *dBvalue) { + if (dir == PA_ALSA_DIRECTION_OUTPUT) + return snd_mixer_selem_ask_playback_vol_dB(me, value, dBvalue); + else + return snd_mixer_selem_ask_capture_vol_dB(me, value, dBvalue); +} + +static bool element_probe_volume(pa_alsa_element *e, snd_mixer_elem_t *me) { + + long min_dB = 0, max_dB = 0; + int r; + bool is_mono; + pa_channel_position_t p; + char buf[64]; + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) { + if (!snd_mixer_selem_has_playback_volume(me)) { + if (e->direction_try_other && snd_mixer_selem_has_capture_volume(me)) + e->direction = PA_ALSA_DIRECTION_INPUT; + else + return false; + } + } else { + if (!snd_mixer_selem_has_capture_volume(me)) { + if (e->direction_try_other && snd_mixer_selem_has_playback_volume(me)) + e->direction = PA_ALSA_DIRECTION_OUTPUT; + else + return false; + } + } + + e->direction_try_other = false; + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) + r = snd_mixer_selem_get_playback_volume_range(me, &e->min_volume, &e->max_volume); + else + r = snd_mixer_selem_get_capture_volume_range(me, &e->min_volume, &e->max_volume); + + if (r < 0) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_warn("Failed to get volume range of %s: %s", buf, pa_alsa_strerror(r)); + return false; + } + + if (e->min_volume >= e->max_volume) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_warn("Your kernel driver is broken for element %s: it reports a volume range from %li to %li which makes no sense.", + buf, e->min_volume, e->max_volume); + return false; + } + if (e->volume_use == PA_ALSA_VOLUME_CONSTANT && (e->min_volume > e->constant_volume || e->max_volume < e->constant_volume)) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_warn("Constant volume %li configured for element %s, but the available range is from %li to %li.", + e->constant_volume, buf, e->min_volume, e->max_volume); + return false; + } + + + if (e->db_fix && ((e->min_volume > e->db_fix->min_step) || (e->max_volume < e->db_fix->max_step))) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_warn("The step range of the decibel fix for element %s (%li-%li) doesn't fit to the " + "real hardware range (%li-%li). Disabling the decibel fix.", buf, + e->db_fix->min_step, e->db_fix->max_step, e->min_volume, e->max_volume); + + decibel_fix_free(e->db_fix); + e->db_fix = NULL; + } + + if (e->db_fix) { + e->has_dB = true; + e->min_volume = e->db_fix->min_step; + e->max_volume = e->db_fix->max_step; + min_dB = e->db_fix->db_values[0]; + max_dB = e->db_fix->db_values[e->db_fix->max_step - e->db_fix->min_step]; + } else if (e->direction == PA_ALSA_DIRECTION_OUTPUT) + e->has_dB = snd_mixer_selem_get_playback_dB_range(me, &min_dB, &max_dB) >= 0; + else + e->has_dB = snd_mixer_selem_get_capture_dB_range(me, &min_dB, &max_dB) >= 0; + + /* Check that the kernel driver returns consistent limits with + * both _get_*_dB_range() and _ask_*_vol_dB(). */ + if (e->has_dB && !e->db_fix) { + long min_dB_checked = 0; + long max_dB_checked = 0; + + if (element_ask_vol_dB(me, e->direction, e->min_volume, &min_dB_checked) < 0) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_warn("Failed to query the dB value for %s at volume level %li", buf, e->min_volume); + return false; + } + + if (element_ask_vol_dB(me, e->direction, e->max_volume, &max_dB_checked) < 0) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_warn("Failed to query the dB value for %s at volume level %li", buf, e->max_volume); + return false; + } + + if (min_dB != min_dB_checked || max_dB != max_dB_checked) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_warn("Your kernel driver is broken: the reported dB range for %s (from %0.2f dB to %0.2f dB) " + "doesn't match the dB values at minimum and maximum volume levels: %0.2f dB at level %li, " + "%0.2f dB at level %li.", buf, min_dB / 100.0, max_dB / 100.0, + min_dB_checked / 100.0, e->min_volume, max_dB_checked / 100.0, e->max_volume); + return false; + } + } + + if (e->has_dB) { + e->min_dB = ((double) min_dB) / 100.0; + e->max_dB = ((double) max_dB) / 100.0; + + if (min_dB >= max_dB) { + pa_assert(!e->db_fix); + pa_log_warn("Your kernel driver is broken: it reports a volume range from %0.2f dB to %0.2f dB which makes no sense.", + e->min_dB, e->max_dB); + e->has_dB = false; + } + } + + if (e->volume_limit >= 0) { + if (e->volume_limit <= e->min_volume || e->volume_limit > e->max_volume) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_warn("Volume limit for element %s of path %s is invalid: %li isn't within the valid range " + "%li-%li. The volume limit is ignored.", + buf, e->path->name, e->volume_limit, e->min_volume + 1, e->max_volume); + } else { + e->max_volume = e->volume_limit; + + if (e->has_dB) { + if (e->db_fix) { + e->db_fix->max_step = e->max_volume; + e->max_dB = ((double) e->db_fix->db_values[e->db_fix->max_step - e->db_fix->min_step]) / 100.0; + } else if (element_ask_vol_dB(me, e->direction, e->max_volume, &max_dB) < 0) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_warn("Failed to get dB value of %s: %s", buf, pa_alsa_strerror(r)); + e->has_dB = false; + } else + e->max_dB = ((double) max_dB) / 100.0; + } + } + } + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) + is_mono = snd_mixer_selem_is_playback_mono(me) > 0; + else + is_mono = snd_mixer_selem_is_capture_mono(me) > 0; + + if (is_mono) { + e->n_channels = 1; + + if ((e->override_map & (1 << (e->n_channels-1))) && e->masks[SND_MIXER_SCHN_MONO][e->n_channels-1] == 0) { + pa_log_warn("Override map for mono element %s is invalid, ignoring override map", e->path->name); + e->override_map &= ~(1 << (e->n_channels-1)); + } + if (!(e->override_map & (1 << (e->n_channels-1)))) { + for (p = PA_CHANNEL_POSITION_FRONT_LEFT; p < PA_CHANNEL_POSITION_MAX; p++) { + if (alsa_channel_ids[p] == SND_MIXER_SCHN_UNKNOWN) + continue; + e->masks[alsa_channel_ids[p]][e->n_channels-1] = 0; + } + e->masks[SND_MIXER_SCHN_MONO][e->n_channels-1] = PA_CHANNEL_POSITION_MASK_ALL; + } + e->merged_mask = e->masks[SND_MIXER_SCHN_MONO][e->n_channels-1]; + return true; + } + + e->n_channels = 0; + for (p = PA_CHANNEL_POSITION_FRONT_LEFT; p < PA_CHANNEL_POSITION_MAX; p++) { + if (alsa_channel_ids[p] == SND_MIXER_SCHN_UNKNOWN) + continue; + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) + e->n_channels += snd_mixer_selem_has_playback_channel(me, alsa_channel_ids[p]) > 0; + else + e->n_channels += snd_mixer_selem_has_capture_channel(me, alsa_channel_ids[p]) > 0; + } + + if (e->n_channels <= 0) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_warn("Volume element %s with no channels?", buf); + return false; + } else if (e->n_channels > POSITION_MASK_CHANNELS) { + /* FIXME: In some places code like this is used: + * + * e->masks[alsa_channel_ids[p]][e->n_channels-1] + * + * The definition of e->masks is + * + * pa_channel_position_mask_t masks[SND_MIXER_SCHN_LAST + 1][POSITION_MASK_CHANNELS]; + * + * Since the array size is fixed at POSITION_MASK_CHANNELS, we obviously + * don't support elements with more than POSITION_MASK_CHANNELS + * channels... */ + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_warn("Volume element %s has %u channels. That's too much! I can't handle that!", buf, e->n_channels); + return false; + } + +retry: + if (!(e->override_map & (1 << (e->n_channels-1)))) { + for (p = PA_CHANNEL_POSITION_FRONT_LEFT; p < PA_CHANNEL_POSITION_MAX; p++) { + bool has_channel; + + if (alsa_channel_ids[p] == SND_MIXER_SCHN_UNKNOWN) + continue; + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) + has_channel = snd_mixer_selem_has_playback_channel(me, alsa_channel_ids[p]) > 0; + else + has_channel = snd_mixer_selem_has_capture_channel(me, alsa_channel_ids[p]) > 0; + + e->masks[alsa_channel_ids[p]][e->n_channels-1] = has_channel ? PA_CHANNEL_POSITION_MASK(p) : 0; + } + } + + e->merged_mask = 0; + for (p = PA_CHANNEL_POSITION_FRONT_LEFT; p < PA_CHANNEL_POSITION_MAX; p++) { + if (alsa_channel_ids[p] == SND_MIXER_SCHN_UNKNOWN) + continue; + + e->merged_mask |= e->masks[alsa_channel_ids[p]][e->n_channels-1]; + } + + if (e->merged_mask == 0) { + if (!(e->override_map & (1 << (e->n_channels-1)))) { + pa_log_warn("Channel map for element %s is invalid", e->path->name); + return false; + } + pa_log_warn("Override map for element %s has empty result, ignoring override map", e->path->name); + e->override_map &= ~(1 << (e->n_channels-1)); + goto retry; + } + + return true; +} + +static int element_probe(pa_alsa_element *e, snd_mixer_t *m) { + snd_mixer_selem_id_t *sid; + snd_mixer_elem_t *me; + + pa_assert(m); + pa_assert(e); + pa_assert(e->path); + + SELEM_INIT(sid, &e->alsa_id); + + if (!(me = snd_mixer_find_selem(m, sid))) { + + if (e->required != PA_ALSA_REQUIRED_IGNORE) + return -1; + + e->switch_use = PA_ALSA_SWITCH_IGNORE; + e->volume_use = PA_ALSA_VOLUME_IGNORE; + e->enumeration_use = PA_ALSA_ENUMERATION_IGNORE; + + return 0; + } + + if (e->switch_use != PA_ALSA_SWITCH_IGNORE) { + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) { + + if (!snd_mixer_selem_has_playback_switch(me)) { + if (e->direction_try_other && snd_mixer_selem_has_capture_switch(me)) + e->direction = PA_ALSA_DIRECTION_INPUT; + else + e->switch_use = PA_ALSA_SWITCH_IGNORE; + } + + } else { + + if (!snd_mixer_selem_has_capture_switch(me)) { + if (e->direction_try_other && snd_mixer_selem_has_playback_switch(me)) + e->direction = PA_ALSA_DIRECTION_OUTPUT; + else + e->switch_use = PA_ALSA_SWITCH_IGNORE; + } + } + + if (e->switch_use != PA_ALSA_SWITCH_IGNORE) + e->direction_try_other = false; + } + + if (!element_probe_volume(e, me)) + e->volume_use = PA_ALSA_VOLUME_IGNORE; + + if (e->switch_use == PA_ALSA_SWITCH_SELECT) { + pa_alsa_option *o; + + PA_LLIST_FOREACH(o, e->options) + o->alsa_idx = pa_streq(o->alsa_name, "on") ? 1 : 0; + } else if (e->enumeration_use == PA_ALSA_ENUMERATION_SELECT) { + int n; + pa_alsa_option *o; + + if ((n = snd_mixer_selem_get_enum_items(me)) < 0) { + pa_log("snd_mixer_selem_get_enum_items() failed: %s", pa_alsa_strerror(n)); + return -1; + } + + PA_LLIST_FOREACH(o, e->options) { + int i; + + for (i = 0; i < n; i++) { + char buf[128]; + + if (snd_mixer_selem_get_enum_item_name(me, i, sizeof(buf), buf) < 0) + continue; + + if (!pa_streq(buf, o->alsa_name)) + continue; + + o->alsa_idx = i; + } + } + } + + if (check_required(e, me) < 0) + return -1; + + return 0; +} + +static int jack_probe(pa_alsa_jack *j, pa_alsa_mapping *mapping, snd_mixer_t *m) { + bool has_control; + + pa_assert(j); + pa_assert(j->path); + + if (j->append_pcm_to_name) { + char *new_name; + + if (!mapping) { + /* This could also be an assertion, because this should never + * happen. At the time of writing, mapping can only be NULL when + * module-alsa-sink/source synthesizes a path, and those + * synthesized paths never have any jacks, so jack_probe() should + * never be called with a NULL mapping. */ + pa_log("Jack %s: append_pcm_to_name is set, but mapping is NULL. Can't use this jack.", j->name); + return -1; + } + + new_name = pa_sprintf_malloc("%s,pcm=%i Jack", j->name, mapping->hw_device_index); + pa_xfree(j->alsa_id.name); + j->alsa_id.name = new_name; + j->append_pcm_to_name = false; + } + + has_control = pa_alsa_mixer_find_card(m, &j->alsa_id, 0) != NULL; + pa_alsa_jack_set_has_control(j, has_control); + + if (j->has_control) { + if (j->required_absent != PA_ALSA_REQUIRED_IGNORE) + return -1; + if (j->required_any != PA_ALSA_REQUIRED_IGNORE) + j->path->req_any_present = true; + } else { + if (j->required != PA_ALSA_REQUIRED_IGNORE) + return -1; + } + + return 0; +} + +pa_alsa_element * pa_alsa_element_get(pa_alsa_path *p, const char *section, bool prefixed) { + pa_alsa_element *e; + char *name; + int index; + + pa_assert(p); + pa_assert(section); + + if (prefixed) { + if (!pa_startswith(section, "Element ")) + return NULL; + + section += 8; + } + + /* This is not an element section, but an enum section? */ + if (strchr(section, ':')) + return NULL; + + name = alloca(strlen(section) + 1); + if (alsa_id_decode(section, name, &index)) + return NULL; + + if (p->last_element && pa_streq(p->last_element->alsa_id.name, name) && + p->last_element->alsa_id.index == index) + return p->last_element; + + PA_LLIST_FOREACH(e, p->elements) + if (pa_streq(e->alsa_id.name, name) && e->alsa_id.index == index) + goto finish; + + e = pa_xnew0(pa_alsa_element, 1); + e->path = p; + e->alsa_id.name = pa_xstrdup(name); + e->alsa_id.index = index; + e->direction = p->direction; + e->volume_limit = -1; + + PA_LLIST_INSERT_AFTER(pa_alsa_element, p->elements, p->last_element, e); + +finish: + p->last_element = e; + return e; +} + +static pa_alsa_jack* jack_get(pa_alsa_path *p, const char *section) { + pa_alsa_jack *j; + char *name; + int index; + + if (!pa_startswith(section, "Jack ")) + return NULL; + section += 5; + + name = alloca(strlen(section) + 1); + if (alsa_id_decode(section, name, &index)) + return NULL; + + if (p->last_jack && pa_streq(p->last_jack->name, name) && + p->last_jack->alsa_id.index == index) + return p->last_jack; + + PA_LLIST_FOREACH(j, p->jacks) + if (pa_streq(j->name, name) && j->alsa_id.index == index) + goto finish; + + j = pa_alsa_jack_new(p, NULL, name, index); + PA_LLIST_INSERT_AFTER(pa_alsa_jack, p->jacks, p->last_jack, j); + +finish: + p->last_jack = j; + return j; +} + +static pa_alsa_option* option_get(pa_alsa_path *p, const char *section) { + char *en, *name; + const char *on; + pa_alsa_option *o; + pa_alsa_element *e; + size_t len; + int index; + + if (!pa_startswith(section, "Option ")) + return NULL; + + section += 7; + + /* This is not an enum section, but an element section? */ + if (!(on = strchr(section, ':'))) + return NULL; + + len = on - section; + en = alloca(len + 1); + strncpy(en, section, len); + en[len] = '\0'; + + name = alloca(strlen(en) + 1); + if (alsa_id_decode(en, name, &index)) + return NULL; + + on++; + + if (p->last_option && + pa_streq(p->last_option->element->alsa_id.name, name) && + p->last_option->element->alsa_id.index == index && + pa_streq(p->last_option->alsa_name, on)) { + return p->last_option; + } + + pa_assert_se(e = pa_alsa_element_get(p, en, false)); + + PA_LLIST_FOREACH(o, e->options) + if (pa_streq(o->alsa_name, on)) + goto finish; + + o = pa_xnew0(pa_alsa_option, 1); + o->element = e; + o->alsa_name = pa_xstrdup(on); + o->alsa_idx = -1; + + if (p->last_option && p->last_option->element == e) + PA_LLIST_INSERT_AFTER(pa_alsa_option, e->options, p->last_option, o); + else + PA_LLIST_PREPEND(pa_alsa_option, e->options, o); + +finish: + p->last_option = o; + return o; +} + +static int element_parse_switch(pa_config_parser_state *state) { + pa_alsa_path *p; + pa_alsa_element *e; + + pa_assert(state); + + p = state->userdata; + + if (!(e = pa_alsa_element_get(p, state->section, true))) { + pa_log("[%s:%u] Switch makes no sense in '%s'", state->filename, state->lineno, state->section); + return -1; + } + + if (pa_streq(state->rvalue, "ignore")) + e->switch_use = PA_ALSA_SWITCH_IGNORE; + else if (pa_streq(state->rvalue, "mute")) + e->switch_use = PA_ALSA_SWITCH_MUTE; + else if (pa_streq(state->rvalue, "off")) + e->switch_use = PA_ALSA_SWITCH_OFF; + else if (pa_streq(state->rvalue, "on")) + e->switch_use = PA_ALSA_SWITCH_ON; + else if (pa_streq(state->rvalue, "select")) + e->switch_use = PA_ALSA_SWITCH_SELECT; + else { + pa_log("[%s:%u] Switch invalid of '%s'", state->filename, state->lineno, state->section); + return -1; + } + + return 0; +} + +static int element_parse_volume(pa_config_parser_state *state) { + pa_alsa_path *p; + pa_alsa_element *e; + + pa_assert(state); + + p = state->userdata; + + if (!(e = pa_alsa_element_get(p, state->section, true))) { + pa_log("[%s:%u] Volume makes no sense in '%s'", state->filename, state->lineno, state->section); + return -1; + } + + if (pa_streq(state->rvalue, "ignore")) + e->volume_use = PA_ALSA_VOLUME_IGNORE; + else if (pa_streq(state->rvalue, "merge")) + e->volume_use = PA_ALSA_VOLUME_MERGE; + else if (pa_streq(state->rvalue, "off")) + e->volume_use = PA_ALSA_VOLUME_OFF; + else if (pa_streq(state->rvalue, "zero")) + e->volume_use = PA_ALSA_VOLUME_ZERO; + else { + uint32_t constant; + + if (pa_atou(state->rvalue, &constant) >= 0) { + e->volume_use = PA_ALSA_VOLUME_CONSTANT; + e->constant_volume = constant; + } else { + pa_log("[%s:%u] Volume invalid of '%s'", state->filename, state->lineno, state->section); + return -1; + } + } + + return 0; +} + +static int element_parse_enumeration(pa_config_parser_state *state) { + pa_alsa_path *p; + pa_alsa_element *e; + + pa_assert(state); + + p = state->userdata; + + if (!(e = pa_alsa_element_get(p, state->section, true))) { + pa_log("[%s:%u] Enumeration makes no sense in '%s'", state->filename, state->lineno, state->section); + return -1; + } + + if (pa_streq(state->rvalue, "ignore")) + e->enumeration_use = PA_ALSA_ENUMERATION_IGNORE; + else if (pa_streq(state->rvalue, "select")) + e->enumeration_use = PA_ALSA_ENUMERATION_SELECT; + else { + pa_log("[%s:%u] Enumeration invalid of '%s'", state->filename, state->lineno, state->section); + return -1; + } + + return 0; +} + +static int parse_type(pa_config_parser_state *state) { + struct device_port_types { + const char *name; + pa_device_port_type_t type; + } device_port_types[] = { + { "unknown", PA_DEVICE_PORT_TYPE_UNKNOWN }, + { "aux", PA_DEVICE_PORT_TYPE_AUX }, + { "speaker", PA_DEVICE_PORT_TYPE_SPEAKER }, + { "headphones", PA_DEVICE_PORT_TYPE_HEADPHONES }, + { "line", PA_DEVICE_PORT_TYPE_LINE }, + { "mic", PA_DEVICE_PORT_TYPE_MIC }, + { "headset", PA_DEVICE_PORT_TYPE_HEADSET }, + { "handset", PA_DEVICE_PORT_TYPE_HANDSET }, + { "earpiece", PA_DEVICE_PORT_TYPE_EARPIECE }, + { "spdif", PA_DEVICE_PORT_TYPE_SPDIF }, + { "hdmi", PA_DEVICE_PORT_TYPE_HDMI }, + { "tv", PA_DEVICE_PORT_TYPE_TV }, + { "radio", PA_DEVICE_PORT_TYPE_RADIO }, + { "video", PA_DEVICE_PORT_TYPE_VIDEO }, + { "usb", PA_DEVICE_PORT_TYPE_USB }, + { "bluetooth", PA_DEVICE_PORT_TYPE_BLUETOOTH }, + { "portable", PA_DEVICE_PORT_TYPE_PORTABLE }, + { "handsfree", PA_DEVICE_PORT_TYPE_HANDSFREE }, + { "car", PA_DEVICE_PORT_TYPE_CAR }, + { "hifi", PA_DEVICE_PORT_TYPE_HIFI }, + { "phone", PA_DEVICE_PORT_TYPE_PHONE }, + { "network", PA_DEVICE_PORT_TYPE_NETWORK }, + { "analog", PA_DEVICE_PORT_TYPE_ANALOG }, + }; + pa_alsa_path *path; + unsigned int idx; + + path = state->userdata; + + for (idx = 0; idx < PA_ELEMENTSOF(device_port_types); idx++) + if (pa_streq(state->rvalue, device_port_types[idx].name)) { + path->device_port_type = device_port_types[idx].type; + return 0; + } + + pa_log("[%s:%u] Invalid value for option 'type': %s", state->filename, state->lineno, state->rvalue); + return -1; +} + +static int parse_eld_device(pa_config_parser_state *state) { + pa_alsa_path *path; + uint32_t eld_device; + + path = state->userdata; + + if (pa_atou(state->rvalue, &eld_device) >= 0) { + path->autodetect_eld_device = false; + path->eld_device = eld_device; + return 0; + } + + if (pa_streq(state->rvalue, "auto")) { + path->autodetect_eld_device = true; + path->eld_device = -1; + return 0; + } + + pa_log("[%s:%u] Invalid value for option 'eld-device': %s", state->filename, state->lineno, state->rvalue); + return -1; +} + +static int option_parse_priority(pa_config_parser_state *state) { + pa_alsa_path *p; + pa_alsa_option *o; + uint32_t prio; + + pa_assert(state); + + p = state->userdata; + + if (!(o = option_get(p, state->section))) { + pa_log("[%s:%u] Priority makes no sense in '%s'", state->filename, state->lineno, state->section); + return -1; + } + + if (pa_atou(state->rvalue, &prio) < 0) { + pa_log("[%s:%u] Priority invalid of '%s'", state->filename, state->lineno, state->section); + return -1; + } + + o->priority = prio; + return 0; +} + +static int option_parse_name(pa_config_parser_state *state) { + pa_alsa_path *p; + pa_alsa_option *o; + + pa_assert(state); + + p = state->userdata; + + if (!(o = option_get(p, state->section))) { + pa_log("[%s:%u] Name makes no sense in '%s'", state->filename, state->lineno, state->section); + return -1; + } + + pa_xfree(o->name); + o->name = pa_xstrdup(state->rvalue); + + return 0; +} + +static int element_parse_required(pa_config_parser_state *state) { + pa_alsa_path *p; + pa_alsa_element *e; + pa_alsa_option *o; + pa_alsa_jack *j; + pa_alsa_required_t req; + + pa_assert(state); + + p = state->userdata; + + e = pa_alsa_element_get(p, state->section, true); + o = option_get(p, state->section); + j = jack_get(p, state->section); + if (!e && !o && !j) { + pa_log("[%s:%u] Required makes no sense in '%s'", state->filename, state->lineno, state->section); + return -1; + } + + if (pa_streq(state->rvalue, "ignore")) + req = PA_ALSA_REQUIRED_IGNORE; + else if (pa_streq(state->rvalue, "switch") && e) + req = PA_ALSA_REQUIRED_SWITCH; + else if (pa_streq(state->rvalue, "volume") && e) + req = PA_ALSA_REQUIRED_VOLUME; + else if (pa_streq(state->rvalue, "enumeration")) + req = PA_ALSA_REQUIRED_ENUMERATION; + else if (pa_streq(state->rvalue, "any")) + req = PA_ALSA_REQUIRED_ANY; + else { + pa_log("[%s:%u] Required invalid of '%s'", state->filename, state->lineno, state->section); + return -1; + } + + if (pa_streq(state->lvalue, "required-absent")) { + if (e) + e->required_absent = req; + if (o) + o->required_absent = req; + if (j) + j->required_absent = req; + } + else if (pa_streq(state->lvalue, "required-any")) { + if (e) { + e->required_any = req; + e->path->has_req_any |= (req != PA_ALSA_REQUIRED_IGNORE); + } + if (o) { + o->required_any = req; + o->element->path->has_req_any |= (req != PA_ALSA_REQUIRED_IGNORE); + } + if (j) { + j->required_any = req; + j->path->has_req_any |= (req != PA_ALSA_REQUIRED_IGNORE); + } + + } + else { + if (e) + e->required = req; + if (o) + o->required = req; + if (j) + j->required = req; + } + + return 0; +} + +static int element_parse_direction(pa_config_parser_state *state) { + pa_alsa_path *p; + pa_alsa_element *e; + + pa_assert(state); + + p = state->userdata; + + if (!(e = pa_alsa_element_get(p, state->section, true))) { + pa_log("[%s:%u] Direction makes no sense in '%s'", state->filename, state->lineno, state->section); + return -1; + } + + if (pa_streq(state->rvalue, "playback")) + e->direction = PA_ALSA_DIRECTION_OUTPUT; + else if (pa_streq(state->rvalue, "capture")) + e->direction = PA_ALSA_DIRECTION_INPUT; + else { + pa_log("[%s:%u] Direction invalid of '%s'", state->filename, state->lineno, state->section); + return -1; + } + + return 0; +} + +static int element_parse_direction_try_other(pa_config_parser_state *state) { + pa_alsa_path *p; + pa_alsa_element *e; + int yes; + + pa_assert(state); + + p = state->userdata; + + if (!(e = pa_alsa_element_get(p, state->section, true))) { + pa_log("[%s:%u] Direction makes no sense in '%s'", state->filename, state->lineno, state->section); + return -1; + } + + if ((yes = pa_parse_boolean(state->rvalue)) < 0) { + pa_log("[%s:%u] Direction invalid of '%s'", state->filename, state->lineno, state->section); + return -1; + } + + e->direction_try_other = !!yes; + return 0; +} + +static int element_parse_volume_limit(pa_config_parser_state *state) { + pa_alsa_path *p; + pa_alsa_element *e; + long volume_limit; + + pa_assert(state); + + p = state->userdata; + + if (!(e = pa_alsa_element_get(p, state->section, true))) { + pa_log("[%s:%u] volume-limit makes no sense in '%s'", state->filename, state->lineno, state->section); + return -1; + } + + if (pa_atol(state->rvalue, &volume_limit) < 0 || volume_limit < 0) { + pa_log("[%s:%u] Invalid value for volume-limit", state->filename, state->lineno); + return -1; + } + + e->volume_limit = volume_limit; + return 0; +} + +static unsigned int parse_channel_position(const char *m) +{ + pa_channel_position_t p; + + if ((p = pa_channel_position_from_string(m)) == PA_CHANNEL_POSITION_INVALID) + return SND_MIXER_SCHN_UNKNOWN; + + return alsa_channel_ids[p]; +} + +static pa_channel_position_mask_t parse_mask(const char *m) { + pa_channel_position_mask_t v; + + if (pa_streq(m, "all-left")) + v = PA_CHANNEL_POSITION_MASK_LEFT; + else if (pa_streq(m, "all-right")) + v = PA_CHANNEL_POSITION_MASK_RIGHT; + else if (pa_streq(m, "all-center")) + v = PA_CHANNEL_POSITION_MASK_CENTER; + else if (pa_streq(m, "all-front")) + v = PA_CHANNEL_POSITION_MASK_FRONT; + else if (pa_streq(m, "all-rear")) + v = PA_CHANNEL_POSITION_MASK_REAR; + else if (pa_streq(m, "all-side")) + v = PA_CHANNEL_POSITION_MASK_SIDE_OR_TOP_CENTER; + else if (pa_streq(m, "all-top")) + v = PA_CHANNEL_POSITION_MASK_TOP; + else if (pa_streq(m, "all-no-lfe")) + v = PA_CHANNEL_POSITION_MASK_ALL ^ PA_CHANNEL_POSITION_MASK(PA_CHANNEL_POSITION_LFE); + else if (pa_streq(m, "all")) + v = PA_CHANNEL_POSITION_MASK_ALL; + else { + pa_channel_position_t p; + + if ((p = pa_channel_position_from_string(m)) == PA_CHANNEL_POSITION_INVALID) + return 0; + + v = PA_CHANNEL_POSITION_MASK(p); + } + + return v; +} + +static int element_parse_override_map(pa_config_parser_state *state) { + pa_alsa_path *p; + pa_alsa_element *e; + const char *split_state = NULL; + char *s; + unsigned i = 0; + int channel_count = 0; + char *n; + + pa_assert(state); + + p = state->userdata; + + if (!(e = pa_alsa_element_get(p, state->section, true))) { + pa_log("[%s:%u] Override map makes no sense in '%s'", state->filename, state->lineno, state->section); + return -1; + } + + s = strstr(state->lvalue, "."); + if (s) { + pa_atoi(s + 1, &channel_count); + if (channel_count < 1 || channel_count > POSITION_MASK_CHANNELS) { + pa_log("[%s:%u] Override map index '%s' invalid in '%s'", state->filename, state->lineno, state->lvalue, state->section); + return 0; + } + } else { + pa_log("[%s:%u] Invalid override map syntax '%s' in '%s'", state->filename, state->lineno, state->lvalue, state->section); + return -1; + } + + while ((n = pa_split(state->rvalue, ",", &split_state))) { + pa_channel_position_mask_t m; + snd_mixer_selem_channel_id_t channel_position; + + if (i >= (unsigned)channel_count) { + pa_log("[%s:%u] Invalid override map size (>%d) in '%s'", state->filename, state->lineno, channel_count, state->section); + return -1; + } + channel_position = alsa_channel_positions[i]; + + if (!*n) + m = 0; + else { + s = strstr(n, ":"); + if (s) { + *s = '\0'; + s++; + channel_position = parse_channel_position(n); + if (channel_position == SND_MIXER_SCHN_UNKNOWN) { + pa_log("[%s:%u] Override map position '%s' invalid in '%s'", state->filename, state->lineno, n, state->section); + pa_xfree(n); + return -1; + } + } + if ((m = parse_mask(s ? s : n)) == 0) { + pa_log("[%s:%u] Override map '%s' invalid in '%s'", state->filename, state->lineno, s ? s : n, state->section); + pa_xfree(n); + return -1; + } + } + + if (e->masks[channel_position][channel_count-1]) { + pa_log("[%s:%u] Override map '%s' duplicate position '%s' in '%s'", state->filename, state->lineno, s ? s : n, snd_mixer_selem_channel_name(channel_position), state->section); + pa_xfree(n); + return -1; + } + e->override_map |= (1 << (channel_count - 1)); + e->masks[channel_position][channel_count-1] = m; + pa_xfree(n); + i++; + } + + return 0; +} + +static int jack_parse_state(pa_config_parser_state *state) { + pa_alsa_path *p; + pa_alsa_jack *j; + pa_available_t pa; + + pa_assert(state); + + p = state->userdata; + + if (!(j = jack_get(p, state->section))) { + pa_log("[%s:%u] state makes no sense in '%s'", state->filename, state->lineno, state->section); + return -1; + } + + if (pa_streq(state->rvalue, "yes")) + pa = PA_AVAILABLE_YES; + else if (pa_streq(state->rvalue, "no")) + pa = PA_AVAILABLE_NO; + else if (pa_streq(state->rvalue, "unknown")) + pa = PA_AVAILABLE_UNKNOWN; + else { + pa_log("[%s:%u] state must be 'yes', 'no' or 'unknown' in '%s'", state->filename, state->lineno, state->section); + return -1; + } + + if (pa_streq(state->lvalue, "state.unplugged")) + j->state_unplugged = pa; + else { + j->state_plugged = pa; + pa_assert(pa_streq(state->lvalue, "state.plugged")); + } + + return 0; +} + +static int jack_parse_append_pcm_to_name(pa_config_parser_state *state) { + pa_alsa_path *path; + pa_alsa_jack *jack; + int b; + + pa_assert(state); + + path = state->userdata; + if (!(jack = jack_get(path, state->section))) { + pa_log("[%s:%u] Option 'append_pcm_to_name' not expected in section '%s'", + state->filename, state->lineno, state->section); + return -1; + } + + b = pa_parse_boolean(state->rvalue); + if (b < 0) { + pa_log("[%s:%u] Invalid value for 'append_pcm_to_name': %s", state->filename, state->lineno, state->rvalue); + return -1; + } + + jack->append_pcm_to_name = b; + return 0; +} + +static int element_set_option(pa_alsa_element *e, snd_mixer_t *m, int alsa_idx) { + snd_mixer_selem_id_t *sid; + snd_mixer_elem_t *me; + char buf[64]; + int r; + + pa_assert(e); + pa_assert(m); + + SELEM_INIT(sid, &e->alsa_id); + if (!(me = snd_mixer_find_selem(m, sid))) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_warn("Element %s seems to have disappeared.", buf); + return -1; + } + + if (e->switch_use == PA_ALSA_SWITCH_SELECT) { + + if (e->direction == PA_ALSA_DIRECTION_OUTPUT) + r = snd_mixer_selem_set_playback_switch_all(me, alsa_idx); + else + r = snd_mixer_selem_set_capture_switch_all(me, alsa_idx); + + if (r < 0) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_warn("Failed to set switch of %s: %s", buf, pa_alsa_strerror(errno)); + } + + } else { + pa_assert(e->enumeration_use == PA_ALSA_ENUMERATION_SELECT); + + if ((r = snd_mixer_selem_set_enum_item(me, 0, alsa_idx)) < 0) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_warn("Failed to set enumeration of %s: %s", buf, pa_alsa_strerror(errno)); + } + } + + return r; +} + +static int setting_select(pa_alsa_setting *s, snd_mixer_t *m) { + pa_alsa_option *o; + uint32_t idx; + + pa_assert(s); + pa_assert(m); + + PA_IDXSET_FOREACH(o, s->options, idx) + element_set_option(o->element, m, o->alsa_idx); + + return 0; +} + +static int option_verify(pa_alsa_option *o) { + static const struct description_map well_known_descriptions[] = { + { "input", N_("Input") }, + { "input-docking", N_("Docking Station Input") }, + { "input-docking-microphone", N_("Docking Station Microphone") }, + { "input-docking-linein", N_("Docking Station Line In") }, + { "input-linein", N_("Line In") }, + { "input-microphone", N_("Microphone") }, + { "input-microphone-front", N_("Front Microphone") }, + { "input-microphone-rear", N_("Rear Microphone") }, + { "input-microphone-external", N_("External Microphone") }, + { "input-microphone-internal", N_("Internal Microphone") }, + { "input-radio", N_("Radio") }, + { "input-video", N_("Video") }, + { "input-agc-on", N_("Automatic Gain Control") }, + { "input-agc-off", N_("No Automatic Gain Control") }, + { "input-boost-on", N_("Boost") }, + { "input-boost-off", N_("No Boost") }, + { "output-amplifier-on", N_("Amplifier") }, + { "output-amplifier-off", N_("No Amplifier") }, + { "output-bass-boost-on", N_("Bass Boost") }, + { "output-bass-boost-off", N_("No Bass Boost") }, + { "output-speaker", N_("Speaker") }, + { "output-headphones", N_("Headphones") } + }; + char buf[64]; + + pa_assert(o); + + if (!o->name) { + pa_log("No name set for option %s", o->alsa_name); + return -1; + } + + if (o->element->enumeration_use != PA_ALSA_ENUMERATION_SELECT && + o->element->switch_use != PA_ALSA_SWITCH_SELECT) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &o->element->alsa_id); + pa_log("Element %s of option %s not set for select.", buf, o->name); + return -1; + } + + if (o->element->switch_use == PA_ALSA_SWITCH_SELECT && + !pa_streq(o->alsa_name, "on") && + !pa_streq(o->alsa_name, "off")) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &o->element->alsa_id); + pa_log("Switch %s options need be named off or on ", buf); + return -1; + } + + if (!o->description) + o->description = pa_xstrdup(lookup_description(o->name, + well_known_descriptions, + PA_ELEMENTSOF(well_known_descriptions))); + if (!o->description) + o->description = pa_xstrdup(o->name); + + return 0; +} + +static int element_verify(pa_alsa_element *e) { + pa_alsa_option *o; + char buf[64]; + + pa_assert(e); + +// pa_log_debug("Element %s, path %s: r=%d, r-any=%d, r-abs=%d", e->alsa_name, e->path->name, e->required, e->required_any, e->required_absent); + if ((e->required != PA_ALSA_REQUIRED_IGNORE && e->required == e->required_absent) || + (e->required_any != PA_ALSA_REQUIRED_IGNORE && e->required_any == e->required_absent) || + (e->required_absent == PA_ALSA_REQUIRED_ANY && e->required_any != PA_ALSA_REQUIRED_IGNORE) || + (e->required_absent == PA_ALSA_REQUIRED_ANY && e->required != PA_ALSA_REQUIRED_IGNORE)) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log("Element %s cannot be required and absent at the same time.", buf); + return -1; + } + + if (e->switch_use == PA_ALSA_SWITCH_SELECT && e->enumeration_use == PA_ALSA_ENUMERATION_SELECT) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log("Element %s cannot set select for both switch and enumeration.", buf); + return -1; + } + + PA_LLIST_FOREACH(o, e->options) + if (option_verify(o) < 0) + return -1; + + return 0; +} + +static int path_verify(pa_alsa_path *p) { + static const struct description2_map well_known_descriptions[] = { + { "analog-input", N_("Analog Input"), PA_DEVICE_PORT_TYPE_ANALOG }, + { "analog-input-microphone", N_("Microphone"), PA_DEVICE_PORT_TYPE_MIC }, + { "analog-input-microphone-front", N_("Front Microphone"), PA_DEVICE_PORT_TYPE_MIC }, + { "analog-input-microphone-rear", N_("Rear Microphone"), PA_DEVICE_PORT_TYPE_MIC }, + { "analog-input-microphone-dock", N_("Dock Microphone"), PA_DEVICE_PORT_TYPE_MIC }, + { "analog-input-microphone-internal", N_("Internal Microphone"), PA_DEVICE_PORT_TYPE_MIC }, + { "analog-input-microphone-headset", N_("Headset Microphone"), PA_DEVICE_PORT_TYPE_HEADSET }, + { "analog-input-linein", N_("Line In"), PA_DEVICE_PORT_TYPE_LINE }, + { "analog-input-radio", N_("Radio"), PA_DEVICE_PORT_TYPE_RADIO }, + { "analog-input-video", N_("Video"), PA_DEVICE_PORT_TYPE_VIDEO }, + { "analog-output", N_("Analog Output"), PA_DEVICE_PORT_TYPE_ANALOG }, + { "analog-output-headphones", N_("Headphones"), PA_DEVICE_PORT_TYPE_HEADPHONES }, + { "analog-output-headphones-2", N_("Headphones 2"), PA_DEVICE_PORT_TYPE_HEADPHONES }, + { "analog-output-headphones-mono", N_("Headphones Mono Output"), PA_DEVICE_PORT_TYPE_HEADPHONES }, + { "analog-output-lineout", N_("Line Out"), PA_DEVICE_PORT_TYPE_LINE }, + { "analog-output-mono", N_("Analog Mono Output"), PA_DEVICE_PORT_TYPE_ANALOG }, + { "analog-output-speaker", N_("Speakers"), PA_DEVICE_PORT_TYPE_SPEAKER }, + { "hdmi-output", N_("HDMI / DisplayPort"), PA_DEVICE_PORT_TYPE_HDMI }, + { "iec958-stereo-output", N_("Digital Output (S/PDIF)"), PA_DEVICE_PORT_TYPE_SPDIF }, + { "iec958-stereo-input", N_("Digital Input (S/PDIF)"), PA_DEVICE_PORT_TYPE_SPDIF }, + { "multichannel-input", N_("Multichannel Input"), PA_DEVICE_PORT_TYPE_LINE }, + { "multichannel-output", N_("Multichannel Output"), PA_DEVICE_PORT_TYPE_LINE }, + { "steelseries-arctis-output-game-common", N_("Game Output"), PA_DEVICE_PORT_TYPE_HEADSET }, + { "steelseries-arctis-output-chat-common", N_("Chat Output"), PA_DEVICE_PORT_TYPE_HEADSET }, + }; + + pa_alsa_element *e; + const char *key = p->description_key ? p->description_key : p->name; + const struct description2_map *map = lookup_description2(key, + well_known_descriptions, + PA_ELEMENTSOF(well_known_descriptions)); + + pa_assert(p); + + PA_LLIST_FOREACH(e, p->elements) + if (element_verify(e) < 0) + return -1; + + if (map) { + if (p->device_port_type == PA_DEVICE_PORT_TYPE_UNKNOWN) + p->device_port_type = map->type; + if (!p->description) + p->description = pa_xstrdup(map->description); + } + + if (!p->description) { + if (p->description_key) + pa_log_warn("Path %s: Unrecognized description key: %s", p->name, p->description_key); + + p->description = pa_xstrdup(p->name); + } + + return 0; +} + +static const char *get_default_paths_dir(void) { +#ifdef HAVE_RUNNING_FROM_BUILD_TREE + if (pa_run_from_build_tree()) + return PA_SRCDIR "/modules/alsa/mixer/paths/"; + else +#endif + return PA_ALSA_PATHS_DIR; +} + +pa_alsa_path* pa_alsa_path_new(const char *paths_dir, const char *fname, pa_alsa_direction_t direction) { + pa_alsa_path *p; + char *fn; + int r; + const char *n; + bool mute_during_activation = false; + + pa_config_item items[] = { + /* [General] */ + { "priority", pa_config_parse_unsigned, NULL, "General" }, + { "description-key", pa_config_parse_string, NULL, "General" }, + { "description", pa_config_parse_string, NULL, "General" }, + { "mute-during-activation", pa_config_parse_bool, NULL, "General" }, + { "type", parse_type, NULL, "General" }, + { "eld-device", parse_eld_device, NULL, "General" }, + + /* [Option ...] */ + { "priority", option_parse_priority, NULL, NULL }, + { "name", option_parse_name, NULL, NULL }, + + /* [Jack ...] */ + { "state.plugged", jack_parse_state, NULL, NULL }, + { "state.unplugged", jack_parse_state, NULL, NULL }, + { "append-pcm-to-name", jack_parse_append_pcm_to_name, NULL, NULL }, + + /* [Element ...] */ + { "switch", element_parse_switch, NULL, NULL }, + { "volume", element_parse_volume, NULL, NULL }, + { "enumeration", element_parse_enumeration, NULL, NULL }, + { "override-map.1", element_parse_override_map, NULL, NULL }, + { "override-map.2", element_parse_override_map, NULL, NULL }, + { "override-map.3", element_parse_override_map, NULL, NULL }, + { "override-map.4", element_parse_override_map, NULL, NULL }, + { "override-map.5", element_parse_override_map, NULL, NULL }, + { "override-map.6", element_parse_override_map, NULL, NULL }, + { "override-map.7", element_parse_override_map, NULL, NULL }, + { "override-map.8", element_parse_override_map, NULL, NULL }, +#if POSITION_MASK_CHANNELS > 8 +#error "Add override-map.9+ definitions" +#endif + /* ... later on we might add override-map.3 and so on here ... */ + { "required", element_parse_required, NULL, NULL }, + { "required-any", element_parse_required, NULL, NULL }, + { "required-absent", element_parse_required, NULL, NULL }, + { "direction", element_parse_direction, NULL, NULL }, + { "direction-try-other", element_parse_direction_try_other, NULL, NULL }, + { "volume-limit", element_parse_volume_limit, NULL, NULL }, + { NULL, NULL, NULL, NULL } + }; + + pa_assert(fname); + + p = pa_xnew0(pa_alsa_path, 1); + n = pa_path_get_filename(fname); + p->name = pa_xstrndup(n, strcspn(n, ".")); + p->proplist = pa_proplist_new(); + p->direction = direction; + p->eld_device = -1; + + items[0].data = &p->priority; + items[1].data = &p->description_key; + items[2].data = &p->description; + items[3].data = &mute_during_activation; + + if (!paths_dir) + paths_dir = get_default_paths_dir(); + + fn = pa_maybe_prefix_path(fname, paths_dir); + + r = pa_config_parse(fn, NULL, items, p->proplist, false, p); + pa_xfree(fn); + + if (r < 0) + goto fail; + + p->mute_during_activation = mute_during_activation; + + if (path_verify(p) < 0) + goto fail; + + return p; + +fail: + pa_alsa_path_free(p); + return NULL; +} + +pa_alsa_path *pa_alsa_path_synthesize(const char *element, pa_alsa_direction_t direction) { + pa_alsa_path *p; + pa_alsa_element *e; + char *name; + int index; + + pa_assert(element); + + name = alloca(strlen(element) + 1); + if (alsa_id_decode(element, name, &index)) + return NULL; + + p = pa_xnew0(pa_alsa_path, 1); + p->name = pa_xstrdup(element); + p->direction = direction; + p->proplist = pa_proplist_new(); + + e = pa_xnew0(pa_alsa_element, 1); + e->path = p; + e->alsa_id.name = pa_xstrdup(name); + e->alsa_id.index = index; + e->direction = direction; + e->volume_limit = -1; + + e->switch_use = PA_ALSA_SWITCH_MUTE; + e->volume_use = PA_ALSA_VOLUME_MERGE; + + PA_LLIST_PREPEND(pa_alsa_element, p->elements, e); + p->last_element = e; + return p; +} + +static bool element_drop_unsupported(pa_alsa_element *e) { + pa_alsa_option *o, *n; + + pa_assert(e); + + for (o = e->options; o; o = n) { + n = o->next; + + if (o->alsa_idx < 0) { + PA_LLIST_REMOVE(pa_alsa_option, e->options, o); + option_free(o); + } + } + + return + e->switch_use != PA_ALSA_SWITCH_IGNORE || + e->volume_use != PA_ALSA_VOLUME_IGNORE || + e->enumeration_use != PA_ALSA_ENUMERATION_IGNORE; +} + +static void path_drop_unsupported(pa_alsa_path *p) { + pa_alsa_element *e, *n; + + pa_assert(p); + + for (e = p->elements; e; e = n) { + n = e->next; + + if (!element_drop_unsupported(e)) { + PA_LLIST_REMOVE(pa_alsa_element, p->elements, e); + element_free(e); + } + } +} + +static void path_make_options_unique(pa_alsa_path *p) { + pa_alsa_element *e; + pa_alsa_option *o, *u; + + PA_LLIST_FOREACH(e, p->elements) { + PA_LLIST_FOREACH(o, e->options) { + unsigned i; + char *m; + + for (u = o->next; u; u = u->next) + if (pa_streq(u->name, o->name)) + break; + + if (!u) + continue; + + m = pa_xstrdup(o->name); + + /* OK, this name is not unique, hence let's rename */ + for (i = 1, u = o; u; u = u->next) { + char *nn, *nd; + + if (!pa_streq(u->name, m)) + continue; + + nn = pa_sprintf_malloc("%s-%u", m, i); + pa_xfree(u->name); + u->name = nn; + + nd = pa_sprintf_malloc("%s %u", u->description, i); + pa_xfree(u->description); + u->description = nd; + + i++; + } + + pa_xfree(m); + } + } +} + +static bool element_create_settings(pa_alsa_element *e, pa_alsa_setting *template) { + pa_alsa_option *o; + + for (; e; e = e->next) + if (e->switch_use == PA_ALSA_SWITCH_SELECT || + e->enumeration_use == PA_ALSA_ENUMERATION_SELECT) + break; + + if (!e) + return false; + + for (o = e->options; o; o = o->next) { + pa_alsa_setting *s; + + if (template) { + s = pa_xnewdup(pa_alsa_setting, template, 1); + s->options = pa_idxset_copy(template->options, NULL); + s->name = pa_sprintf_malloc("%s+%s", template->name, o->name); + s->description = + (template->description[0] && o->description[0]) + ? pa_sprintf_malloc("%s / %s", template->description, o->description) + : (template->description[0] + ? pa_xstrdup(template->description) + : pa_xstrdup(o->description)); + + s->priority = PA_MAX(template->priority, o->priority); + } else { + s = pa_xnew0(pa_alsa_setting, 1); + s->options = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + s->name = pa_xstrdup(o->name); + s->description = pa_xstrdup(o->description); + s->priority = o->priority; + } + + pa_idxset_put(s->options, o, NULL); + + if (element_create_settings(e->next, s)) + /* This is not a leaf, so let's get rid of it */ + setting_free(s); + else { + /* This is a leaf, so let's add it */ + PA_LLIST_INSERT_AFTER(pa_alsa_setting, e->path->settings, e->path->last_setting, s); + + e->path->last_setting = s; + } + } + + return true; +} + +static void path_create_settings(pa_alsa_path *p) { + pa_assert(p); + + element_create_settings(p->elements, NULL); +} + +int pa_alsa_path_probe(pa_alsa_path *p, pa_alsa_mapping *mapping, snd_mixer_t *m, bool ignore_dB) { + pa_alsa_element *e; + pa_alsa_jack *j; + double min_dB[PA_CHANNEL_POSITION_MAX], max_dB[PA_CHANNEL_POSITION_MAX]; + pa_channel_position_t t; + pa_channel_position_mask_t path_volume_channels = 0; + bool min_dB_set, max_dB_set; + char buf[64]; + + pa_assert(p); + pa_assert(m); + + if (p->probed) + return p->supported ? 0 : -1; + p->probed = true; + + pa_zero(min_dB); + pa_zero(max_dB); + + pa_log_debug("Probing path '%s'", p->name); + + PA_LLIST_FOREACH(j, p->jacks) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &j->alsa_id); + if (jack_probe(j, mapping, m) < 0) { + p->supported = false; + pa_log_debug("Probe of jack %s failed.", buf); + return -1; + } + pa_log_debug("Probe of jack %s succeeded (%s)", buf, j->has_control ? "found!" : "not found"); + } + + PA_LLIST_FOREACH(e, p->elements) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + if (element_probe(e, m) < 0) { + p->supported = false; + pa_log_debug("Probe of element %s failed.", buf); + return -1; + } + pa_log_debug("Probe of element %s succeeded (volume=%d, switch=%d, enumeration=%d, has_dB=%d).", buf, e->volume_use, e->switch_use, e->enumeration_use, e->has_dB); + + if (ignore_dB) + e->has_dB = false; + + if (e->volume_use == PA_ALSA_VOLUME_MERGE) { + + if (!p->has_volume) { + p->min_volume = e->min_volume; + p->max_volume = e->max_volume; + } + + if (e->has_dB) { + if (!p->has_volume) { + for (t = 0; t < PA_CHANNEL_POSITION_MAX; t++) + if (PA_CHANNEL_POSITION_MASK(t) & e->merged_mask) { + min_dB[t] = e->min_dB; + max_dB[t] = e->max_dB; + path_volume_channels |= PA_CHANNEL_POSITION_MASK(t); + } + + p->has_dB = true; + } else { + + if (p->has_dB) { + for (t = 0; t < PA_CHANNEL_POSITION_MAX; t++) + if (PA_CHANNEL_POSITION_MASK(t) & e->merged_mask) { + min_dB[t] += e->min_dB; + max_dB[t] += e->max_dB; + path_volume_channels |= PA_CHANNEL_POSITION_MASK(t); + } + } else { + /* Hmm, there's another element before us + * which cannot do dB volumes, so we we need + * to 'neutralize' this slider */ + e->volume_use = PA_ALSA_VOLUME_ZERO; + pa_log_info("Zeroing volume of %s on path '%s'", buf, p->name); + } + } + } else if (p->has_volume) { + /* We can't use this volume, so let's ignore it */ + e->volume_use = PA_ALSA_VOLUME_IGNORE; + pa_log_info("Ignoring volume of %s on path '%s' (missing dB info)", buf, p->name); + } + p->has_volume = true; + } + + if (e->switch_use == PA_ALSA_SWITCH_MUTE) + p->has_mute = true; + } + + if (p->has_req_any && !p->req_any_present) { + p->supported = false; + pa_log_debug("Skipping path '%s', none of required-any elements preset.", p->name); + return -1; + } + + path_drop_unsupported(p); + path_make_options_unique(p); + path_create_settings(p); + + p->supported = true; + + p->min_dB = INFINITY; + min_dB_set = false; + p->max_dB = -INFINITY; + max_dB_set = false; + + for (t = 0; t < PA_CHANNEL_POSITION_MAX; t++) { + if (path_volume_channels & PA_CHANNEL_POSITION_MASK(t)) { + if (p->min_dB > min_dB[t]) { + p->min_dB = min_dB[t]; + min_dB_set = true; + } + + if (p->max_dB < max_dB[t]) { + p->max_dB = max_dB[t]; + max_dB_set = true; + } + } + } + + /* this is probably a wrong prediction, but it should be safe */ + if (!min_dB_set) + p->min_dB = -INFINITY; + if (!max_dB_set) + p->max_dB = 0; + + return 0; +} + +void pa_alsa_setting_dump(pa_alsa_setting *s) { + pa_assert(s); + + pa_log_debug("Setting %s (%s) priority=%u", + s->name, + pa_strnull(s->description), + s->priority); +} + +void pa_alsa_jack_dump(pa_alsa_jack *j) { + pa_assert(j); + + pa_log_debug("Jack %s, alsa_name='%s', index='%d', detection %s", j->name, j->alsa_id.name, j->alsa_id.index, j->has_control ? "possible" : "unavailable"); +} + +void pa_alsa_option_dump(pa_alsa_option *o) { + pa_assert(o); + + pa_log_debug("Option %s (%s/%s) index=%i, priority=%u", + o->alsa_name, + pa_strnull(o->name), + pa_strnull(o->description), + o->alsa_idx, + o->priority); +} + +void pa_alsa_element_dump(pa_alsa_element *e) { + char buf[64]; + + pa_alsa_option *o; + pa_assert(e); + + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_debug("Element %s, direction=%i, switch=%i, volume=%i, volume_limit=%li, enumeration=%i, required=%i, required_any=%i, required_absent=%i, mask=0x%llx, n_channels=%u, override_map=%02x", + buf, + e->direction, + e->switch_use, + e->volume_use, + e->volume_limit, + e->enumeration_use, + e->required, + e->required_any, + e->required_absent, + (long long unsigned) e->merged_mask, + e->n_channels, + e->override_map); + + PA_LLIST_FOREACH(o, e->options) + pa_alsa_option_dump(o); +} + +void pa_alsa_path_dump(pa_alsa_path *p) { + pa_alsa_element *e; + pa_alsa_jack *j; + pa_alsa_setting *s; + pa_assert(p); + + pa_log_debug("Path %s (%s), direction=%i, priority=%u, probed=%s, supported=%s, has_mute=%s, has_volume=%s, " + "has_dB=%s, min_volume=%li, max_volume=%li, min_dB=%g, max_dB=%g", + p->name, + pa_strnull(p->description), + p->direction, + p->priority, + pa_yes_no(p->probed), + pa_yes_no(p->supported), + pa_yes_no(p->has_mute), + pa_yes_no(p->has_volume), + pa_yes_no(p->has_dB), + p->min_volume, p->max_volume, + p->min_dB, p->max_dB); + + PA_LLIST_FOREACH(e, p->elements) + pa_alsa_element_dump(e); + + PA_LLIST_FOREACH(j, p->jacks) + pa_alsa_jack_dump(j); + + PA_LLIST_FOREACH(s, p->settings) + pa_alsa_setting_dump(s); +} + +static void element_set_callback(pa_alsa_element *e, snd_mixer_t *m, snd_mixer_elem_callback_t cb, void *userdata) { + snd_mixer_selem_id_t *sid; + snd_mixer_elem_t *me; + char buf[64]; + + pa_assert(e); + pa_assert(m); + pa_assert(cb); + + SELEM_INIT(sid, &e->alsa_id); + if (!(me = snd_mixer_find_selem(m, sid))) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &e->alsa_id); + pa_log_warn("Element %s seems to have disappeared.", buf); + return; + } + + snd_mixer_elem_set_callback(me, cb); + snd_mixer_elem_set_callback_private(me, userdata); +} + +void pa_alsa_path_set_callback(pa_alsa_path *p, snd_mixer_t *m, snd_mixer_elem_callback_t cb, void *userdata) { + pa_alsa_element *e; + + pa_assert(p); + pa_assert(m); + pa_assert(cb); + + PA_LLIST_FOREACH(e, p->elements) + element_set_callback(e, m, cb, userdata); +} + +void pa_alsa_path_set_set_callback(pa_alsa_path_set *ps, snd_mixer_t *m, snd_mixer_elem_callback_t cb, void *userdata) { + pa_alsa_path *p; + void *state; + + pa_assert(ps); + pa_assert(m); + pa_assert(cb); + + PA_HASHMAP_FOREACH(p, ps->paths, state) + pa_alsa_path_set_callback(p, m, cb, userdata); +} + +static pa_alsa_path *profile_set_get_path(pa_alsa_profile_set *ps, const char *path_name) { + pa_alsa_path *path; + + pa_assert(ps); + pa_assert(path_name); + + if ((path = pa_hashmap_get(ps->output_paths, path_name))) + return path; + + return pa_hashmap_get(ps->input_paths, path_name); +} + +static void profile_set_add_path(pa_alsa_profile_set *ps, pa_alsa_path *path) { + pa_assert(ps); + pa_assert(path); + + switch (path->direction) { + case PA_ALSA_DIRECTION_OUTPUT: + pa_assert_se(pa_hashmap_put(ps->output_paths, path->name, path) >= 0); + break; + + case PA_ALSA_DIRECTION_INPUT: + pa_assert_se(pa_hashmap_put(ps->input_paths, path->name, path) >= 0); + break; + + default: + pa_assert_not_reached(); + } +} + +pa_alsa_path_set *pa_alsa_path_set_new(pa_alsa_mapping *m, pa_alsa_direction_t direction, const char *paths_dir) { + pa_alsa_path_set *ps; + char **pn = NULL, **en = NULL, **ie; + pa_alsa_decibel_fix *db_fix; + void *state, *state2; + char name[64]; + int index; + + pa_assert(m); + pa_assert(m->profile_set); + pa_assert(m->profile_set->decibel_fixes); + pa_assert(direction == PA_ALSA_DIRECTION_OUTPUT || direction == PA_ALSA_DIRECTION_INPUT); + + if (m->direction != PA_ALSA_DIRECTION_ANY && m->direction != direction) + return NULL; + + ps = pa_xnew0(pa_alsa_path_set, 1); + ps->direction = direction; + ps->paths = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + + if (direction == PA_ALSA_DIRECTION_OUTPUT) + pn = m->output_path_names; + else + pn = m->input_path_names; + + if (pn) { + char **in; + + for (in = pn; *in; in++) { + pa_alsa_path *p = NULL; + bool duplicate = false; + char **kn; + + for (kn = pn; kn < in; kn++) + if (pa_streq(*kn, *in)) { + duplicate = true; + break; + } + + if (duplicate) + continue; + + p = profile_set_get_path(m->profile_set, *in); + + if (p && p->direction != direction) { + pa_log("Configuration error: Path %s is used both as an input and as an output path.", p->name); + goto fail; + } + + if (!p) { + char *fn = pa_sprintf_malloc("%s.conf", *in); + p = pa_alsa_path_new(paths_dir, fn, direction); + pa_xfree(fn); + if (p) + profile_set_add_path(m->profile_set, p); + } + + if (p) + pa_hashmap_put(ps->paths, p, p); + + } + + goto finish; + } + + if (direction == PA_ALSA_DIRECTION_OUTPUT) + en = m->output_element; + else + en = m->input_element; + + if (!en) + goto fail; + + for (ie = en; *ie; ie++) { + char **je; + pa_alsa_path *p; + + p = pa_alsa_path_synthesize(*ie, direction); + + /* Mark all other passed elements for require-absent */ + for (je = en; *je; je++) { + pa_alsa_element *e; + + if (je == ie) + continue; + + if (strlen(*je) + 1 >= sizeof(name)) { + pa_log("Element identifier %s is too long!", *je); + continue; + } + + if (alsa_id_decode(*je, name, &index)) + continue; + + e = pa_xnew0(pa_alsa_element, 1); + e->path = p; + e->alsa_id.name = pa_xstrdup(name); + e->alsa_id.index = index; + e->direction = direction; + e->required_absent = PA_ALSA_REQUIRED_ANY; + e->volume_limit = -1; + + PA_LLIST_INSERT_AFTER(pa_alsa_element, p->elements, p->last_element, e); + p->last_element = e; + } + + pa_hashmap_put(ps->paths, *ie, p); + } + +finish: + /* Assign decibel fixes to elements. */ + PA_HASHMAP_FOREACH(db_fix, m->profile_set->decibel_fixes, state) { + pa_alsa_path *p; + + PA_HASHMAP_FOREACH(p, ps->paths, state2) { + pa_alsa_element *e; + + PA_LLIST_FOREACH(e, p->elements) { + if (e->volume_use != PA_ALSA_VOLUME_IGNORE && pa_streq(db_fix->name, e->alsa_id.name) && + db_fix->index == e->alsa_id.index) { + /* The profile set that contains the dB fix may be freed + * before the element, so we have to copy the dB fix + * object. */ + e->db_fix = pa_xnewdup(pa_alsa_decibel_fix, db_fix, 1); + e->db_fix->profile_set = NULL; + e->db_fix->name = pa_xstrdup(db_fix->name); + e->db_fix->db_values = pa_xmemdup(db_fix->db_values, (db_fix->max_step - db_fix->min_step + 1) * sizeof(long)); + } + } + } + } + + return ps; + +fail: + if (ps) + pa_alsa_path_set_free(ps); + + return NULL; +} + +void pa_alsa_path_set_dump(pa_alsa_path_set *ps) { + pa_alsa_path *p; + void *state; + pa_assert(ps); + + pa_log_debug("Path Set %p, direction=%i", + (void*) ps, + ps->direction); + + PA_HASHMAP_FOREACH(p, ps->paths, state) + pa_alsa_path_dump(p); +} + +static bool options_have_option(pa_alsa_option *options, const char *alsa_name) { + pa_alsa_option *o; + + pa_assert(options); + pa_assert(alsa_name); + + PA_LLIST_FOREACH(o, options) { + if (pa_streq(o->alsa_name, alsa_name)) + return true; + } + return false; +} + +static bool enumeration_is_subset(pa_alsa_option *a_options, pa_alsa_option *b_options) { + pa_alsa_option *oa, *ob; + + if (!a_options) return true; + if (!b_options) return false; + + /* If there is an option A offers that B does not, then A is not a subset of B. */ + PA_LLIST_FOREACH(oa, a_options) { + bool found = false; + PA_LLIST_FOREACH(ob, b_options) { + if (pa_streq(oa->alsa_name, ob->alsa_name)) { + found = true; + break; + } + } + if (!found) + return false; + } + return true; +} + +/** + * Compares two elements to see if a is a subset of b + */ +static bool element_is_subset(pa_alsa_element *a, pa_alsa_element *b, snd_mixer_t *m) { + char buf[64]; + + pa_assert(a); + pa_assert(b); + pa_assert(m); + + /* General rules: + * Every state is a subset of itself (with caveats for volume_limits and options) + * IGNORE is a subset of every other state */ + + /* Check the volume_use */ + if (a->volume_use != PA_ALSA_VOLUME_IGNORE) { + + /* "Constant" is subset of "Constant" only when their constant values are equal */ + if (a->volume_use == PA_ALSA_VOLUME_CONSTANT && b->volume_use == PA_ALSA_VOLUME_CONSTANT && a->constant_volume != b->constant_volume) + return false; + + /* Different volume uses when b is not "Merge" means we are definitely not a subset */ + if (a->volume_use != b->volume_use && b->volume_use != PA_ALSA_VOLUME_MERGE) + return false; + + /* "Constant" is a subset of "Merge", if there is not a "volume-limit" in "Merge" below the actual constant. + * "Zero" and "Off" are just special cases of "Constant" when comparing to "Merge" + * "Merge" with a "volume-limit" is a subset of "Merge" without a "volume-limit" or with a higher "volume-limit" */ + if (b->volume_use == PA_ALSA_VOLUME_MERGE && b->volume_limit >= 0) { + long a_limit; + + if (a->volume_use == PA_ALSA_VOLUME_CONSTANT) + a_limit = a->constant_volume; + else if (a->volume_use == PA_ALSA_VOLUME_ZERO) { + long dB = 0; + + if (a->db_fix) { + int rounding = (a->direction == PA_ALSA_DIRECTION_OUTPUT ? +1 : -1); + a_limit = decibel_fix_get_step(a->db_fix, &dB, rounding); + } else { + snd_mixer_selem_id_t *sid; + snd_mixer_elem_t *me; + + SELEM_INIT(sid, &a->alsa_id); + if (!(me = snd_mixer_find_selem(m, sid))) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &a->alsa_id); + pa_log_warn("Element %s seems to have disappeared.", buf); + return false; + } + + if (a->direction == PA_ALSA_DIRECTION_OUTPUT) { + if (snd_mixer_selem_ask_playback_dB_vol(me, dB, +1, &a_limit) < 0) + return false; + } else { + if (snd_mixer_selem_ask_capture_dB_vol(me, dB, -1, &a_limit) < 0) + return false; + } + } + } else if (a->volume_use == PA_ALSA_VOLUME_OFF) + a_limit = a->min_volume; + else if (a->volume_use == PA_ALSA_VOLUME_MERGE) + a_limit = a->volume_limit; + else + pa_assert_not_reached(); + + if (a_limit > b->volume_limit) + return false; + } + + if (a->volume_use == PA_ALSA_VOLUME_MERGE) { + int s; + /* If override-maps are different, they're not subsets */ + if (a->n_channels != b->n_channels) + return false; + for (s = 0; s <= SND_MIXER_SCHN_LAST; s++) + if (a->masks[s][a->n_channels-1] != b->masks[s][b->n_channels-1]) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &a->alsa_id); + pa_log_debug("Element %s is not a subset - mask a: 0x%" PRIx64 ", mask b: 0x%" PRIx64 ", at channel %d", + buf, a->masks[s][a->n_channels-1], b->masks[s][b->n_channels-1], s); + return false; + } + } + } + + if (a->switch_use != PA_ALSA_SWITCH_IGNORE) { + /* "On" is a subset of "Mute". + * "Off" is a subset of "Mute". + * "On" is a subset of "Select", if there is an "Option:On" in B. + * "Off" is a subset of "Select", if there is an "Option:Off" in B. + * "Select" is a subset of "Select", if they have the same options (is this always true?). */ + + if (a->switch_use != b->switch_use) { + + if (a->switch_use == PA_ALSA_SWITCH_SELECT || a->switch_use == PA_ALSA_SWITCH_MUTE + || b->switch_use == PA_ALSA_SWITCH_OFF || b->switch_use == PA_ALSA_SWITCH_ON) + return false; + + if (b->switch_use == PA_ALSA_SWITCH_SELECT) { + if (a->switch_use == PA_ALSA_SWITCH_ON) { + if (!options_have_option(b->options, "on")) + return false; + } else if (a->switch_use == PA_ALSA_SWITCH_OFF) { + if (!options_have_option(b->options, "off")) + return false; + } + } + } else if (a->switch_use == PA_ALSA_SWITCH_SELECT) { + if (!enumeration_is_subset(a->options, b->options)) + return false; + } + } + + if (a->enumeration_use != PA_ALSA_ENUMERATION_IGNORE) { + if (b->enumeration_use == PA_ALSA_ENUMERATION_IGNORE) + return false; + if (!enumeration_is_subset(a->options, b->options)) + return false; + } + + return true; +} + +static void path_set_condense(pa_alsa_path_set *ps, snd_mixer_t *m) { + pa_alsa_path *p; + void *state; + + pa_assert(ps); + pa_assert(m); + + /* If we only have one path, then don't bother */ + if (pa_hashmap_size(ps->paths) < 2) + return; + + PA_HASHMAP_FOREACH(p, ps->paths, state) { + pa_alsa_path *p2; + void *state2; + + PA_HASHMAP_FOREACH(p2, ps->paths, state2) { + pa_alsa_element *ea, *eb; + pa_alsa_jack *ja, *jb; + bool is_subset = true; + + if (p == p2) + continue; + + /* If a has a jack that b does not have, a is not a subset */ + PA_LLIST_FOREACH(ja, p->jacks) { + bool exists = false; + + if (!ja->has_control) + continue; + + PA_LLIST_FOREACH(jb, p2->jacks) { + if (jb->has_control && pa_streq(ja->alsa_id.name, jb->alsa_id.name) && + (ja->alsa_id.index == jb->alsa_id.index) && + (ja->state_plugged == jb->state_plugged) && + (ja->state_unplugged == jb->state_unplugged)) { + exists = true; + break; + } + } + + if (!exists) { + is_subset = false; + break; + } + } + + /* Compare the elements of each set... */ + PA_LLIST_FOREACH(ea, p->elements) { + bool found_matching_element = false; + + if (!is_subset) + break; + + PA_LLIST_FOREACH(eb, p2->elements) { + if (pa_streq(ea->alsa_id.name, eb->alsa_id.name) && + ea->alsa_id.index == eb->alsa_id.index) { + found_matching_element = true; + is_subset = element_is_subset(ea, eb, m); + break; + } + } + + if (!found_matching_element) + is_subset = false; + } + + if (is_subset) { + pa_log_debug("Removing path '%s' as it is a subset of '%s'.", p->name, p2->name); + pa_hashmap_remove(ps->paths, p); + break; + } + } + } +} + +static pa_alsa_path* path_set_find_path_by_description(pa_alsa_path_set *ps, const char* description, pa_alsa_path *ignore) { + pa_alsa_path* p; + void *state; + + PA_HASHMAP_FOREACH(p, ps->paths, state) + if (p != ignore && pa_streq(p->description, description)) + return p; + + return NULL; +} + +static void path_set_make_path_descriptions_unique(pa_alsa_path_set *ps) { + pa_alsa_path *p, *q; + void *state, *state2; + + PA_HASHMAP_FOREACH(p, ps->paths, state) { + unsigned i; + char *old_description; + + q = path_set_find_path_by_description(ps, p->description, p); + + if (!q) + continue; + + old_description = pa_xstrdup(p->description); + + /* OK, this description is not unique, hence let's rename */ + i = 1; + PA_HASHMAP_FOREACH(q, ps->paths, state2) { + char *new_description; + + if (!pa_streq(q->description, old_description)) + continue; + + new_description = pa_sprintf_malloc("%s %u", q->description, i); + pa_xfree(q->description); + q->description = new_description; + + i++; + } + + pa_xfree(old_description); + } +} + +static void mapping_free(pa_alsa_mapping *m) { + pa_assert(m); + + pa_xfree(m->name); + pa_xfree(m->description); + pa_xfree(m->description_key); + + pa_proplist_free(m->proplist); + + pa_xstrfreev(m->device_strings); + pa_xstrfreev(m->input_path_names); + pa_xstrfreev(m->output_path_names); + pa_xstrfreev(m->input_element); + pa_xstrfreev(m->output_element); + if (m->input_path_set) + pa_alsa_path_set_free(m->input_path_set); + if (m->output_path_set) + pa_alsa_path_set_free(m->output_path_set); + + pa_assert(!m->input_pcm); + pa_assert(!m->output_pcm); + + pa_alsa_ucm_mapping_context_free(&m->ucm_context); + + pa_xfree(m); +} + +static void profile_free(pa_alsa_profile *p) { + pa_assert(p); + + pa_xfree(p->name); + pa_xfree(p->description); + pa_xfree(p->description_key); + pa_xfree(p->input_name); + pa_xfree(p->output_name); + + pa_xstrfreev(p->input_mapping_names); + pa_xstrfreev(p->output_mapping_names); + + if (p->input_mappings) + pa_idxset_free(p->input_mappings, NULL); + + if (p->output_mappings) + pa_idxset_free(p->output_mappings, NULL); + + pa_xfree(p); +} + +void pa_alsa_profile_set_free(pa_alsa_profile_set *ps) { + pa_assert(ps); + + if (ps->input_paths) + pa_hashmap_free(ps->input_paths); + + if (ps->output_paths) + pa_hashmap_free(ps->output_paths); + + if (ps->profiles) + pa_hashmap_free(ps->profiles); + + if (ps->mappings) + pa_hashmap_free(ps->mappings); + + if (ps->decibel_fixes) + pa_hashmap_free(ps->decibel_fixes); + + pa_xfree(ps); +} + +pa_alsa_mapping *pa_alsa_mapping_get(pa_alsa_profile_set *ps, const char *name) { + pa_alsa_mapping *m; + + if (!pa_startswith(name, "Mapping ")) + return NULL; + + name += 8; + + if ((m = pa_hashmap_get(ps->mappings, name))) + return m; + + m = pa_xnew0(pa_alsa_mapping, 1); + m->profile_set = ps; + m->exact_channels = true; + m->name = pa_xstrdup(name); + pa_sample_spec_init(&m->sample_spec); + pa_channel_map_init(&m->channel_map); + m->proplist = pa_proplist_new(); + m->hw_device_index = -1; + + pa_hashmap_put(ps->mappings, m->name, m); + + return m; +} + +static pa_alsa_profile *profile_get(pa_alsa_profile_set *ps, const char *name) { + pa_alsa_profile *p; + + if (!pa_startswith(name, "Profile ")) + return NULL; + + name += 8; + + if ((p = pa_hashmap_get(ps->profiles, name))) + return p; + + p = pa_xnew0(pa_alsa_profile, 1); + p->profile_set = ps; + p->name = pa_xstrdup(name); + + pa_hashmap_put(ps->profiles, p->name, p); + + return p; +} + +static pa_alsa_decibel_fix *decibel_fix_get(pa_alsa_profile_set *ps, const char *alsa_id) { + pa_alsa_decibel_fix *db_fix; + char *name; + int index; + + if (!pa_startswith(alsa_id, "DecibelFix ")) + return NULL; + + alsa_id += 11; + + if ((db_fix = pa_hashmap_get(ps->decibel_fixes, alsa_id))) + return db_fix; + + name = alloca(strlen(alsa_id) + 1); + if (alsa_id_decode(alsa_id, name, &index)) + return NULL; + + db_fix = pa_xnew0(pa_alsa_decibel_fix, 1); + db_fix->profile_set = ps; + db_fix->name = pa_xstrdup(name); + db_fix->index = index; + db_fix->key = pa_xstrdup(alsa_id); + + pa_hashmap_put(ps->decibel_fixes, db_fix->key, db_fix); + + return db_fix; +} + +static int mapping_parse_device_strings(pa_config_parser_state *state) { + pa_alsa_profile_set *ps; + pa_alsa_mapping *m; + + pa_assert(state); + + ps = state->userdata; + + if (!(m = pa_alsa_mapping_get(ps, state->section))) { + pa_log("[%s:%u] %s invalid in section %s", state->filename, state->lineno, state->lvalue, state->section); + return -1; + } + + pa_xstrfreev(m->device_strings); + if (!(m->device_strings = pa_split_spaces_strv(state->rvalue))) { + pa_log("[%s:%u] Device string list empty of '%s'", state->filename, state->lineno, state->section); + return -1; + } + + return 0; +} + +static int mapping_parse_channel_map(pa_config_parser_state *state) { + pa_alsa_profile_set *ps; + pa_alsa_mapping *m; + + pa_assert(state); + + ps = state->userdata; + + if (!(m = pa_alsa_mapping_get(ps, state->section))) { + pa_log("[%s:%u] %s invalid in section %s", state->filename, state->lineno, state->lvalue, state->section); + return -1; + } + + if (!(pa_channel_map_parse(&m->channel_map, state->rvalue))) { + pa_log("[%s:%u] Channel map invalid of '%s'", state->filename, state->lineno, state->section); + return -1; + } + + return 0; +} + +static int mapping_parse_paths(pa_config_parser_state *state) { + pa_alsa_profile_set *ps; + pa_alsa_mapping *m; + + pa_assert(state); + + ps = state->userdata; + + if (!(m = pa_alsa_mapping_get(ps, state->section))) { + pa_log("[%s:%u] %s invalid in section %s", state->filename, state->lineno, state->lvalue, state->section); + return -1; + } + + if (pa_streq(state->lvalue, "paths-input")) { + pa_xstrfreev(m->input_path_names); + m->input_path_names = pa_split_spaces_strv(state->rvalue); + } else { + pa_xstrfreev(m->output_path_names); + m->output_path_names = pa_split_spaces_strv(state->rvalue); + } + + return 0; +} + +static int mapping_parse_exact_channels(pa_config_parser_state *state) { + pa_alsa_profile_set *ps; + pa_alsa_mapping *m; + int b; + + pa_assert(state); + + ps = state->userdata; + + if (!(m = pa_alsa_mapping_get(ps, state->section))) { + pa_log("[%s:%u] %s invalid in section %s", state->filename, state->lineno, state->lvalue, state->section); + return -1; + } + + if ((b = pa_parse_boolean(state->rvalue)) < 0) { + pa_log("[%s:%u] %s has invalid value '%s'", state->filename, state->lineno, state->lvalue, state->section); + return -1; + } + + m->exact_channels = b; + + return 0; +} + +static int mapping_parse_element(pa_config_parser_state *state) { + pa_alsa_profile_set *ps; + pa_alsa_mapping *m; + + pa_assert(state); + + ps = state->userdata; + + if (!(m = pa_alsa_mapping_get(ps, state->section))) { + pa_log("[%s:%u] %s invalid in section %s", state->filename, state->lineno, state->lvalue, state->section); + return -1; + } + + if (pa_streq(state->lvalue, "element-input")) { + pa_xstrfreev(m->input_element); + m->input_element = pa_split_spaces_strv(state->rvalue); + } else { + pa_xstrfreev(m->output_element); + m->output_element = pa_split_spaces_strv(state->rvalue); + } + + return 0; +} + +static int mapping_parse_direction(pa_config_parser_state *state) { + pa_alsa_profile_set *ps; + pa_alsa_mapping *m; + + pa_assert(state); + + ps = state->userdata; + + if (!(m = pa_alsa_mapping_get(ps, state->section))) { + pa_log("[%s:%u] Section name %s invalid.", state->filename, state->lineno, state->section); + return -1; + } + + if (pa_streq(state->rvalue, "input")) + m->direction = PA_ALSA_DIRECTION_INPUT; + else if (pa_streq(state->rvalue, "output")) + m->direction = PA_ALSA_DIRECTION_OUTPUT; + else if (pa_streq(state->rvalue, "any")) + m->direction = PA_ALSA_DIRECTION_ANY; + else { + pa_log("[%s:%u] Direction %s invalid.", state->filename, state->lineno, state->rvalue); + return -1; + } + + return 0; +} + +static int mapping_parse_description(pa_config_parser_state *state) { + pa_alsa_profile_set *ps; + pa_alsa_profile *p; + pa_alsa_mapping *m; + + pa_assert(state); + + ps = state->userdata; + + if ((m = pa_alsa_mapping_get(ps, state->section))) { + pa_xfree(m->description); + m->description = pa_xstrdup(state->rvalue); + } else if ((p = profile_get(ps, state->section))) { + pa_xfree(p->description); + p->description = pa_xstrdup(state->rvalue); + } else { + pa_log("[%s:%u] Section name %s invalid.", state->filename, state->lineno, state->section); + return -1; + } + + return 0; +} + +static int mapping_parse_description_key(pa_config_parser_state *state) { + pa_alsa_profile_set *ps; + pa_alsa_profile *p; + pa_alsa_mapping *m; + + pa_assert(state); + + ps = state->userdata; + + if ((m = pa_alsa_mapping_get(ps, state->section))) { + pa_xfree(m->description_key); + m->description_key = pa_xstrdup(state->rvalue); + } else if ((p = profile_get(ps, state->section))) { + pa_xfree(p->description_key); + p->description_key = pa_xstrdup(state->rvalue); + } else { + pa_log("[%s:%u] Section name %s invalid.", state->filename, state->lineno, state->section); + return -1; + } + + return 0; +} + + +static int mapping_parse_priority(pa_config_parser_state *state) { + pa_alsa_profile_set *ps; + pa_alsa_profile *p; + pa_alsa_mapping *m; + uint32_t prio; + + pa_assert(state); + + ps = state->userdata; + + if (pa_atou(state->rvalue, &prio) < 0) { + pa_log("[%s:%u] Priority invalid of '%s'", state->filename, state->lineno, state->section); + return -1; + } + + if ((m = pa_alsa_mapping_get(ps, state->section))) + m->priority = prio; + else if ((p = profile_get(ps, state->section))) + p->priority = prio; + else { + pa_log("[%s:%u] Section name %s invalid.", state->filename, state->lineno, state->section); + return -1; + } + + return 0; +} + +static int mapping_parse_fallback(pa_config_parser_state *state) { + pa_alsa_profile_set *ps; + pa_alsa_profile *p; + pa_alsa_mapping *m; + int k; + + pa_assert(state); + + ps = state->userdata; + + if ((k = pa_parse_boolean(state->rvalue)) < 0) { + pa_log("[%s:%u] Fallback invalid of '%s'", state->filename, state->lineno, state->section); + return -1; + } + + if ((m = pa_alsa_mapping_get(ps, state->section))) + m->fallback = k; + else if ((p = profile_get(ps, state->section))) + p->fallback_input = p->fallback_output = k; + else { + pa_log("[%s:%u] Section name %s invalid.", state->filename, state->lineno, state->section); + return -1; + } + + return 0; +} + +static int mapping_parse_intended_roles(pa_config_parser_state *state) { + pa_alsa_profile_set *ps; + pa_alsa_mapping *m; + + pa_assert(state); + + ps = state->userdata; + + if (!(m = pa_alsa_mapping_get(ps, state->section))) { + pa_log("[%s:%u] %s invalid in section %s", state->filename, state->lineno, state->lvalue, state->section); + return -1; + } + + pa_proplist_sets(m->proplist, PA_PROP_DEVICE_INTENDED_ROLES, state->rvalue); + + return 0; +} + + +static int profile_parse_mappings(pa_config_parser_state *state) { + pa_alsa_profile_set *ps; + pa_alsa_profile *p; + + pa_assert(state); + + ps = state->userdata; + + if (!(p = profile_get(ps, state->section))) { + pa_log("[%s:%u] %s invalid in section %s", state->filename, state->lineno, state->lvalue, state->section); + return -1; + } + + if (pa_streq(state->lvalue, "input-mappings")) { + pa_xstrfreev(p->input_mapping_names); + p->input_mapping_names = pa_split_spaces_strv(state->rvalue); + } else { + pa_xstrfreev(p->output_mapping_names); + p->output_mapping_names = pa_split_spaces_strv(state->rvalue); + } + + return 0; +} + +static int profile_parse_skip_probe(pa_config_parser_state *state) { + pa_alsa_profile_set *ps; + pa_alsa_profile *p; + int b; + + pa_assert(state); + + ps = state->userdata; + + if (!(p = profile_get(ps, state->section))) { + pa_log("[%s:%u] %s invalid in section %s", state->filename, state->lineno, state->lvalue, state->section); + return -1; + } + + if ((b = pa_parse_boolean(state->rvalue)) < 0) { + pa_log("[%s:%u] Skip probe invalid of '%s'", state->filename, state->lineno, state->section); + return -1; + } + + p->supported = b; + + return 0; +} + +static int decibel_fix_parse_db_values(pa_config_parser_state *state) { + pa_alsa_profile_set *ps; + pa_alsa_decibel_fix *db_fix; + char **items; + char *item; + long *db_values; + unsigned n = 8; /* Current size of the db_values table. */ + unsigned min_step = 0; + unsigned max_step = 0; + unsigned i = 0; /* Index to the items table. */ + unsigned prev_step = 0; + double prev_db = 0; + + pa_assert(state); + + ps = state->userdata; + + if (!(db_fix = decibel_fix_get(ps, state->section))) { + pa_log("[%s:%u] %s invalid in section %s", state->filename, state->lineno, state->lvalue, state->section); + return -1; + } + + if (!(items = pa_split_spaces_strv(state->rvalue))) { + pa_log("[%s:%u] Value missing", state->filename, state->lineno); + return -1; + } + + db_values = pa_xnew(long, n); + + while ((item = items[i++])) { + char *s = item; /* Step value string. */ + char *d = item; /* dB value string. */ + uint32_t step; + double db; + + /* Move d forward until it points to a colon or to the end of the item. */ + for (; *d && *d != ':'; ++d); + + if (d == s) { + /* item started with colon. */ + pa_log("[%s:%u] No step value found in %s", state->filename, state->lineno, item); + goto fail; + } + + if (!*d || !*(d + 1)) { + /* No colon found, or it was the last character in item. */ + pa_log("[%s:%u] No dB value found in %s", state->filename, state->lineno, item); + goto fail; + } + + /* pa_atou() needs a null-terminating string. Let's replace the colon + * with a zero byte. */ + *d++ = '\0'; + + if (pa_atou(s, &step) < 0) { + pa_log("[%s:%u] Invalid step value: %s", state->filename, state->lineno, s); + goto fail; + } + + if (pa_atod(d, &db) < 0) { + pa_log("[%s:%u] Invalid dB value: %s", state->filename, state->lineno, d); + goto fail; + } + + if (step <= prev_step && i != 1) { + pa_log("[%s:%u] Step value %u not greater than the previous value %u", state->filename, state->lineno, step, prev_step); + goto fail; + } + + if (db < prev_db && i != 1) { + pa_log("[%s:%u] Decibel value %0.2f less than the previous value %0.2f", state->filename, state->lineno, db, prev_db); + goto fail; + } + + if (i == 1) { + min_step = step; + db_values[0] = (long) (db * 100.0); + prev_step = step; + prev_db = db; + } else { + /* Interpolate linearly. */ + double db_increment = (db - prev_db) / (step - prev_step); + + for (; prev_step < step; ++prev_step, prev_db += db_increment) { + + /* Reallocate the db_values table if it's about to overflow. */ + if (prev_step + 1 - min_step == n) { + n *= 2; + db_values = pa_xrenew(long, db_values, n); + } + + db_values[prev_step + 1 - min_step] = (long) ((prev_db + db_increment) * 100.0); + } + } + + max_step = step; + } + + db_fix->min_step = min_step; + db_fix->max_step = max_step; + pa_xfree(db_fix->db_values); + db_fix->db_values = db_values; + + pa_xstrfreev(items); + + return 0; + +fail: + pa_xstrfreev(items); + pa_xfree(db_values); + + return -1; +} + +/* the logic is simple: if we see the jack in multiple paths */ +/* assign all those paths to one availability_group */ +static void profile_set_set_availability_groups(pa_alsa_profile_set *ps) { + pa_dynarray *paths; + pa_alsa_path *p; + void *state; + unsigned idx1; + uint32_t num = 1; + + /* Merge ps->input_paths and ps->output_paths into one dynarray. */ + paths = pa_dynarray_new(NULL); + PA_HASHMAP_FOREACH(p, ps->input_paths, state) + pa_dynarray_append(paths, p); + PA_HASHMAP_FOREACH(p, ps->output_paths, state) + pa_dynarray_append(paths, p); + + PA_DYNARRAY_FOREACH(p, paths, idx1) { + pa_alsa_jack *j; + const char *found = NULL; + bool has_control = false; + + PA_LLIST_FOREACH(j, p->jacks) { + pa_alsa_path *p2; + unsigned idx2; + + if (!j->has_control || j->state_plugged == PA_AVAILABLE_NO) + continue; + has_control = true; + PA_DYNARRAY_FOREACH(p2, paths, idx2) { + pa_alsa_jack *j2; + + if (p2 == p) + break; + PA_LLIST_FOREACH(j2, p2->jacks) { + if (!j2->has_control || j2->state_plugged == PA_AVAILABLE_NO) + continue; + if (pa_streq(j->alsa_id.name, j2->alsa_id.name) && + j->alsa_id.index == j2->alsa_id.index) { + j->state_plugged = PA_AVAILABLE_UNKNOWN; + j2->state_plugged = PA_AVAILABLE_UNKNOWN; + found = p2->availability_group; + break; + } + } + } + if (found) + break; + } + if (!has_control) + continue; + if (!found) { + p->availability_group = pa_sprintf_malloc("Legacy %d", num); + } else { + p->availability_group = pa_xstrdup(found); + } + if (!found) + num++; + } + + pa_dynarray_free(paths); +} + +static void mapping_paths_probe(pa_alsa_mapping *m, pa_alsa_profile *profile, + pa_alsa_direction_t direction, pa_hashmap *used_paths, + pa_hashmap *mixers) { + + pa_alsa_path *p; + void *state; + snd_pcm_t *pcm_handle; + pa_alsa_path_set *ps; + snd_mixer_t *mixer_handle; + + if (direction == PA_ALSA_DIRECTION_OUTPUT) { + if (m->output_path_set) + return; /* Already probed */ + m->output_path_set = ps = pa_alsa_path_set_new(m, direction, NULL); /* FIXME: Handle paths_dir */ + pcm_handle = m->output_pcm; + } else { + if (m->input_path_set) + return; /* Already probed */ + m->input_path_set = ps = pa_alsa_path_set_new(m, direction, NULL); /* FIXME: Handle paths_dir */ + pcm_handle = m->input_pcm; + } + + if (!ps) + return; /* No paths */ + + pa_assert(pcm_handle); + + mixer_handle = pa_alsa_open_mixer_for_pcm(mixers, pcm_handle, true); + if (!mixer_handle) { + /* Cannot open mixer, remove all entries */ + pa_hashmap_remove_all(ps->paths); + return; + } + + PA_HASHMAP_FOREACH(p, ps->paths, state) { + if (p->autodetect_eld_device) + p->eld_device = m->hw_device_index; + + if (pa_alsa_path_probe(p, m, mixer_handle, m->profile_set->ignore_dB) < 0) + pa_hashmap_remove(ps->paths, p); + } + + path_set_condense(ps, mixer_handle); + path_set_make_path_descriptions_unique(ps); + + PA_HASHMAP_FOREACH(p, ps->paths, state) + pa_hashmap_put(used_paths, p, p); + + pa_log_debug("Available mixer paths (after tidying):"); + pa_alsa_path_set_dump(ps); +} + +static int mapping_verify(pa_alsa_mapping *m, const pa_channel_map *bonus) { + + static const struct description_map well_known_descriptions[] = { + { "analog-mono", N_("Analog Mono") }, + { "analog-stereo", N_("Analog Stereo") }, + { "mono-fallback", N_("Mono") }, + { "stereo-fallback", N_("Stereo") }, + /* Note: Not translated to "Analog Stereo Input", because the source + * name gets "Input" appended to it automatically, so adding "Input" + * here would lead to the source name to become "Analog Stereo Input + * Input". The same logic applies to analog-stereo-output, + * multichannel-input and multichannel-output. */ + { "analog-stereo-input", N_("Analog Stereo") }, + { "analog-stereo-output", N_("Analog Stereo") }, + { "multichannel-input", N_("Multichannel") }, + { "multichannel-output", N_("Multichannel") }, + { "analog-surround-21", N_("Analog Surround 2.1") }, + { "analog-surround-30", N_("Analog Surround 3.0") }, + { "analog-surround-31", N_("Analog Surround 3.1") }, + { "analog-surround-40", N_("Analog Surround 4.0") }, + { "analog-surround-41", N_("Analog Surround 4.1") }, + { "analog-surround-50", N_("Analog Surround 5.0") }, + { "analog-surround-51", N_("Analog Surround 5.1") }, + { "analog-surround-61", N_("Analog Surround 6.0") }, + { "analog-surround-61", N_("Analog Surround 6.1") }, + { "analog-surround-70", N_("Analog Surround 7.0") }, + { "analog-surround-71", N_("Analog Surround 7.1") }, + { "iec958-stereo", N_("Digital Stereo (IEC958)") }, + { "iec958-ac3-surround-40", N_("Digital Surround 4.0 (IEC958/AC3)") }, + { "iec958-ac3-surround-51", N_("Digital Surround 5.1 (IEC958/AC3)") }, + { "iec958-dts-surround-51", N_("Digital Surround 5.1 (IEC958/DTS)") }, + { "hdmi-stereo", N_("Digital Stereo (HDMI)") }, + { "hdmi-surround-51", N_("Digital Surround 5.1 (HDMI)") }, + { "gaming-headset-chat", N_("Chat") }, + { "gaming-headset-game", N_("Game") }, + }; + const char *description_key = m->description_key ? m->description_key : m->name; + + pa_assert(m); + + if (!pa_channel_map_valid(&m->channel_map)) { + pa_log("Mapping %s is missing channel map.", m->name); + return -1; + } + + if (!m->device_strings) { + pa_log("Mapping %s is missing device strings.", m->name); + return -1; + } + + if ((m->input_path_names && m->input_element) || + (m->output_path_names && m->output_element)) { + pa_log("Mapping %s must have either mixer path or mixer element, not both.", m->name); + return -1; + } + + if (!m->description) + m->description = pa_xstrdup(lookup_description(description_key, + well_known_descriptions, + PA_ELEMENTSOF(well_known_descriptions))); + + if (!m->description) + m->description = pa_xstrdup(m->name); + + if (bonus) { + if (pa_channel_map_equal(&m->channel_map, bonus)) + m->priority += 50; + else if (m->channel_map.channels == bonus->channels) + m->priority += 30; + } + + return 0; +} + +void pa_alsa_mapping_dump(pa_alsa_mapping *m) { + char cm[PA_CHANNEL_MAP_SNPRINT_MAX]; + + pa_assert(m); + + pa_log_debug("Mapping %s (%s), priority=%u, channel_map=%s, supported=%s, direction=%i", + m->name, + pa_strnull(m->description), + m->priority, + pa_channel_map_snprint(cm, sizeof(cm), &m->channel_map), + pa_yes_no(m->supported), + m->direction); +} + +static void profile_set_add_auto_pair( + pa_alsa_profile_set *ps, + pa_alsa_mapping *m, /* output */ + pa_alsa_mapping *n /* input */) { + + char *name; + pa_alsa_profile *p; + + pa_assert(ps); + pa_assert(m || n); + + if (m && m->direction == PA_ALSA_DIRECTION_INPUT) + return; + + if (n && n->direction == PA_ALSA_DIRECTION_OUTPUT) + return; + + if (m && n) + name = pa_sprintf_malloc("output:%s+input:%s", m->name, n->name); + else if (m) + name = pa_sprintf_malloc("output:%s", m->name); + else + name = pa_sprintf_malloc("input:%s", n->name); + + if (pa_hashmap_get(ps->profiles, name)) { + pa_xfree(name); + return; + } + + p = pa_xnew0(pa_alsa_profile, 1); + p->profile_set = ps; + p->name = name; + + if (m) { + p->output_name = pa_xstrdup(m->name); + p->output_mappings = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + pa_idxset_put(p->output_mappings, m, NULL); + p->priority += m->priority * 100; + p->fallback_output = m->fallback; + } + + if (n) { + p->input_name = pa_xstrdup(n->name); + p->input_mappings = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + pa_idxset_put(p->input_mappings, n, NULL); + p->priority += n->priority; + p->fallback_input = n->fallback; + } + + pa_hashmap_put(ps->profiles, p->name, p); +} + +static void profile_set_add_auto(pa_alsa_profile_set *ps) { + pa_alsa_mapping *m, *n; + void *m_state, *n_state; + + pa_assert(ps); + + /* The order is important here: + 1) try single inputs and outputs before trying their + combination, because if the half-duplex test failed, we don't have + to try full duplex. + 2) try the output right before the input combinations with + that output, because then the output_pcm is not closed between tests. + */ + PA_HASHMAP_FOREACH(n, ps->mappings, n_state) + profile_set_add_auto_pair(ps, NULL, n); + + PA_HASHMAP_FOREACH(m, ps->mappings, m_state) { + profile_set_add_auto_pair(ps, m, NULL); + + PA_HASHMAP_FOREACH(n, ps->mappings, n_state) + profile_set_add_auto_pair(ps, m, n); + } + +} + +static int profile_verify(pa_alsa_profile *p) { + + static const struct description_map well_known_descriptions[] = { + { "output:analog-mono+input:analog-mono", N_("Analog Mono Duplex") }, + { "output:analog-stereo+input:analog-stereo", N_("Analog Stereo Duplex") }, + { "output:iec958-stereo+input:iec958-stereo", N_("Digital Stereo Duplex (IEC958)") }, + { "output:multichannel-output+input:multichannel-input", N_("Multichannel Duplex") }, + { "output:unknown-stereo+input:unknown-stereo", N_("Stereo Duplex") }, + { "off", N_("Off") } + }; + const char *description_key = p->description_key ? p->description_key : p->name; + + pa_assert(p); + + /* Replace the output mapping names by the actual mappings */ + if (p->output_mapping_names) { + char **name; + + pa_assert(!p->output_mappings); + p->output_mappings = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + + for (name = p->output_mapping_names; *name; name++) { + pa_alsa_mapping *m; + char **in; + bool duplicate = false; + + for (in = name + 1; *in; in++) + if (pa_streq(*name, *in)) { + duplicate = true; + break; + } + + if (duplicate) + continue; + + if (!(m = pa_hashmap_get(p->profile_set->mappings, *name)) || m->direction == PA_ALSA_DIRECTION_INPUT) { + pa_log("Profile '%s' refers to nonexistent mapping '%s'.", p->name, *name); + return -1; + } + + pa_idxset_put(p->output_mappings, m, NULL); + + if (p->supported) + m->supported++; + } + + pa_xstrfreev(p->output_mapping_names); + p->output_mapping_names = NULL; + } + + /* Replace the input mapping names by the actual mappings */ + if (p->input_mapping_names) { + char **name; + + pa_assert(!p->input_mappings); + p->input_mappings = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + + for (name = p->input_mapping_names; *name; name++) { + pa_alsa_mapping *m; + char **in; + bool duplicate = false; + + for (in = name + 1; *in; in++) + if (pa_streq(*name, *in)) { + duplicate = true; + break; + } + + if (duplicate) + continue; + + if (!(m = pa_hashmap_get(p->profile_set->mappings, *name)) || m->direction == PA_ALSA_DIRECTION_OUTPUT) { + pa_log("Profile '%s' refers to nonexistent mapping '%s'.", p->name, *name); + return -1; + } + + pa_idxset_put(p->input_mappings, m, NULL); + + if (p->supported) + m->supported++; + } + + pa_xstrfreev(p->input_mapping_names); + p->input_mapping_names = NULL; + } + + if (!p->input_mappings && !p->output_mappings) { + pa_log("Profile '%s' lacks mappings.", p->name); + return -1; + } + + if (!p->description) + p->description = pa_xstrdup(lookup_description(description_key, + well_known_descriptions, + PA_ELEMENTSOF(well_known_descriptions))); + + if (!p->description) { + pa_strbuf *sb; + uint32_t idx; + pa_alsa_mapping *m; + + sb = pa_strbuf_new(); + + if (p->output_mappings) + PA_IDXSET_FOREACH(m, p->output_mappings, idx) { + if (!pa_strbuf_isempty(sb)) + pa_strbuf_puts(sb, " + "); + + pa_strbuf_printf(sb, _("%s Output"), m->description); + } + + if (p->input_mappings) + PA_IDXSET_FOREACH(m, p->input_mappings, idx) { + if (!pa_strbuf_isempty(sb)) + pa_strbuf_puts(sb, " + "); + + pa_strbuf_printf(sb, _("%s Input"), m->description); + } + + p->description = pa_strbuf_to_string_free(sb); + } + + return 0; +} + +void pa_alsa_profile_dump(pa_alsa_profile *p) { + uint32_t idx; + pa_alsa_mapping *m; + pa_assert(p); + + pa_log_debug("Profile %s (%s), input=%s, output=%s priority=%u, supported=%s n_input_mappings=%u, n_output_mappings=%u", + p->name, + pa_strnull(p->description), + pa_strnull(p->input_name), + pa_strnull(p->output_name), + p->priority, + pa_yes_no(p->supported), + p->input_mappings ? pa_idxset_size(p->input_mappings) : 0, + p->output_mappings ? pa_idxset_size(p->output_mappings) : 0); + + if (p->input_mappings) + PA_IDXSET_FOREACH(m, p->input_mappings, idx) + pa_log_debug("Input %s", m->name); + + if (p->output_mappings) + PA_IDXSET_FOREACH(m, p->output_mappings, idx) + pa_log_debug("Output %s", m->name); +} + +static int decibel_fix_verify(pa_alsa_decibel_fix *db_fix) { + pa_assert(db_fix); + + /* Check that the dB mapping has been configured. Since "db-values" is + * currently the only option in the DecibelFix section, and decibel fix + * objects don't get created if a DecibelFix section is empty, this is + * actually a redundant check. Having this may prevent future bugs, + * however. */ + if (!db_fix->db_values) { + pa_log("Decibel fix for element %s lacks the dB values.", db_fix->name); + return -1; + } + + return 0; +} + +void pa_alsa_decibel_fix_dump(pa_alsa_decibel_fix *db_fix) { + char *db_values = NULL; + + pa_assert(db_fix); + + if (db_fix->db_values) { + pa_strbuf *buf; + unsigned long i, nsteps; + + pa_assert(db_fix->min_step <= db_fix->max_step); + nsteps = db_fix->max_step - db_fix->min_step + 1; + + buf = pa_strbuf_new(); + for (i = 0; i < nsteps; ++i) + pa_strbuf_printf(buf, "[%li]:%0.2f ", i + db_fix->min_step, db_fix->db_values[i] / 100.0); + + db_values = pa_strbuf_to_string_free(buf); + } + + pa_log_debug("Decibel fix %s, min_step=%li, max_step=%li, db_values=%s", + db_fix->name, db_fix->min_step, db_fix->max_step, pa_strnull(db_values)); + + pa_xfree(db_values); +} + +pa_alsa_profile_set* pa_alsa_profile_set_new(const char *fname, const pa_channel_map *bonus) { + pa_alsa_profile_set *ps; + pa_alsa_profile *p; + pa_alsa_mapping *m; + pa_alsa_decibel_fix *db_fix; + char *fn; + int r; + void *state; + + static pa_config_item items[] = { + /* [General] */ + { "auto-profiles", pa_config_parse_bool, NULL, "General" }, + + /* [Mapping ...] */ + { "device-strings", mapping_parse_device_strings, NULL, NULL }, + { "channel-map", mapping_parse_channel_map, NULL, NULL }, + { "paths-input", mapping_parse_paths, NULL, NULL }, + { "paths-output", mapping_parse_paths, NULL, NULL }, + { "element-input", mapping_parse_element, NULL, NULL }, + { "element-output", mapping_parse_element, NULL, NULL }, + { "direction", mapping_parse_direction, NULL, NULL }, + { "exact-channels", mapping_parse_exact_channels, NULL, NULL }, + { "intended-roles", mapping_parse_intended_roles, NULL, NULL }, + + /* Shared by [Mapping ...] and [Profile ...] */ + { "description", mapping_parse_description, NULL, NULL }, + { "description-key", mapping_parse_description_key,NULL, NULL }, + { "priority", mapping_parse_priority, NULL, NULL }, + { "fallback", mapping_parse_fallback, NULL, NULL }, + + /* [Profile ...] */ + { "input-mappings", profile_parse_mappings, NULL, NULL }, + { "output-mappings", profile_parse_mappings, NULL, NULL }, + { "skip-probe", profile_parse_skip_probe, NULL, NULL }, + + /* [DecibelFix ...] */ + { "db-values", decibel_fix_parse_db_values, NULL, NULL }, + { NULL, NULL, NULL, NULL } + }; + + ps = pa_xnew0(pa_alsa_profile_set, 1); + ps->mappings = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, (pa_free_cb_t) mapping_free); + ps->profiles = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, (pa_free_cb_t) profile_free); + ps->decibel_fixes = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, (pa_free_cb_t) decibel_fix_free); + ps->input_paths = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, (pa_free_cb_t) pa_alsa_path_free); + ps->output_paths = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, (pa_free_cb_t) pa_alsa_path_free); + + items[0].data = &ps->auto_profiles; + + if (!fname) + fname = "default.conf"; + + fn = pa_maybe_prefix_path(fname, +#ifdef HAVE_RUNNING_FROM_BUILD_TREE + pa_run_from_build_tree() ? PA_SRCDIR "/modules/alsa/mixer/profile-sets/" : +#endif + PA_ALSA_PROFILE_SETS_DIR); + + r = pa_config_parse(fn, NULL, items, NULL, false, ps); + pa_xfree(fn); + + if (r < 0) + goto fail; + + PA_HASHMAP_FOREACH(m, ps->mappings, state) + if (mapping_verify(m, bonus) < 0) + goto fail; + + if (ps->auto_profiles) + profile_set_add_auto(ps); + + PA_HASHMAP_FOREACH(p, ps->profiles, state) + if (profile_verify(p) < 0) + goto fail; + + PA_HASHMAP_FOREACH(db_fix, ps->decibel_fixes, state) + if (decibel_fix_verify(db_fix) < 0) + goto fail; + + return ps; + +fail: + pa_alsa_profile_set_free(ps); + return NULL; +} + +static void profile_finalize_probing(pa_alsa_profile *to_be_finalized, pa_alsa_profile *next) { + pa_alsa_mapping *m; + uint32_t idx; + + if (!to_be_finalized) + return; + + if (to_be_finalized->output_mappings) + PA_IDXSET_FOREACH(m, to_be_finalized->output_mappings, idx) { + + if (!m->output_pcm) + continue; + + if (to_be_finalized->supported) + m->supported++; + + /* If this mapping is also in the next profile, we won't close the + * pcm handle here, because it would get immediately reopened + * anyway. */ + if (next && next->output_mappings && pa_idxset_get_by_data(next->output_mappings, m, NULL)) + continue; + + snd_pcm_close(m->output_pcm); + m->output_pcm = NULL; + } + + if (to_be_finalized->input_mappings) + PA_IDXSET_FOREACH(m, to_be_finalized->input_mappings, idx) { + + if (!m->input_pcm) + continue; + + if (to_be_finalized->supported) + m->supported++; + + /* If this mapping is also in the next profile, we won't close the + * pcm handle here, because it would get immediately reopened + * anyway. */ + if (next && next->input_mappings && pa_idxset_get_by_data(next->input_mappings, m, NULL)) + continue; + + snd_pcm_close(m->input_pcm); + m->input_pcm = NULL; + } +} + +static snd_pcm_t* mapping_open_pcm(pa_alsa_mapping *m, + const pa_sample_spec *ss, + const char *dev_id, + bool exact_channels, + int mode, + unsigned default_n_fragments, + unsigned default_fragment_size_msec) { + + snd_pcm_t* handle; + pa_sample_spec try_ss = *ss; + pa_channel_map try_map = m->channel_map; + snd_pcm_uframes_t try_period_size, try_buffer_size; + + try_ss.channels = try_map.channels; + + try_period_size = + pa_usec_to_bytes(default_fragment_size_msec * PA_USEC_PER_MSEC, &try_ss) / + pa_frame_size(&try_ss); + try_buffer_size = default_n_fragments * try_period_size; + + handle = pa_alsa_open_by_template( + m->device_strings, dev_id, NULL, &try_ss, + &try_map, mode, &try_period_size, + &try_buffer_size, 0, NULL, NULL, exact_channels); + if (handle && !exact_channels && m->channel_map.channels != try_map.channels) { + char buf[PA_CHANNEL_MAP_SNPRINT_MAX]; + pa_log_debug("Channel map for mapping '%s' permanently changed to '%s'", m->name, + pa_channel_map_snprint(buf, sizeof(buf), &try_map)); + m->channel_map = try_map; + } + return handle; +} + +static void paths_drop_unused(pa_hashmap* h, pa_hashmap *keep) { + + void* state = NULL; + const void* key; + pa_alsa_path* p; + + pa_assert(h); + pa_assert(keep); + + p = pa_hashmap_iterate(h, &state, &key); + while (p) { + if (pa_hashmap_get(keep, p) == NULL) + pa_hashmap_remove_and_free(h, key); + p = pa_hashmap_iterate(h, &state, &key); + } +} + +static int add_profiles_to_probe( + pa_alsa_profile **list, + pa_hashmap *profiles, + bool fallback_output, + bool fallback_input) { + + int i = 0; + void *state; + pa_alsa_profile *p; + PA_HASHMAP_FOREACH(p, profiles, state) + if (p->fallback_input == fallback_input && p->fallback_output == fallback_output) { + *list = p; + list++; + i++; + } + return i; +} + +static void mapping_query_hw_device(pa_alsa_mapping *mapping, snd_pcm_t *pcm) { + int r; + snd_pcm_info_t* pcm_info; + snd_pcm_info_alloca(&pcm_info); + + r = snd_pcm_info(pcm, pcm_info); + if (r < 0) { + pa_log("Mapping %s: snd_pcm_info() failed %s: ", mapping->name, pa_alsa_strerror(r)); + return; + } + + /* XXX: It's not clear what snd_pcm_info_get_device() does if the device is + * not backed by a hw device or if it's backed by multiple hw devices. We + * only use hw_device_index for HDMI devices, however, and for those the + * return value is expected to be always valid, so this shouldn't be a + * significant problem. */ + mapping->hw_device_index = snd_pcm_info_get_device(pcm_info); +} + +void pa_alsa_profile_set_probe( + pa_alsa_profile_set *ps, + pa_hashmap *mixers, + const char *dev_id, + const pa_sample_spec *ss, + unsigned default_n_fragments, + unsigned default_fragment_size_msec) { + + bool found_output = false, found_input = false; + + pa_alsa_profile *p, *last = NULL; + pa_alsa_profile **pp, **probe_order; + pa_alsa_mapping *m; + pa_hashmap *broken_inputs, *broken_outputs, *used_paths; + + pa_assert(ps); + pa_assert(dev_id); + pa_assert(ss); + + if (ps->probed) + return; + + broken_inputs = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + broken_outputs = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + used_paths = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + pp = probe_order = pa_xnew0(pa_alsa_profile *, pa_hashmap_size(ps->profiles) + 1); + + pp += add_profiles_to_probe(pp, ps->profiles, false, false); + pp += add_profiles_to_probe(pp, ps->profiles, false, true); + pp += add_profiles_to_probe(pp, ps->profiles, true, false); + pp += add_profiles_to_probe(pp, ps->profiles, true, true); + + for (pp = probe_order; *pp; pp++) { + uint32_t idx; + p = *pp; + + /* Skip if fallback and already found something */ + if (found_input && p->fallback_input) + continue; + if (found_output && p->fallback_output) + continue; + + /* Skip if this is already marked that it is supported (i.e. from the config file) */ + if (!p->supported) { + + profile_finalize_probing(last, p); + p->supported = true; + + if (p->output_mappings) { + PA_IDXSET_FOREACH(m, p->output_mappings, idx) { + if (pa_hashmap_get(broken_outputs, m) == m) { + pa_log_debug("Skipping profile %s - will not be able to open output:%s", p->name, m->name); + p->supported = false; + break; + } + } + } + + if (p->input_mappings && p->supported) { + PA_IDXSET_FOREACH(m, p->input_mappings, idx) { + if (pa_hashmap_get(broken_inputs, m) == m) { + pa_log_debug("Skipping profile %s - will not be able to open input:%s", p->name, m->name); + p->supported = false; + break; + } + } + } + + if (p->supported) + pa_log_debug("Looking at profile %s", p->name); + + /* Check if we can open all new ones */ + if (p->output_mappings && p->supported) + PA_IDXSET_FOREACH(m, p->output_mappings, idx) { + + if (m->output_pcm) + continue; + + pa_log_debug("Checking for playback on %s (%s)", m->description, m->name); + if (!(m->output_pcm = mapping_open_pcm(m, ss, dev_id, m->exact_channels, + SND_PCM_STREAM_PLAYBACK, + default_n_fragments, + default_fragment_size_msec))) { + p->supported = false; + if (pa_idxset_size(p->output_mappings) == 1 && + ((!p->input_mappings) || pa_idxset_size(p->input_mappings) == 0)) { + pa_log_debug("Caching failure to open output:%s", m->name); + pa_hashmap_put(broken_outputs, m, m); + } + break; + } + + if (m->hw_device_index < 0) + mapping_query_hw_device(m, m->output_pcm); + } + + if (p->input_mappings && p->supported) + PA_IDXSET_FOREACH(m, p->input_mappings, idx) { + + if (m->input_pcm) + continue; + + pa_log_debug("Checking for recording on %s (%s)", m->description, m->name); + if (!(m->input_pcm = mapping_open_pcm(m, ss, dev_id, m->exact_channels, + SND_PCM_STREAM_CAPTURE, + default_n_fragments, + default_fragment_size_msec))) { + p->supported = false; + if (pa_idxset_size(p->input_mappings) == 1 && + ((!p->output_mappings) || pa_idxset_size(p->output_mappings) == 0)) { + pa_log_debug("Caching failure to open input:%s", m->name); + pa_hashmap_put(broken_inputs, m, m); + } + break; + } + + if (m->hw_device_index < 0) + mapping_query_hw_device(m, m->input_pcm); + } + + last = p; + + if (!p->supported) + continue; + } + + pa_log_debug("Profile %s supported.", p->name); + + if (p->output_mappings) + PA_IDXSET_FOREACH(m, p->output_mappings, idx) + if (m->output_pcm) { + found_output |= !p->fallback_output; + mapping_paths_probe(m, p, PA_ALSA_DIRECTION_OUTPUT, used_paths, mixers); + } + + if (p->input_mappings) + PA_IDXSET_FOREACH(m, p->input_mappings, idx) + if (m->input_pcm) { + found_input |= !p->fallback_input; + mapping_paths_probe(m, p, PA_ALSA_DIRECTION_INPUT, used_paths, mixers); + } + } + + /* Clean up */ + profile_finalize_probing(last, NULL); + + pa_alsa_profile_set_drop_unsupported(ps); + + paths_drop_unused(ps->input_paths, used_paths); + paths_drop_unused(ps->output_paths, used_paths); + pa_hashmap_free(broken_inputs); + pa_hashmap_free(broken_outputs); + pa_hashmap_free(used_paths); + pa_xfree(probe_order); + + profile_set_set_availability_groups(ps); + + ps->probed = true; +} + +void pa_alsa_profile_set_dump(pa_alsa_profile_set *ps) { + pa_alsa_profile *p; + pa_alsa_mapping *m; + pa_alsa_decibel_fix *db_fix; + void *state; + + pa_assert(ps); + + pa_log_debug("Profile set %p, auto_profiles=%s, probed=%s, n_mappings=%u, n_profiles=%u, n_decibel_fixes=%u", + (void*) + ps, + pa_yes_no(ps->auto_profiles), + pa_yes_no(ps->probed), + pa_hashmap_size(ps->mappings), + pa_hashmap_size(ps->profiles), + pa_hashmap_size(ps->decibel_fixes)); + + PA_HASHMAP_FOREACH(m, ps->mappings, state) + pa_alsa_mapping_dump(m); + + PA_HASHMAP_FOREACH(p, ps->profiles, state) + pa_alsa_profile_dump(p); + + PA_HASHMAP_FOREACH(db_fix, ps->decibel_fixes, state) + pa_alsa_decibel_fix_dump(db_fix); +} + +void pa_alsa_profile_set_drop_unsupported(pa_alsa_profile_set *ps) { + pa_alsa_profile *p; + pa_alsa_mapping *m; + void *state; + + PA_HASHMAP_FOREACH(p, ps->profiles, state) { + if (!p->supported) + pa_hashmap_remove_and_free(ps->profiles, p->name); + } + + PA_HASHMAP_FOREACH(m, ps->mappings, state) { + if (m->supported <= 0) + pa_hashmap_remove_and_free(ps->mappings, m->name); + } +} + +static pa_device_port* device_port_alsa_init(pa_hashmap *ports, /* card ports */ + const char* name, + const char* description, + pa_alsa_path *path, + pa_alsa_setting *setting, + pa_card_profile *cp, + pa_hashmap *extra, /* sink/source ports */ + pa_core *core) { + + pa_device_port *p; + + pa_assert(path); + + p = pa_hashmap_get(ports, name); + + if (!p) { + pa_alsa_port_data *data; + pa_device_port_new_data port_data; + + pa_device_port_new_data_init(&port_data); + pa_device_port_new_data_set_name(&port_data, name); + pa_device_port_new_data_set_description(&port_data, description); + pa_device_port_new_data_set_direction(&port_data, path->direction == PA_ALSA_DIRECTION_OUTPUT ? PA_DIRECTION_OUTPUT : PA_DIRECTION_INPUT); + pa_device_port_new_data_set_type(&port_data, path->device_port_type); + pa_device_port_new_data_set_availability_group(&port_data, path->availability_group); + + p = pa_device_port_new(core, &port_data, sizeof(pa_alsa_port_data)); + pa_device_port_new_data_done(&port_data); + pa_assert(p); + pa_hashmap_put(ports, p->name, p); + pa_proplist_update(p->proplist, PA_UPDATE_REPLACE, path->proplist); + + data = PA_DEVICE_PORT_DATA(p); + /* Ownership of the path and setting is not transferred to the port data, so we don't deal with freeing them */ + data->path = path; + data->setting = setting; + path->port = p; + } + + if (cp) + pa_hashmap_put(p->profiles, cp->name, cp); + + if (extra) { + pa_hashmap_put(extra, p->name, p); + pa_device_port_ref(p); + } + + return p; +} + +void pa_alsa_path_set_add_ports( + pa_alsa_path_set *ps, + pa_card_profile *cp, + pa_hashmap *ports, /* card ports */ + pa_hashmap *extra, /* sink/source ports */ + pa_core *core) { + + pa_alsa_path *path; + void *state; + + pa_assert(ports); + + if (!ps) + return; + + PA_HASHMAP_FOREACH(path, ps->paths, state) { + if (!path->settings || !path->settings->next) { + /* If there is no or just one setting we only need a + * single entry */ + pa_device_port *port = device_port_alsa_init(ports, path->name, + path->description, path, path->settings, cp, extra, core); + port->priority = path->priority * 100; + + } else { + pa_alsa_setting *s; + PA_LLIST_FOREACH(s, path->settings) { + pa_device_port *port; + char *n, *d; + + n = pa_sprintf_malloc("%s;%s", path->name, s->name); + + if (s->description[0]) + d = pa_sprintf_malloc("%s / %s", path->description, s->description); + else + d = pa_xstrdup(path->description); + + port = device_port_alsa_init(ports, n, d, path, s, cp, extra, core); + port->priority = path->priority * 100 + s->priority; + + pa_xfree(n); + pa_xfree(d); + } + } + } +} + +void pa_alsa_add_ports(void *sink_or_source_new_data, pa_alsa_path_set *ps, pa_card *card) { + pa_hashmap *ports; + + pa_assert(sink_or_source_new_data); + pa_assert(ps); + + if (ps->direction == PA_ALSA_DIRECTION_OUTPUT) + ports = ((pa_sink_new_data *) sink_or_source_new_data)->ports; + else + ports = ((pa_source_new_data *) sink_or_source_new_data)->ports; + + if (ps->paths && pa_hashmap_size(ps->paths) > 0) { + pa_assert(card); + pa_alsa_path_set_add_ports(ps, NULL, card->ports, ports, card->core); + } + + pa_log_debug("Added %u ports", pa_hashmap_size(ports)); +} diff --git a/src/modules/alsa/alsa-mixer.h b/src/modules/alsa/alsa-mixer.h new file mode 100644 index 0000000..db83102 --- /dev/null +++ b/src/modules/alsa/alsa-mixer.h @@ -0,0 +1,411 @@ +#ifndef fooalsamixerhfoo +#define fooalsamixerhfoo + +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#include + +#include +#include +#include +#include + +#include +#include + +typedef struct pa_alsa_fdlist pa_alsa_fdlist; +typedef struct pa_alsa_mixer pa_alsa_mixer; +typedef struct pa_alsa_mixer_pdata pa_alsa_mixer_pdata; +typedef struct pa_alsa_setting pa_alsa_setting; +typedef struct pa_alsa_mixer_id pa_alsa_mixer_id; +typedef struct pa_alsa_option pa_alsa_option; +typedef struct pa_alsa_element pa_alsa_element; +typedef struct pa_alsa_jack pa_alsa_jack; +typedef struct pa_alsa_path pa_alsa_path; +typedef struct pa_alsa_path_set pa_alsa_path_set; +typedef struct pa_alsa_mapping pa_alsa_mapping; +typedef struct pa_alsa_profile pa_alsa_profile; +typedef struct pa_alsa_decibel_fix pa_alsa_decibel_fix; +typedef struct pa_alsa_profile_set pa_alsa_profile_set; +typedef struct pa_alsa_port_data pa_alsa_port_data; + +#include "alsa-util.h" +#include "alsa-ucm.h" + +#define POSITION_MASK_CHANNELS 8 + +typedef enum pa_alsa_switch_use { + PA_ALSA_SWITCH_IGNORE, + PA_ALSA_SWITCH_MUTE, /* make this switch follow mute status */ + PA_ALSA_SWITCH_OFF, /* set this switch to 'off' unconditionally */ + PA_ALSA_SWITCH_ON, /* set this switch to 'on' unconditionally */ + PA_ALSA_SWITCH_SELECT /* allow the user to select switch status through a setting */ +} pa_alsa_switch_use_t; + +typedef enum pa_alsa_volume_use { + PA_ALSA_VOLUME_IGNORE, + PA_ALSA_VOLUME_MERGE, /* merge this volume slider into the global volume slider */ + PA_ALSA_VOLUME_OFF, /* set this volume to minimal unconditionally */ + PA_ALSA_VOLUME_ZERO, /* set this volume to 0dB unconditionally */ + PA_ALSA_VOLUME_CONSTANT /* set this volume to a constant value unconditionally */ +} pa_alsa_volume_use_t; + +typedef enum pa_alsa_enumeration_use { + PA_ALSA_ENUMERATION_IGNORE, + PA_ALSA_ENUMERATION_SELECT +} pa_alsa_enumeration_use_t; + +typedef enum pa_alsa_required { + PA_ALSA_REQUIRED_IGNORE, + PA_ALSA_REQUIRED_SWITCH, + PA_ALSA_REQUIRED_VOLUME, + PA_ALSA_REQUIRED_ENUMERATION, + PA_ALSA_REQUIRED_ANY +} pa_alsa_required_t; + +typedef enum pa_alsa_direction { + PA_ALSA_DIRECTION_ANY, + PA_ALSA_DIRECTION_OUTPUT, + PA_ALSA_DIRECTION_INPUT +} pa_alsa_direction_t; + +/* A setting combines a couple of options into a single entity that + * may be selected. Only one setting can be active at the same + * time. */ +struct pa_alsa_setting { + pa_alsa_path *path; + PA_LLIST_FIELDS(pa_alsa_setting); + + pa_idxset *options; + + char *name; + char *description; + unsigned priority; +}; + +/* An entry for one ALSA mixer */ +struct pa_alsa_mixer { + snd_mixer_t *mixer_handle; + int card_index; + pa_alsa_fdlist *fdl; + bool used_for_probe_only:1; +}; + +/* ALSA mixer element identifier */ +struct pa_alsa_mixer_id { + char *name; + int index; +}; + +char *pa_alsa_mixer_id_to_string(char *dst, size_t dst_len, pa_alsa_mixer_id *id); + +/* An option belongs to an element and refers to one enumeration item + * of the element is an enumeration item, or a switch status if the + * element is a switch item. */ +struct pa_alsa_option { + pa_alsa_element *element; + PA_LLIST_FIELDS(pa_alsa_option); + + char *alsa_name; + int alsa_idx; + + char *name; + char *description; + unsigned priority; + + pa_alsa_required_t required; + pa_alsa_required_t required_any; + pa_alsa_required_t required_absent; +}; + +/* An element wraps one specific ALSA element. A series of elements + * make up a path (see below). If the element is an enumeration or switch + * element it may include a list of options. */ +struct pa_alsa_element { + pa_alsa_path *path; + PA_LLIST_FIELDS(pa_alsa_element); + + struct pa_alsa_mixer_id alsa_id; + pa_alsa_direction_t direction; + + pa_alsa_switch_use_t switch_use; + pa_alsa_volume_use_t volume_use; + pa_alsa_enumeration_use_t enumeration_use; + + pa_alsa_required_t required; + pa_alsa_required_t required_any; + pa_alsa_required_t required_absent; + + long constant_volume; + + unsigned int override_map; + bool direction_try_other:1; + + bool has_dB:1; + long min_volume, max_volume; + long volume_limit; /* -1 for no configured limit */ + double min_dB, max_dB; + + pa_channel_position_mask_t masks[SND_MIXER_SCHN_LAST + 1][POSITION_MASK_CHANNELS]; + unsigned n_channels; + + pa_channel_position_mask_t merged_mask; + + PA_LLIST_HEAD(pa_alsa_option, options); + + pa_alsa_decibel_fix *db_fix; +}; + +struct pa_alsa_jack { + pa_alsa_path *path; + PA_LLIST_FIELDS(pa_alsa_jack); + + snd_mixer_t *mixer_handle; + char *mixer_device_name; + + struct pa_alsa_mixer_id alsa_id; + char *name; /* E g "Headphone" */ + bool has_control; /* is the jack itself present? */ + bool plugged_in; /* is this jack currently plugged in? */ + snd_mixer_elem_t *melem; /* Jack detection handle */ + pa_available_t state_unplugged, state_plugged; + + pa_alsa_required_t required; + pa_alsa_required_t required_any; + pa_alsa_required_t required_absent; + + pa_dynarray *ucm_devices; /* pa_alsa_ucm_device */ + pa_dynarray *ucm_hw_mute_devices; /* pa_alsa_ucm_device */ + + bool append_pcm_to_name; +}; + +pa_alsa_jack *pa_alsa_jack_new(pa_alsa_path *path, const char *mixer_device_name, const char *name, int index); +void pa_alsa_jack_free(pa_alsa_jack *jack); +void pa_alsa_jack_set_has_control(pa_alsa_jack *jack, bool has_control); +void pa_alsa_jack_set_plugged_in(pa_alsa_jack *jack, bool plugged_in); +void pa_alsa_jack_add_ucm_device(pa_alsa_jack *jack, pa_alsa_ucm_device *device); +void pa_alsa_jack_add_ucm_hw_mute_device(pa_alsa_jack *jack, pa_alsa_ucm_device *device); + +/* A path wraps a series of elements into a single entity which can be + * used to control it as if it had a single volume slider, a single + * mute switch and a single list of selectable options. */ +struct pa_alsa_path { + pa_alsa_direction_t direction; + pa_device_port* port; + + char *name; + char *description_key; + char *description; + char *availability_group; + pa_device_port_type_t device_port_type; + unsigned priority; + bool autodetect_eld_device; + pa_alsa_mixer *eld_mixer_handle; + int eld_device; + pa_proplist *proplist; + + bool probed:1; + bool supported:1; + bool has_mute:1; + bool has_volume:1; + bool has_dB:1; + bool mute_during_activation:1; + /* These two are used during probing only */ + bool has_req_any:1; + bool req_any_present:1; + + long min_volume, max_volume; + double min_dB, max_dB; + + /* This is used during parsing only, as a shortcut so that we + * don't have to iterate the list all the time */ + pa_alsa_element *last_element; + pa_alsa_option *last_option; + pa_alsa_setting *last_setting; + pa_alsa_jack *last_jack; + + PA_LLIST_HEAD(pa_alsa_element, elements); + PA_LLIST_HEAD(pa_alsa_setting, settings); + PA_LLIST_HEAD(pa_alsa_jack, jacks); +}; + +/* A path set is simply a set of paths that are applicable to a + * device */ +struct pa_alsa_path_set { + pa_hashmap *paths; + pa_alsa_direction_t direction; +}; + +void pa_alsa_setting_dump(pa_alsa_setting *s); + +void pa_alsa_option_dump(pa_alsa_option *o); +void pa_alsa_jack_dump(pa_alsa_jack *j); +void pa_alsa_element_dump(pa_alsa_element *e); + +pa_alsa_path *pa_alsa_path_new(const char *paths_dir, const char *fname, pa_alsa_direction_t direction); +pa_alsa_path *pa_alsa_path_synthesize(const char *element, pa_alsa_direction_t direction); +pa_alsa_element *pa_alsa_element_get(pa_alsa_path *p, const char *section, bool prefixed); +int pa_alsa_path_probe(pa_alsa_path *p, pa_alsa_mapping *mapping, snd_mixer_t *m, bool ignore_dB); +void pa_alsa_path_dump(pa_alsa_path *p); +int pa_alsa_path_get_volume(pa_alsa_path *p, snd_mixer_t *m, const pa_channel_map *cm, pa_cvolume *v); +int pa_alsa_path_get_mute(pa_alsa_path *path, snd_mixer_t *m, bool *muted); +int pa_alsa_path_set_volume(pa_alsa_path *path, snd_mixer_t *m, const pa_channel_map *cm, pa_cvolume *v, bool deferred_volume, bool write_to_hw); +int pa_alsa_path_set_mute(pa_alsa_path *path, snd_mixer_t *m, bool muted); +int pa_alsa_path_select(pa_alsa_path *p, pa_alsa_setting *s, snd_mixer_t *m, bool device_is_muted); +void pa_alsa_path_set_callback(pa_alsa_path *p, snd_mixer_t *m, snd_mixer_elem_callback_t cb, void *userdata); +void pa_alsa_path_free(pa_alsa_path *p); + +pa_alsa_path_set *pa_alsa_path_set_new(pa_alsa_mapping *m, pa_alsa_direction_t direction, const char *paths_dir); +void pa_alsa_path_set_dump(pa_alsa_path_set *s); +void pa_alsa_path_set_set_callback(pa_alsa_path_set *ps, snd_mixer_t *m, snd_mixer_elem_callback_t cb, void *userdata); +void pa_alsa_path_set_free(pa_alsa_path_set *s); +int pa_alsa_path_set_is_empty(pa_alsa_path_set *s); + +struct pa_alsa_mapping { + pa_alsa_profile_set *profile_set; + + char *name; + char *description; + char *description_key; + unsigned priority; + pa_alsa_direction_t direction; + /* These are copied over to the resultant sink/source */ + pa_proplist *proplist; + + pa_sample_spec sample_spec; + pa_channel_map channel_map; + + char **device_strings; + + char **input_path_names; + char **output_path_names; + char **input_element; /* list of fallbacks */ + char **output_element; + pa_alsa_path_set *input_path_set; + pa_alsa_path_set *output_path_set; + + unsigned supported; + bool exact_channels:1; + bool fallback:1; + + /* The "y" in "hw:x,y". This is set to -1 before the device index has been + * queried, or if the query failed. */ + int hw_device_index; + + /* Temporarily used during probing */ + snd_pcm_t *input_pcm; + snd_pcm_t *output_pcm; + + pa_sink *sink; + pa_source *source; + + /* ucm device context*/ + pa_alsa_ucm_mapping_context ucm_context; +}; + +struct pa_alsa_profile { + pa_alsa_profile_set *profile_set; + + char *name; + char *description; + char *description_key; + unsigned priority; + + char *input_name; + char *output_name; + + bool supported:1; + bool fallback_input:1; + bool fallback_output:1; + + char **input_mapping_names; + char **output_mapping_names; + + pa_idxset *input_mappings; + pa_idxset *output_mappings; +}; + +struct pa_alsa_decibel_fix { + char *key; + + pa_alsa_profile_set *profile_set; + + char *name; /* Alsa volume element name. */ + int index; /* Alsa volume element index. */ + long min_step; + long max_step; + + /* An array that maps alsa volume element steps to decibels. The steps can + * be used as indices to this array, after subtracting min_step from the + * real value. + * + * The values are actually stored as integers representing millibels, + * because that's the format the alsa API uses. */ + long *db_values; +}; + +struct pa_alsa_profile_set { + pa_hashmap *mappings; + pa_hashmap *profiles; + pa_hashmap *decibel_fixes; + pa_hashmap *input_paths; + pa_hashmap *output_paths; + + bool auto_profiles; + bool ignore_dB:1; + bool probed:1; +}; + +void pa_alsa_mapping_dump(pa_alsa_mapping *m); +void pa_alsa_profile_dump(pa_alsa_profile *p); +void pa_alsa_decibel_fix_dump(pa_alsa_decibel_fix *db_fix); +pa_alsa_mapping *pa_alsa_mapping_get(pa_alsa_profile_set *ps, const char *name); + +pa_alsa_profile_set* pa_alsa_profile_set_new(const char *fname, const pa_channel_map *bonus); +void pa_alsa_profile_set_probe(pa_alsa_profile_set *ps, pa_hashmap *mixers, const char *dev_id, const pa_sample_spec *ss, unsigned default_n_fragments, unsigned default_fragment_size_msec); +void pa_alsa_profile_set_free(pa_alsa_profile_set *s); +void pa_alsa_profile_set_dump(pa_alsa_profile_set *s); +void pa_alsa_profile_set_drop_unsupported(pa_alsa_profile_set *s); + +pa_alsa_fdlist *pa_alsa_fdlist_new(void); +void pa_alsa_fdlist_free(pa_alsa_fdlist *fdl); +int pa_alsa_fdlist_set_handle(pa_alsa_fdlist *fdl, snd_mixer_t *mixer_handle, snd_hctl_t *hctl_handle, pa_mainloop_api* m); + +/* Alternative for handling alsa mixer events in io-thread. */ + +pa_alsa_mixer_pdata *pa_alsa_mixer_pdata_new(void); +void pa_alsa_mixer_pdata_free(pa_alsa_mixer_pdata *pd); +int pa_alsa_set_mixer_rtpoll(struct pa_alsa_mixer_pdata *pd, snd_mixer_t *mixer, pa_rtpoll *rtp); + +/* Data structure for inclusion in pa_device_port for alsa + * sinks/sources. This contains nothing that needs to be freed + * individually */ +struct pa_alsa_port_data { + pa_alsa_path *path; + pa_alsa_setting *setting; + bool suspend_when_unavailable; +}; + +void pa_alsa_add_ports(void *sink_or_source_new_data, pa_alsa_path_set *ps, pa_card *card); +void pa_alsa_path_set_add_ports(pa_alsa_path_set *ps, pa_card_profile *cp, pa_hashmap *ports, pa_hashmap *extra, pa_core *core); + +#endif diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c new file mode 100644 index 0000000..f7fef8a --- /dev/null +++ b/src/modules/alsa/alsa-sink.c @@ -0,0 +1,2832 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2008 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include + +#ifdef HAVE_VALGRIND_MEMCHECK_H +#include +#endif + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "alsa-util.h" +#include "alsa-sink.h" + +/* #define DEBUG_TIMING */ + +#define DEFAULT_DEVICE "default" + +#define DEFAULT_TSCHED_BUFFER_USEC (2*PA_USEC_PER_SEC) /* 2s -- Overall buffer size */ +#define DEFAULT_TSCHED_WATERMARK_USEC (20*PA_USEC_PER_MSEC) /* 20ms -- Fill up when only this much is left in the buffer */ + +#define TSCHED_WATERMARK_INC_STEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms -- On underrun, increase watermark by this */ +#define TSCHED_WATERMARK_DEC_STEP_USEC (5*PA_USEC_PER_MSEC) /* 5ms -- When everything's great, decrease watermark by this */ +#define TSCHED_WATERMARK_VERIFY_AFTER_USEC (20*PA_USEC_PER_SEC) /* 20s -- How long after a drop out recheck if things are good now */ +#define TSCHED_WATERMARK_INC_THRESHOLD_USEC (0*PA_USEC_PER_MSEC) /* 0ms -- If the buffer level ever below this threshold, increase the watermark */ +#define TSCHED_WATERMARK_DEC_THRESHOLD_USEC (100*PA_USEC_PER_MSEC) /* 100ms -- If the buffer level didn't drop below this threshold in the verification time, decrease the watermark */ + +/* Note that TSCHED_WATERMARK_INC_THRESHOLD_USEC == 0 means that we + * will increase the watermark only if we hit a real underrun. */ + +#define TSCHED_MIN_SLEEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms -- Sleep at least 10ms on each iteration */ +#define TSCHED_MIN_WAKEUP_USEC (4*PA_USEC_PER_MSEC) /* 4ms -- Wakeup at least this long before the buffer runs empty*/ + +#define SMOOTHER_WINDOW_USEC (10*PA_USEC_PER_SEC) /* 10s -- smoother windows size */ +#define SMOOTHER_ADJUST_USEC (1*PA_USEC_PER_SEC) /* 1s -- smoother adjust time */ + +#define SMOOTHER_MIN_INTERVAL (2*PA_USEC_PER_MSEC) /* 2ms -- min smoother update interval */ +#define SMOOTHER_MAX_INTERVAL (200*PA_USEC_PER_MSEC) /* 200ms -- max smoother update interval */ + +#define VOLUME_ACCURACY (PA_VOLUME_NORM/100) /* don't require volume adjustments to be perfectly correct. don't necessarily extend granularity in software unless the differences get greater than this level */ + +#define DEFAULT_REWIND_SAFEGUARD_BYTES (256U) /* 1.33ms @48kHz, we'll never rewind less than this */ +#define DEFAULT_REWIND_SAFEGUARD_USEC (1330) /* 1.33ms, depending on channels/rate/sample we may rewind more than 256 above */ + +#define DEFAULT_WRITE_ITERATION_THRESHOLD 0.03 /* don't iterate write if < 3% of the buffer is available */ + +struct userdata { + pa_core *core; + pa_module *module; + pa_sink *sink; + + pa_thread *thread; + pa_thread_mq thread_mq; + pa_rtpoll *rtpoll; + + snd_pcm_t *pcm_handle; + + char *paths_dir; + pa_alsa_fdlist *mixer_fdl; + pa_alsa_mixer_pdata *mixer_pd; + pa_hashmap *mixers; + snd_mixer_t *mixer_handle; + pa_alsa_path_set *mixer_path_set; + pa_alsa_path *mixer_path; + + pa_cvolume hardware_volume; + + pa_sample_spec verified_sample_spec; + pa_sample_format_t *supported_formats; + unsigned int *supported_rates; + struct { + size_t fragment_size; + size_t nfrags; + size_t tsched_size; + size_t tsched_watermark; + size_t rewind_safeguard; + } initial_info; + + size_t + frame_size, + fragment_size, + hwbuf_size, + tsched_size, + tsched_watermark, + tsched_watermark_ref, + hwbuf_unused, + min_sleep, + min_wakeup, + watermark_inc_step, + watermark_dec_step, + watermark_inc_threshold, + watermark_dec_threshold, + rewind_safeguard; + + snd_pcm_uframes_t frames_per_block; + + pa_usec_t watermark_dec_not_before; + pa_usec_t min_latency_ref; + pa_usec_t tsched_watermark_usec; + + pa_memchunk memchunk; + + char *device_name; /* name of the PCM device */ + char *control_device; /* name of the control device */ + + bool use_mmap:1, use_tsched:1, deferred_volume:1, fixed_latency_range:1; + + bool first, after_rewind; + + pa_rtpoll_item *alsa_rtpoll_item; + + pa_smoother *smoother; + uint64_t write_count; + uint64_t since_start; + pa_usec_t smoother_interval; + pa_usec_t last_smoother_update; + + pa_idxset *formats; + + pa_reserve_wrapper *reserve; + pa_hook_slot *reserve_slot; + pa_reserve_monitor_wrapper *monitor; + pa_hook_slot *monitor_slot; + + /* ucm context */ + pa_alsa_ucm_mapping_context *ucm_context; +}; + +enum { + SINK_MESSAGE_SYNC_MIXER = PA_SINK_MESSAGE_MAX +}; + +static void userdata_free(struct userdata *u); +static int unsuspend(struct userdata *u, bool recovering); + +/* FIXME: Is there a better way to do this than device names? */ +static bool is_iec958(struct userdata *u) { + return (strncmp("iec958", u->device_name, 6) == 0); +} + +static bool is_hdmi(struct userdata *u) { + return (strncmp("hdmi", u->device_name, 4) == 0); +} + +static pa_hook_result_t reserve_cb(pa_reserve_wrapper *r, void *forced, struct userdata *u) { + pa_assert(r); + pa_assert(u); + + pa_log_debug("Suspending sink %s, because another application requested us to release the device.", u->sink->name); + + if (pa_sink_suspend(u->sink, true, PA_SUSPEND_APPLICATION) < 0) + return PA_HOOK_CANCEL; + + return PA_HOOK_OK; +} + +static void reserve_done(struct userdata *u) { + pa_assert(u); + + if (u->reserve_slot) { + pa_hook_slot_free(u->reserve_slot); + u->reserve_slot = NULL; + } + + if (u->reserve) { + pa_reserve_wrapper_unref(u->reserve); + u->reserve = NULL; + } +} + +static void reserve_update(struct userdata *u) { + const char *description; + pa_assert(u); + + if (!u->sink || !u->reserve) + return; + + if ((description = pa_proplist_gets(u->sink->proplist, PA_PROP_DEVICE_DESCRIPTION))) + pa_reserve_wrapper_set_application_device_name(u->reserve, description); +} + +static int reserve_init(struct userdata *u, const char *dname) { + char *rname; + + pa_assert(u); + pa_assert(dname); + + if (u->reserve) + return 0; + + if (pa_in_system_mode()) + return 0; + + if (!(rname = pa_alsa_get_reserve_name(dname))) + return 0; + + /* We are resuming, try to lock the device */ + u->reserve = pa_reserve_wrapper_get(u->core, rname); + pa_xfree(rname); + + if (!(u->reserve)) + return -1; + + reserve_update(u); + + pa_assert(!u->reserve_slot); + u->reserve_slot = pa_hook_connect(pa_reserve_wrapper_hook(u->reserve), PA_HOOK_NORMAL, (pa_hook_cb_t) reserve_cb, u); + + return 0; +} + +static pa_hook_result_t monitor_cb(pa_reserve_monitor_wrapper *w, void* busy, struct userdata *u) { + pa_assert(w); + pa_assert(u); + + if (PA_PTR_TO_UINT(busy) && !u->reserve) { + pa_log_debug("Suspending sink %s, because another application is blocking the access to the device.", u->sink->name); + pa_sink_suspend(u->sink, true, PA_SUSPEND_APPLICATION); + } else { + pa_log_debug("Resuming sink %s, because other applications aren't blocking access to the device any more.", u->sink->name); + pa_sink_suspend(u->sink, false, PA_SUSPEND_APPLICATION); + } + + return PA_HOOK_OK; +} + +static void monitor_done(struct userdata *u) { + pa_assert(u); + + if (u->monitor_slot) { + pa_hook_slot_free(u->monitor_slot); + u->monitor_slot = NULL; + } + + if (u->monitor) { + pa_reserve_monitor_wrapper_unref(u->monitor); + u->monitor = NULL; + } +} + +static int reserve_monitor_init(struct userdata *u, const char *dname) { + char *rname; + + pa_assert(u); + pa_assert(dname); + + if (pa_in_system_mode()) + return 0; + + if (!(rname = pa_alsa_get_reserve_name(dname))) + return 0; + + /* We are resuming, try to lock the device */ + u->monitor = pa_reserve_monitor_wrapper_get(u->core, rname); + pa_xfree(rname); + + if (!(u->monitor)) + return -1; + + pa_assert(!u->monitor_slot); + u->monitor_slot = pa_hook_connect(pa_reserve_monitor_wrapper_hook(u->monitor), PA_HOOK_NORMAL, (pa_hook_cb_t) monitor_cb, u); + + return 0; +} + +static void fix_min_sleep_wakeup(struct userdata *u) { + size_t max_use, max_use_2; + + pa_assert(u); + pa_assert(u->use_tsched); + + max_use = u->hwbuf_size - u->hwbuf_unused; + max_use_2 = pa_frame_align(max_use/2, &u->sink->sample_spec); + + u->min_sleep = pa_usec_to_bytes(TSCHED_MIN_SLEEP_USEC, &u->sink->sample_spec); + u->min_sleep = PA_CLAMP(u->min_sleep, u->frame_size, max_use_2); + + u->min_wakeup = pa_usec_to_bytes(TSCHED_MIN_WAKEUP_USEC, &u->sink->sample_spec); + u->min_wakeup = PA_CLAMP(u->min_wakeup, u->frame_size, max_use_2); +} + +static void fix_tsched_watermark(struct userdata *u) { + size_t max_use; + pa_assert(u); + pa_assert(u->use_tsched); + + max_use = u->hwbuf_size - u->hwbuf_unused; + + if (u->tsched_watermark > max_use - u->min_sleep) + u->tsched_watermark = max_use - u->min_sleep; + + if (u->tsched_watermark < u->min_wakeup) + u->tsched_watermark = u->min_wakeup; + + u->tsched_watermark_usec = pa_bytes_to_usec(u->tsched_watermark, &u->sink->sample_spec); +} + +static void increase_watermark(struct userdata *u) { + size_t old_watermark; + pa_usec_t old_min_latency, new_min_latency; + + pa_assert(u); + pa_assert(u->use_tsched); + + /* First, just try to increase the watermark */ + old_watermark = u->tsched_watermark; + u->tsched_watermark = PA_MIN(u->tsched_watermark * 2, u->tsched_watermark + u->watermark_inc_step); + fix_tsched_watermark(u); + + if (old_watermark != u->tsched_watermark) { + pa_log_info("Increasing wakeup watermark to %0.2f ms", + (double) u->tsched_watermark_usec / PA_USEC_PER_MSEC); + return; + } + + /* Hmm, we cannot increase the watermark any further, hence let's + raise the latency, unless doing so was disabled in + configuration */ + if (u->fixed_latency_range) + return; + + old_min_latency = u->sink->thread_info.min_latency; + new_min_latency = PA_MIN(old_min_latency * 2, old_min_latency + TSCHED_WATERMARK_INC_STEP_USEC); + new_min_latency = PA_MIN(new_min_latency, u->sink->thread_info.max_latency); + + if (old_min_latency != new_min_latency) { + pa_log_info("Increasing minimal latency to %0.2f ms", + (double) new_min_latency / PA_USEC_PER_MSEC); + + pa_sink_set_latency_range_within_thread(u->sink, new_min_latency, u->sink->thread_info.max_latency); + } + + /* When we reach this we're officially fucked! */ +} + +static void decrease_watermark(struct userdata *u) { + size_t old_watermark; + pa_usec_t now; + + pa_assert(u); + pa_assert(u->use_tsched); + + now = pa_rtclock_now(); + + if (u->watermark_dec_not_before <= 0) + goto restart; + + if (u->watermark_dec_not_before > now) + return; + + old_watermark = u->tsched_watermark; + + if (u->tsched_watermark < u->watermark_dec_step) + u->tsched_watermark = u->tsched_watermark / 2; + else + u->tsched_watermark = PA_MAX(u->tsched_watermark / 2, u->tsched_watermark - u->watermark_dec_step); + + fix_tsched_watermark(u); + + if (old_watermark != u->tsched_watermark) + pa_log_info("Decreasing wakeup watermark to %0.2f ms", + (double) u->tsched_watermark_usec / PA_USEC_PER_MSEC); + + /* We don't change the latency range*/ + +restart: + u->watermark_dec_not_before = now + TSCHED_WATERMARK_VERIFY_AFTER_USEC; +} + +/* Called from IO Context on unsuspend or from main thread when creating sink */ +static void reset_watermark(struct userdata *u, size_t tsched_watermark, pa_sample_spec *ss, + bool in_thread) { + u->tsched_watermark = pa_convert_size(tsched_watermark, ss, &u->sink->sample_spec); + + u->watermark_inc_step = pa_usec_to_bytes(TSCHED_WATERMARK_INC_STEP_USEC, &u->sink->sample_spec); + u->watermark_dec_step = pa_usec_to_bytes(TSCHED_WATERMARK_DEC_STEP_USEC, &u->sink->sample_spec); + + u->watermark_inc_threshold = pa_usec_to_bytes_round_up(TSCHED_WATERMARK_INC_THRESHOLD_USEC, &u->sink->sample_spec); + u->watermark_dec_threshold = pa_usec_to_bytes_round_up(TSCHED_WATERMARK_DEC_THRESHOLD_USEC, &u->sink->sample_spec); + + fix_min_sleep_wakeup(u); + fix_tsched_watermark(u); + + if (in_thread) + pa_sink_set_latency_range_within_thread(u->sink, + u->min_latency_ref, + pa_bytes_to_usec(u->hwbuf_size, ss)); + else { + pa_sink_set_latency_range(u->sink, + 0, + pa_bytes_to_usec(u->hwbuf_size, ss)); + + /* work-around assert in pa_sink_set_latency_within_thead, + keep track of min_latency and reuse it when + this routine is called from IO context */ + u->min_latency_ref = u->sink->thread_info.min_latency; + } + + pa_log_info("Time scheduling watermark is %0.2fms", + (double) u->tsched_watermark_usec / PA_USEC_PER_MSEC); +} + +static void hw_sleep_time(struct userdata *u, pa_usec_t *sleep_usec, pa_usec_t*process_usec) { + pa_usec_t usec, wm; + + pa_assert(sleep_usec); + pa_assert(process_usec); + + pa_assert(u); + pa_assert(u->use_tsched); + + usec = pa_sink_get_requested_latency_within_thread(u->sink); + + if (usec == (pa_usec_t) -1) + usec = pa_bytes_to_usec(u->hwbuf_size, &u->sink->sample_spec); + + wm = u->tsched_watermark_usec; + + if (wm > usec) + wm = usec/2; + + *sleep_usec = usec - wm; + *process_usec = wm; + +#ifdef DEBUG_TIMING + pa_log_debug("Buffer time: %lu ms; Sleep time: %lu ms; Process time: %lu ms", + (unsigned long) (usec / PA_USEC_PER_MSEC), + (unsigned long) (*sleep_usec / PA_USEC_PER_MSEC), + (unsigned long) (*process_usec / PA_USEC_PER_MSEC)); +#endif +} + +/* Reset smoother and counters */ +static void reset_vars(struct userdata *u) { + + pa_smoother_reset(u->smoother, pa_rtclock_now(), true); + u->smoother_interval = SMOOTHER_MIN_INTERVAL; + u->last_smoother_update = 0; + + u->first = true; + u->since_start = 0; + u->write_count = 0; +} + +/* Called from IO context */ +static void close_pcm(struct userdata *u) { + /* Let's suspend -- we don't call snd_pcm_drain() here since that might + * take awfully long with our long buffer sizes today. */ + snd_pcm_close(u->pcm_handle); + u->pcm_handle = NULL; + + if (u->alsa_rtpoll_item) { + pa_rtpoll_item_free(u->alsa_rtpoll_item); + u->alsa_rtpoll_item = NULL; + } +} + +static int try_recover(struct userdata *u, const char *call, int err) { + pa_assert(u); + pa_assert(call); + pa_assert(err < 0); + + pa_log_debug("%s: %s", call, pa_alsa_strerror(err)); + + pa_assert(err != -EAGAIN); + + if (err == -EPIPE) + pa_log_debug("%s: Buffer underrun!", call); + + if (err == -ESTRPIPE) + pa_log_debug("%s: System suspended!", call); + + if ((err = snd_pcm_recover(u->pcm_handle, err, 1)) < 0) { + pa_log("%s: %s, trying to restart PCM", call, pa_alsa_strerror(err)); + + /* As a last measure, restart the PCM and inform the caller about it. */ + close_pcm(u); + if (unsuspend(u, true) < 0) + return -1; + + return 1; + } + + reset_vars(u); + return 0; +} + +static size_t check_left_to_play(struct userdata *u, size_t n_bytes, bool on_timeout) { + size_t left_to_play; + bool underrun = false; + + /* We use <= instead of < for this check here because an underrun + * only happens after the last sample was processed, not already when + * it is removed from the buffer. This is particularly important + * when block transfer is used. */ + + if (n_bytes <= u->hwbuf_size) + left_to_play = u->hwbuf_size - n_bytes; + else { + + /* We got a dropout. What a mess! */ + left_to_play = 0; + underrun = true; + +#if 0 + PA_DEBUG_TRAP; +#endif + + if (!u->first && !u->after_rewind) + if (pa_log_ratelimit(PA_LOG_INFO)) + pa_log_info("Underrun!"); + } + +#ifdef DEBUG_TIMING + pa_log_debug("%0.2f ms left to play; inc threshold = %0.2f ms; dec threshold = %0.2f ms", + (double) pa_bytes_to_usec(left_to_play, &u->sink->sample_spec) / PA_USEC_PER_MSEC, + (double) pa_bytes_to_usec(u->watermark_inc_threshold, &u->sink->sample_spec) / PA_USEC_PER_MSEC, + (double) pa_bytes_to_usec(u->watermark_dec_threshold, &u->sink->sample_spec) / PA_USEC_PER_MSEC); +#endif + + if (u->use_tsched) { + bool reset_not_before = true; + + if (!u->first && !u->after_rewind) { + if (underrun || left_to_play < u->watermark_inc_threshold) + increase_watermark(u); + else if (left_to_play > u->watermark_dec_threshold) { + reset_not_before = false; + + /* We decrease the watermark only if have actually + * been woken up by a timeout. If something else woke + * us up it's too easy to fulfill the deadlines... */ + + if (on_timeout) + decrease_watermark(u); + } + } + + if (reset_not_before) + u->watermark_dec_not_before = 0; + } + + return left_to_play; +} + +static int mmap_write(struct userdata *u, pa_usec_t *sleep_usec, bool polled, bool on_timeout) { + bool work_done = false; + pa_usec_t max_sleep_usec = 0, process_usec = 0; + size_t left_to_play, input_underrun; + unsigned j = 0; + + pa_assert(u); + pa_sink_assert_ref(u->sink); + + if (u->use_tsched) + hw_sleep_time(u, &max_sleep_usec, &process_usec); + + for (;;) { + snd_pcm_sframes_t n; + size_t n_bytes; + int r; + bool after_avail = true; + + /* First we determine how many samples are missing to fill the + * buffer up to 100% */ + + if (PA_UNLIKELY((n = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->sink->sample_spec)) < 0)) { + + if ((r = try_recover(u, "snd_pcm_avail", (int) n)) >= 0) + continue; + + return r; + } + + n_bytes = (size_t) n * u->frame_size; + +#ifdef DEBUG_TIMING + pa_log_debug("avail: %lu", (unsigned long) n_bytes); +#endif + + left_to_play = check_left_to_play(u, n_bytes, on_timeout); + on_timeout = false; + + if (u->use_tsched) + + /* We won't fill up the playback buffer before at least + * half the sleep time is over because otherwise we might + * ask for more data from the clients then they expect. We + * need to guarantee that clients only have to keep around + * a single hw buffer length. */ + + if (!polled && + pa_bytes_to_usec(left_to_play, &u->sink->sample_spec) > process_usec+max_sleep_usec/2) { +#ifdef DEBUG_TIMING + pa_log_debug("Not filling up, because too early."); +#endif + break; + } + + if (PA_UNLIKELY(n_bytes <= u->hwbuf_unused)) { + + if (polled) + PA_ONCE_BEGIN { + char *dn = pa_alsa_get_driver_name_by_pcm(u->pcm_handle); + pa_log(_("ALSA woke us up to write new data to the device, but there was actually nothing to write.\n" + "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n" + "We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."), + pa_strnull(dn)); + pa_xfree(dn); + } PA_ONCE_END; + +#ifdef DEBUG_TIMING + pa_log_debug("Not filling up, because not necessary."); +#endif + break; + } + + j++; + + if (j > 10) { +#ifdef DEBUG_TIMING + pa_log_debug("Not filling up, because already too many iterations."); +#endif + + break; + } else if (j >= 2 && (n_bytes < (DEFAULT_WRITE_ITERATION_THRESHOLD * (u->hwbuf_size - u->hwbuf_unused)))) { +#ifdef DEBUG_TIMING + pa_log_debug("Not filling up, because <%g%% available.", DEFAULT_WRITE_ITERATION_THRESHOLD * 100); +#endif + break; + } + + n_bytes -= u->hwbuf_unused; + polled = false; + +#ifdef DEBUG_TIMING + pa_log_debug("Filling up"); +#endif + + for (;;) { + pa_memchunk chunk; + void *p; + int err; + const snd_pcm_channel_area_t *areas; + snd_pcm_uframes_t offset, frames; + snd_pcm_sframes_t sframes; + size_t written; + + frames = (snd_pcm_uframes_t) (n_bytes / u->frame_size); +/* pa_log_debug("%lu frames to write", (unsigned long) frames); */ + + if (PA_UNLIKELY((err = pa_alsa_safe_mmap_begin(u->pcm_handle, &areas, &offset, &frames, u->hwbuf_size, &u->sink->sample_spec)) < 0)) { + + if (!after_avail && err == -EAGAIN) + break; + + if ((r = try_recover(u, "snd_pcm_mmap_begin", err)) == 0) + continue; + + if (r == 1) + break; + + return r; + } + + /* Make sure that if these memblocks need to be copied they will fit into one slot */ + frames = PA_MIN(frames, u->frames_per_block); + + if (!after_avail && frames == 0) + break; + + pa_assert(frames > 0); + after_avail = false; + + /* Check these are multiples of 8 bit */ + pa_assert((areas[0].first & 7) == 0); + pa_assert((areas[0].step & 7) == 0); + + /* We assume a single interleaved memory buffer */ + pa_assert((areas[0].first >> 3) == 0); + pa_assert((areas[0].step >> 3) == u->frame_size); + + p = (uint8_t*) areas[0].addr + (offset * u->frame_size); + + written = frames * u->frame_size; + chunk.memblock = pa_memblock_new_fixed(u->core->mempool, p, written, true); + chunk.length = pa_memblock_get_length(chunk.memblock); + chunk.index = 0; + + pa_sink_render_into_full(u->sink, &chunk); + pa_memblock_unref_fixed(chunk.memblock); + + if (PA_UNLIKELY((sframes = snd_pcm_mmap_commit(u->pcm_handle, offset, frames)) < 0)) { + + if ((int) sframes == -EAGAIN) + break; + + if ((r = try_recover(u, "snd_pcm_mmap_commit", (int) sframes)) == 0) + continue; + + if (r == 1) + break; + + return r; + } + + work_done = true; + + u->write_count += written; + u->since_start += written; + +#ifdef DEBUG_TIMING + pa_log_debug("Wrote %lu bytes (of possible %lu bytes)", (unsigned long) written, (unsigned long) n_bytes); +#endif + + if (written >= n_bytes) + break; + + n_bytes -= written; + } + } + + input_underrun = pa_sink_process_input_underruns(u->sink, left_to_play); + + if (u->use_tsched) { + pa_usec_t underrun_sleep = pa_bytes_to_usec_round_up(input_underrun, &u->sink->sample_spec); + + *sleep_usec = pa_bytes_to_usec(left_to_play, &u->sink->sample_spec); + process_usec = u->tsched_watermark_usec; + + if (*sleep_usec > process_usec) + *sleep_usec -= process_usec; + else + *sleep_usec = 0; + + *sleep_usec = PA_MIN(*sleep_usec, underrun_sleep); + } else + *sleep_usec = 0; + + return work_done ? 1 : 0; +} + +static int unix_write(struct userdata *u, pa_usec_t *sleep_usec, bool polled, bool on_timeout) { + bool work_done = false; + pa_usec_t max_sleep_usec = 0, process_usec = 0; + size_t left_to_play, input_underrun; + unsigned j = 0; + + pa_assert(u); + pa_sink_assert_ref(u->sink); + + if (u->use_tsched) + hw_sleep_time(u, &max_sleep_usec, &process_usec); + + for (;;) { + snd_pcm_sframes_t n; + size_t n_bytes; + int r; + bool after_avail = true; + + if (PA_UNLIKELY((n = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->sink->sample_spec)) < 0)) { + + if ((r = try_recover(u, "snd_pcm_avail", (int) n)) >= 0) + continue; + + return r; + } + + n_bytes = (size_t) n * u->frame_size; + +#ifdef DEBUG_TIMING + pa_log_debug("avail: %lu", (unsigned long) n_bytes); +#endif + + left_to_play = check_left_to_play(u, n_bytes, on_timeout); + on_timeout = false; + + if (u->use_tsched) + + /* We won't fill up the playback buffer before at least + * half the sleep time is over because otherwise we might + * ask for more data from the clients then they expect. We + * need to guarantee that clients only have to keep around + * a single hw buffer length. */ + + if (!polled && + pa_bytes_to_usec(left_to_play, &u->sink->sample_spec) > process_usec+max_sleep_usec/2) + break; + + if (PA_UNLIKELY(n_bytes <= u->hwbuf_unused)) { + + if (polled) + PA_ONCE_BEGIN { + char *dn = pa_alsa_get_driver_name_by_pcm(u->pcm_handle); + pa_log(_("ALSA woke us up to write new data to the device, but there was actually nothing to write.\n" + "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n" + "We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."), + pa_strnull(dn)); + pa_xfree(dn); + } PA_ONCE_END; + + break; + } + + j++; + + if (j > 10) { +#ifdef DEBUG_TIMING + pa_log_debug("Not filling up, because already too many iterations."); +#endif + + break; + } else if (j >= 2 && (n_bytes < (DEFAULT_WRITE_ITERATION_THRESHOLD * (u->hwbuf_size - u->hwbuf_unused)))) { +#ifdef DEBUG_TIMING + pa_log_debug("Not filling up, because <%g%% available.", DEFAULT_WRITE_ITERATION_THRESHOLD * 100); +#endif + break; + } + + n_bytes -= u->hwbuf_unused; + polled = false; + + for (;;) { + snd_pcm_sframes_t frames; + void *p; + size_t written; + +/* pa_log_debug("%lu frames to write", (unsigned long) frames); */ + + if (u->memchunk.length <= 0) + pa_sink_render(u->sink, n_bytes, &u->memchunk); + + pa_assert(u->memchunk.length > 0); + + frames = (snd_pcm_sframes_t) (u->memchunk.length / u->frame_size); + + if (frames > (snd_pcm_sframes_t) (n_bytes/u->frame_size)) + frames = (snd_pcm_sframes_t) (n_bytes/u->frame_size); + + p = pa_memblock_acquire(u->memchunk.memblock); + frames = snd_pcm_writei(u->pcm_handle, (const uint8_t*) p + u->memchunk.index, (snd_pcm_uframes_t) frames); + pa_memblock_release(u->memchunk.memblock); + + if (PA_UNLIKELY(frames < 0)) { + + if (!after_avail && (int) frames == -EAGAIN) + break; + + if ((r = try_recover(u, "snd_pcm_writei", (int) frames)) == 0) + continue; + + if (r == 1) + break; + + return r; + } + + if (!after_avail && frames == 0) + break; + + pa_assert(frames > 0); + after_avail = false; + + written = frames * u->frame_size; + u->memchunk.index += written; + u->memchunk.length -= written; + + if (u->memchunk.length <= 0) { + pa_memblock_unref(u->memchunk.memblock); + pa_memchunk_reset(&u->memchunk); + } + + work_done = true; + + u->write_count += written; + u->since_start += written; + +/* pa_log_debug("wrote %lu frames", (unsigned long) frames); */ + + if (written >= n_bytes) + break; + + n_bytes -= written; + } + } + + input_underrun = pa_sink_process_input_underruns(u->sink, left_to_play); + + if (u->use_tsched) { + pa_usec_t underrun_sleep = pa_bytes_to_usec_round_up(input_underrun, &u->sink->sample_spec); + + *sleep_usec = pa_bytes_to_usec(left_to_play, &u->sink->sample_spec); + process_usec = u->tsched_watermark_usec; + + if (*sleep_usec > process_usec) + *sleep_usec -= process_usec; + else + *sleep_usec = 0; + + *sleep_usec = PA_MIN(*sleep_usec, underrun_sleep); + } else + *sleep_usec = 0; + + return work_done ? 1 : 0; +} + +static void update_smoother(struct userdata *u) { + snd_pcm_sframes_t delay = 0; + int64_t position; + int err; + pa_usec_t now1 = 0, now2; + snd_pcm_status_t *status; + snd_htimestamp_t htstamp = { 0, 0 }; + + snd_pcm_status_alloca(&status); + + pa_assert(u); + pa_assert(u->pcm_handle); + + /* Let's update the time smoother */ + + if (PA_UNLIKELY((err = pa_alsa_safe_delay(u->pcm_handle, status, &delay, u->hwbuf_size, &u->sink->sample_spec, false)) < 0)) { + pa_log_warn("Failed to query DSP status data: %s", pa_alsa_strerror(err)); + return; + } + + snd_pcm_status_get_htstamp(status, &htstamp); + now1 = pa_timespec_load(&htstamp); + + /* Hmm, if the timestamp is 0, then it wasn't set and we take the current time */ + if (now1 <= 0) + now1 = pa_rtclock_now(); + + /* check if the time since the last update is bigger than the interval */ + if (u->last_smoother_update > 0) + if (u->last_smoother_update + u->smoother_interval > now1) + return; + + position = (int64_t) u->write_count - ((int64_t) delay * (int64_t) u->frame_size); + + if (PA_UNLIKELY(position < 0)) + position = 0; + + now2 = pa_bytes_to_usec((uint64_t) position, &u->sink->sample_spec); + + pa_smoother_put(u->smoother, now1, now2); + + u->last_smoother_update = now1; + /* exponentially increase the update interval up to the MAX limit */ + u->smoother_interval = PA_MIN (u->smoother_interval * 2, SMOOTHER_MAX_INTERVAL); +} + +static int64_t sink_get_latency(struct userdata *u) { + int64_t delay; + pa_usec_t now1, now2; + + pa_assert(u); + + now1 = pa_rtclock_now(); + now2 = pa_smoother_get(u->smoother, now1); + + delay = (int64_t) pa_bytes_to_usec(u->write_count, &u->sink->sample_spec) - (int64_t) now2; + + if (u->memchunk.memblock) + delay += pa_bytes_to_usec(u->memchunk.length, &u->sink->sample_spec); + + return delay; +} + +static int build_pollfd(struct userdata *u) { + pa_assert(u); + pa_assert(u->pcm_handle); + + if (u->alsa_rtpoll_item) + pa_rtpoll_item_free(u->alsa_rtpoll_item); + + if (!(u->alsa_rtpoll_item = pa_alsa_build_pollfd(u->pcm_handle, u->rtpoll))) + return -1; + + return 0; +} + +/* Called from IO context */ +static void suspend(struct userdata *u) { + pa_assert(u); + + /* Handle may have been invalidated due to a device failure. + * In that case there is nothing to do. */ + if (!u->pcm_handle) + return; + + pa_smoother_pause(u->smoother, pa_rtclock_now()); + + /* Close PCM device */ + close_pcm(u); + + /* We reset max_rewind/max_request here to make sure that while we + * are suspended the old max_request/max_rewind values set before + * the suspend can influence the per-stream buffer of newly + * created streams, without their requirements having any + * influence on them. */ + pa_sink_set_max_rewind_within_thread(u->sink, 0); + pa_sink_set_max_request_within_thread(u->sink, 0); + + pa_log_info("Device suspended..."); +} + +/* Called from IO context */ +static int update_sw_params(struct userdata *u, bool may_need_rewind) { + size_t old_unused; + snd_pcm_uframes_t avail_min; + int err; + + pa_assert(u); + + /* Use the full buffer if no one asked us for anything specific */ + old_unused = u->hwbuf_unused; + u->hwbuf_unused = 0; + + if (u->use_tsched) { + pa_usec_t latency; + + if ((latency = pa_sink_get_requested_latency_within_thread(u->sink)) != (pa_usec_t) -1) { + size_t b; + + pa_log_debug("Latency set to %0.2fms", (double) latency / PA_USEC_PER_MSEC); + + b = pa_usec_to_bytes(latency, &u->sink->sample_spec); + + /* We need at least one sample in our buffer */ + + if (PA_UNLIKELY(b < u->frame_size)) + b = u->frame_size; + + u->hwbuf_unused = PA_LIKELY(b < u->hwbuf_size) ? (u->hwbuf_size - b) : 0; + } + + fix_min_sleep_wakeup(u); + fix_tsched_watermark(u); + } + + pa_log_debug("hwbuf_unused=%lu", (unsigned long) u->hwbuf_unused); + + /* We need at last one frame in the used part of the buffer */ + avail_min = (snd_pcm_uframes_t) u->hwbuf_unused / u->frame_size + 1; + + if (u->use_tsched) { + pa_usec_t sleep_usec, process_usec; + + hw_sleep_time(u, &sleep_usec, &process_usec); + avail_min += pa_usec_to_bytes(sleep_usec, &u->sink->sample_spec) / u->frame_size; + } + + pa_log_debug("setting avail_min=%lu", (unsigned long) avail_min); + + if ((err = pa_alsa_set_sw_params(u->pcm_handle, avail_min, !u->use_tsched)) < 0) { + pa_log("Failed to set software parameters: %s", pa_alsa_strerror(err)); + return err; + } + + /* If we're lowering the latency, we need to do a rewind, because otherwise + * we might end up in a situation where the hw buffer contains more data + * than the new configured latency. The rewind has to be requested before + * updating max_rewind, because the rewind amount is limited to max_rewind. + * + * If may_need_rewind is false, it means that we're just starting playback, + * and rewinding is never needed in that situation. */ + if (may_need_rewind && u->hwbuf_unused > old_unused) { + pa_log_debug("Requesting rewind due to latency change."); + pa_sink_request_rewind(u->sink, (size_t) -1); + } + + pa_sink_set_max_request_within_thread(u->sink, u->hwbuf_size - u->hwbuf_unused); + if (pa_alsa_pcm_is_hw(u->pcm_handle)) + pa_sink_set_max_rewind_within_thread(u->sink, u->hwbuf_size - u->hwbuf_unused); + else { + pa_log_info("Disabling rewind_within_thread for device %s", u->device_name); + pa_sink_set_max_rewind_within_thread(u->sink, 0); + } + + return 0; +} + +/* Called from IO Context on unsuspend */ +static void update_size(struct userdata *u, pa_sample_spec *ss) { + pa_assert(u); + pa_assert(ss); + + u->frame_size = pa_frame_size(ss); + u->frames_per_block = pa_mempool_block_size_max(u->core->mempool) / u->frame_size; + + /* use initial values including module arguments */ + u->fragment_size = u->initial_info.fragment_size; + u->hwbuf_size = u->initial_info.nfrags * u->fragment_size; + u->tsched_size = u->initial_info.tsched_size; + u->tsched_watermark = u->initial_info.tsched_watermark; + u->rewind_safeguard = u->initial_info.rewind_safeguard; + + u->tsched_watermark_ref = u->tsched_watermark; + + pa_log_info("Updated frame_size %zu, frames_per_block %lu, fragment_size %zu, hwbuf_size %zu, tsched(size %zu, watermark %zu), rewind_safeguard %zu", + u->frame_size, (unsigned long) u->frames_per_block, u->fragment_size, u->hwbuf_size, u->tsched_size, u->tsched_watermark, u->rewind_safeguard); +} + +/* Called from IO context */ +static int unsuspend(struct userdata *u, bool recovering) { + pa_sample_spec ss; + int err, i; + bool b, d; + snd_pcm_uframes_t period_frames, buffer_frames; + snd_pcm_uframes_t tsched_frames = 0; + char *device_name = NULL; + bool frame_size_changed = false; + + pa_assert(u); + pa_assert(!u->pcm_handle); + + pa_log_info("Trying resume..."); + + if ((is_iec958(u) || is_hdmi(u)) && pa_sink_is_passthrough(u->sink)) { + /* Need to open device in NONAUDIO mode */ + int len = strlen(u->device_name) + 8; + + device_name = pa_xmalloc(len); + pa_snprintf(device_name, len, "%s,AES0=6", u->device_name); + } + + /* + * On some machines, during the system suspend and resume, the thread_func could receive + * POLLERR events before the dev nodes in /dev/snd/ are accessible, and thread_func calls + * the unsuspend() to try to recover the PCM, this will make the snd_pcm_open() fail, here + * we add msleep and retry to make sure those nodes are accessible. + */ + for (i = 0; i < 4; i++) { + if ((err = snd_pcm_open(&u->pcm_handle, device_name ? device_name : u->device_name, SND_PCM_STREAM_PLAYBACK, + SND_PCM_NONBLOCK| + SND_PCM_NO_AUTO_RESAMPLE| + SND_PCM_NO_AUTO_CHANNELS| + SND_PCM_NO_AUTO_FORMAT)) < 0 && recovering) + pa_msleep(25); + else + break; + } + + if (err < 0) { + pa_log("Error opening PCM device %s: %s", u->device_name, pa_alsa_strerror(err)); + goto fail; + } + + if (pa_frame_size(&u->sink->sample_spec) != u->frame_size) { + update_size(u, &u->sink->sample_spec); + tsched_frames = u->tsched_size / u->frame_size; + frame_size_changed = true; + } + + ss = u->sink->sample_spec; + period_frames = u->fragment_size / u->frame_size; + buffer_frames = u->hwbuf_size / u->frame_size; + b = u->use_mmap; + d = u->use_tsched; + + if ((err = pa_alsa_set_hw_params(u->pcm_handle, &ss, &period_frames, &buffer_frames, tsched_frames, &b, &d, true)) < 0) { + pa_log("Failed to set hardware parameters: %s", pa_alsa_strerror(err)); + goto fail; + } + + if (b != u->use_mmap || d != u->use_tsched) { + pa_log_warn("Resume failed, couldn't get original access mode."); + goto fail; + } + + if (!pa_sample_spec_equal(&ss, &u->sink->sample_spec)) { + pa_log_warn("Resume failed, couldn't restore original sample settings."); + goto fail; + } + + if (frame_size_changed) { + u->fragment_size = (size_t)(period_frames * u->frame_size); + u->hwbuf_size = (size_t)(buffer_frames * u->frame_size); + pa_proplist_setf(u->sink->proplist, PA_PROP_DEVICE_BUFFERING_BUFFER_SIZE, "%zu", u->hwbuf_size); + pa_proplist_setf(u->sink->proplist, PA_PROP_DEVICE_BUFFERING_FRAGMENT_SIZE, "%zu", u->fragment_size); + + } else if (period_frames * u->frame_size != u->fragment_size || + buffer_frames * u->frame_size != u->hwbuf_size) { + pa_log_warn("Resume failed, couldn't restore original fragment settings. (Old: %zu/%zu, New %lu/%lu)", + u->hwbuf_size, u->fragment_size, + (unsigned long) buffer_frames * u->frame_size, (unsigned long) period_frames * u->frame_size); + goto fail; + } + + if (update_sw_params(u, false) < 0) + goto fail; + + if (build_pollfd(u) < 0) + goto fail; + + reset_vars(u); + + /* reset the watermark to the value defined when sink was created */ + if (u->use_tsched && !recovering) + reset_watermark(u, u->tsched_watermark_ref, &u->sink->sample_spec, true); + + pa_log_info("Resumed successfully..."); + + pa_xfree(device_name); + return 0; + +fail: + if (u->pcm_handle) { + snd_pcm_close(u->pcm_handle); + u->pcm_handle = NULL; + } + + pa_xfree(device_name); + + return -PA_ERR_IO; +} + +/* Called from the IO thread or the main thread depending on whether deferred + * volume is enabled or not (with deferred volume all mixer handling is done + * from the IO thread). + * + * Sets the mixer settings to match the current sink and port state (the port + * is given as an argument, because active_port may still point to the old + * port, if we're switching ports). */ +static void sync_mixer(struct userdata *u, pa_device_port *port) { + pa_alsa_setting *setting = NULL; + + pa_assert(u); + + if (!u->mixer_path) + return; + + /* port may be NULL, because if we use a synthesized mixer path, then the + * sink has no ports. */ + if (port && !u->ucm_context) { + pa_alsa_port_data *data; + + data = PA_DEVICE_PORT_DATA(port); + setting = data->setting; + } + + pa_alsa_path_select(u->mixer_path, setting, u->mixer_handle, u->sink->muted); + + if (u->sink->set_mute) + u->sink->set_mute(u->sink); + if (u->sink->flags & PA_SINK_DEFERRED_VOLUME) { + if (u->sink->write_volume) + u->sink->write_volume(u->sink); + } else { + if (u->sink->set_volume) + u->sink->set_volume(u->sink); + } +} + +/* Called from IO context */ +static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SINK(o)->userdata; + + switch (code) { + + case PA_SINK_MESSAGE_GET_LATENCY: { + int64_t r = 0; + + if (u->pcm_handle) + r = sink_get_latency(u); + + *((int64_t*) data) = r; + + return 0; + } + + case SINK_MESSAGE_SYNC_MIXER: { + pa_device_port *port = data; + + sync_mixer(u, port); + return 0; + } + } + + return pa_sink_process_msg(o, code, data, offset, chunk); +} + +/* Called from main context */ +static int sink_set_state_in_main_thread_cb(pa_sink *s, pa_sink_state_t new_state, pa_suspend_cause_t new_suspend_cause) { + pa_sink_state_t old_state; + struct userdata *u; + + pa_sink_assert_ref(s); + pa_assert_se(u = s->userdata); + + /* When our session becomes active, we need to sync the mixer, because + * another user may have changed the mixer settings. + * + * If deferred volume is enabled, the syncing is done in the + * set_state_in_io_thread() callback instead. */ + if (!(s->flags & PA_SINK_DEFERRED_VOLUME) + && (s->suspend_cause & PA_SUSPEND_SESSION) + && !(new_suspend_cause & PA_SUSPEND_SESSION)) + sync_mixer(u, s->active_port); + + old_state = u->sink->state; + + if (PA_SINK_IS_OPENED(old_state) && new_state == PA_SINK_SUSPENDED) + reserve_done(u); + else if (old_state == PA_SINK_SUSPENDED && PA_SINK_IS_OPENED(new_state)) + if (reserve_init(u, u->device_name) < 0) + return -PA_ERR_BUSY; + + return 0; +} + +/* Called from the IO thread. */ +static int sink_set_state_in_io_thread_cb(pa_sink *s, pa_sink_state_t new_state, pa_suspend_cause_t new_suspend_cause) { + struct userdata *u; + + pa_assert(s); + pa_assert_se(u = s->userdata); + + /* When our session becomes active, we need to sync the mixer, because + * another user may have changed the mixer settings. + * + * If deferred volume is disabled, the syncing is done in the + * set_state_in_main_thread() callback instead. */ + if ((s->flags & PA_SINK_DEFERRED_VOLUME) + && (s->suspend_cause & PA_SUSPEND_SESSION) + && !(new_suspend_cause & PA_SUSPEND_SESSION)) + sync_mixer(u, s->active_port); + + /* It may be that only the suspend cause is changing, in which case there's + * nothing more to do. */ + if (new_state == s->thread_info.state) + return 0; + + switch (new_state) { + + case PA_SINK_SUSPENDED: { + pa_assert(PA_SINK_IS_OPENED(s->thread_info.state)); + + suspend(u); + + break; + } + + case PA_SINK_IDLE: + case PA_SINK_RUNNING: { + int r; + + if (s->thread_info.state == PA_SINK_INIT) { + if (build_pollfd(u) < 0) + /* FIXME: This will cause an assertion failure, because + * with the current design pa_sink_put() is not allowed + * to fail and pa_sink_put() has no fallback code that + * would start the sink suspended if opening the device + * fails. */ + return -PA_ERR_IO; + } + + if (s->thread_info.state == PA_SINK_SUSPENDED) { + if ((r = unsuspend(u, false)) < 0) + return r; + } + + break; + } + + case PA_SINK_UNLINKED: + case PA_SINK_INIT: + case PA_SINK_INVALID_STATE: + break; + } + + return 0; +} + +static int ctl_mixer_callback(snd_mixer_elem_t *elem, unsigned int mask) { + struct userdata *u = snd_mixer_elem_get_callback_private(elem); + + pa_assert(u); + pa_assert(u->mixer_handle); + + if (mask == SND_CTL_EVENT_MASK_REMOVE) + return 0; + + if (!PA_SINK_IS_LINKED(u->sink->state)) + return 0; + + if (u->sink->suspend_cause & PA_SUSPEND_SESSION) + return 0; + + if (mask & SND_CTL_EVENT_MASK_VALUE) { + pa_sink_get_volume(u->sink, true); + pa_sink_get_mute(u->sink, true); + } + + return 0; +} + +static int io_mixer_callback(snd_mixer_elem_t *elem, unsigned int mask) { + struct userdata *u = snd_mixer_elem_get_callback_private(elem); + + pa_assert(u); + pa_assert(u->mixer_handle); + + if (mask == SND_CTL_EVENT_MASK_REMOVE) + return 0; + + if (u->sink->suspend_cause & PA_SUSPEND_SESSION) + return 0; + + if (mask & SND_CTL_EVENT_MASK_VALUE) + pa_sink_update_volume_and_mute(u->sink); + + return 0; +} + +static void sink_get_volume_cb(pa_sink *s) { + struct userdata *u = s->userdata; + pa_cvolume r; + char volume_buf[PA_CVOLUME_SNPRINT_VERBOSE_MAX]; + + pa_assert(u); + pa_assert(u->mixer_path); + pa_assert(u->mixer_handle); + + if (pa_alsa_path_get_volume(u->mixer_path, u->mixer_handle, &s->channel_map, &r) < 0) + return; + + /* Shift down by the base volume, so that 0dB becomes maximum volume */ + pa_sw_cvolume_multiply_scalar(&r, &r, s->base_volume); + + pa_log_debug("Read hardware volume: %s", + pa_cvolume_snprint_verbose(volume_buf, sizeof(volume_buf), &r, &s->channel_map, u->mixer_path->has_dB)); + + if (pa_cvolume_equal(&u->hardware_volume, &r)) + return; + + s->real_volume = u->hardware_volume = r; + + /* Hmm, so the hardware volume changed, let's reset our software volume */ + if (u->mixer_path->has_dB) + pa_sink_set_soft_volume(s, NULL); +} + +static void sink_set_volume_cb(pa_sink *s) { + struct userdata *u = s->userdata; + pa_cvolume r; + char volume_buf[PA_CVOLUME_SNPRINT_VERBOSE_MAX]; + bool deferred_volume = !!(s->flags & PA_SINK_DEFERRED_VOLUME); + + pa_assert(u); + pa_assert(u->mixer_path); + pa_assert(u->mixer_handle); + + /* Shift up by the base volume */ + pa_sw_cvolume_divide_scalar(&r, &s->real_volume, s->base_volume); + + if (pa_alsa_path_set_volume(u->mixer_path, u->mixer_handle, &s->channel_map, &r, deferred_volume, !deferred_volume) < 0) + return; + + /* Shift down by the base volume, so that 0dB becomes maximum volume */ + pa_sw_cvolume_multiply_scalar(&r, &r, s->base_volume); + + u->hardware_volume = r; + + if (u->mixer_path->has_dB) { + pa_cvolume new_soft_volume; + bool accurate_enough; + + /* Match exactly what the user requested by software */ + pa_sw_cvolume_divide(&new_soft_volume, &s->real_volume, &u->hardware_volume); + + /* If the adjustment to do in software is only minimal we + * can skip it. That saves us CPU at the expense of a bit of + * accuracy */ + accurate_enough = + (pa_cvolume_min(&new_soft_volume) >= (PA_VOLUME_NORM - VOLUME_ACCURACY)) && + (pa_cvolume_max(&new_soft_volume) <= (PA_VOLUME_NORM + VOLUME_ACCURACY)); + + pa_log_debug("Requested volume: %s", + pa_cvolume_snprint_verbose(volume_buf, sizeof(volume_buf), &s->real_volume, &s->channel_map, true)); + pa_log_debug("Got hardware volume: %s", + pa_cvolume_snprint_verbose(volume_buf, sizeof(volume_buf), &u->hardware_volume, &s->channel_map, true)); + pa_log_debug("Calculated software volume: %s (accurate-enough=%s)", + pa_cvolume_snprint_verbose(volume_buf, sizeof(volume_buf), &new_soft_volume, &s->channel_map, true), + pa_yes_no(accurate_enough)); + + if (!accurate_enough) + s->soft_volume = new_soft_volume; + + } else { + pa_log_debug("Wrote hardware volume: %s", + pa_cvolume_snprint_verbose(volume_buf, sizeof(volume_buf), &r, &s->channel_map, false)); + + /* We can't match exactly what the user requested, hence let's + * at least tell the user about it */ + + s->real_volume = r; + } +} + +static void sink_write_volume_cb(pa_sink *s) { + struct userdata *u = s->userdata; + pa_cvolume hw_vol = s->thread_info.current_hw_volume; + + pa_assert(u); + pa_assert(u->mixer_path); + pa_assert(u->mixer_handle); + pa_assert(s->flags & PA_SINK_DEFERRED_VOLUME); + + /* Shift up by the base volume */ + pa_sw_cvolume_divide_scalar(&hw_vol, &hw_vol, s->base_volume); + + if (pa_alsa_path_set_volume(u->mixer_path, u->mixer_handle, &s->channel_map, &hw_vol, true, true) < 0) + pa_log_error("Writing HW volume failed"); + else { + pa_cvolume tmp_vol; + bool accurate_enough; + + /* Shift down by the base volume, so that 0dB becomes maximum volume */ + pa_sw_cvolume_multiply_scalar(&hw_vol, &hw_vol, s->base_volume); + + pa_sw_cvolume_divide(&tmp_vol, &hw_vol, &s->thread_info.current_hw_volume); + accurate_enough = + (pa_cvolume_min(&tmp_vol) >= (PA_VOLUME_NORM - VOLUME_ACCURACY)) && + (pa_cvolume_max(&tmp_vol) <= (PA_VOLUME_NORM + VOLUME_ACCURACY)); + + if (!accurate_enough) { + char volume_buf[2][PA_CVOLUME_SNPRINT_VERBOSE_MAX]; + + pa_log_debug("Written HW volume did not match with the request: %s (request) != %s", + pa_cvolume_snprint_verbose(volume_buf[0], + sizeof(volume_buf[0]), + &s->thread_info.current_hw_volume, + &s->channel_map, + true), + pa_cvolume_snprint_verbose(volume_buf[1], sizeof(volume_buf[1]), &hw_vol, &s->channel_map, true)); + } + } +} + +static int sink_get_mute_cb(pa_sink *s, bool *mute) { + struct userdata *u = s->userdata; + + pa_assert(u); + pa_assert(u->mixer_path); + pa_assert(u->mixer_handle); + + if (pa_alsa_path_get_mute(u->mixer_path, u->mixer_handle, mute) < 0) + return -1; + + return 0; +} + +static void sink_set_mute_cb(pa_sink *s) { + struct userdata *u = s->userdata; + + pa_assert(u); + pa_assert(u->mixer_path); + pa_assert(u->mixer_handle); + + pa_alsa_path_set_mute(u->mixer_path, u->mixer_handle, s->muted); +} + +static void mixer_volume_init(struct userdata *u) { + pa_assert(u); + + if (!u->mixer_path || !u->mixer_path->has_volume) { + pa_sink_set_write_volume_callback(u->sink, NULL); + pa_sink_set_get_volume_callback(u->sink, NULL); + pa_sink_set_set_volume_callback(u->sink, NULL); + + pa_log_info("Driver does not support hardware volume control, falling back to software volume control."); + } else { + pa_sink_set_get_volume_callback(u->sink, sink_get_volume_cb); + pa_sink_set_set_volume_callback(u->sink, sink_set_volume_cb); + + if (u->mixer_path->has_dB && u->deferred_volume) { + pa_sink_set_write_volume_callback(u->sink, sink_write_volume_cb); + pa_log_info("Successfully enabled deferred volume."); + } else + pa_sink_set_write_volume_callback(u->sink, NULL); + + if (u->mixer_path->has_dB) { + pa_sink_enable_decibel_volume(u->sink, true); + pa_log_info("Hardware volume ranges from %0.2f dB to %0.2f dB.", u->mixer_path->min_dB, u->mixer_path->max_dB); + + u->sink->base_volume = pa_sw_volume_from_dB(-u->mixer_path->max_dB); + u->sink->n_volume_steps = PA_VOLUME_NORM+1; + + pa_log_info("Fixing base volume to %0.2f dB", pa_sw_volume_to_dB(u->sink->base_volume)); + } else { + pa_sink_enable_decibel_volume(u->sink, false); + pa_log_info("Hardware volume ranges from %li to %li.", u->mixer_path->min_volume, u->mixer_path->max_volume); + + u->sink->base_volume = PA_VOLUME_NORM; + u->sink->n_volume_steps = u->mixer_path->max_volume - u->mixer_path->min_volume + 1; + } + + pa_log_info("Using hardware volume control. Hardware dB scale %s.", u->mixer_path->has_dB ? "supported" : "not supported"); + } + + if (!u->mixer_path || !u->mixer_path->has_mute) { + pa_sink_set_get_mute_callback(u->sink, NULL); + pa_sink_set_set_mute_callback(u->sink, NULL); + pa_log_info("Driver does not support hardware mute control, falling back to software mute control."); + } else { + pa_sink_set_get_mute_callback(u->sink, sink_get_mute_cb); + pa_sink_set_set_mute_callback(u->sink, sink_set_mute_cb); + pa_log_info("Using hardware mute control."); + } +} + +static int sink_set_port_ucm_cb(pa_sink *s, pa_device_port *p) { + struct userdata *u = s->userdata; + pa_alsa_ucm_port_data *data; + + pa_assert(u); + pa_assert(p); + pa_assert(u->ucm_context); + + data = PA_DEVICE_PORT_DATA(p); + u->mixer_path = data->path; + mixer_volume_init(u); + + if (s->flags & PA_SINK_DEFERRED_VOLUME) + pa_asyncmsgq_send(u->sink->asyncmsgq, PA_MSGOBJECT(u->sink), SINK_MESSAGE_SYNC_MIXER, p, 0, NULL); + else + sync_mixer(u, p); + + return pa_alsa_ucm_set_port(u->ucm_context, p, true); +} + +static int sink_set_port_cb(pa_sink *s, pa_device_port *p) { + struct userdata *u = s->userdata; + pa_alsa_port_data *data; + + pa_assert(u); + pa_assert(p); + pa_assert(u->mixer_handle); + pa_assert(!u->ucm_context); + + data = PA_DEVICE_PORT_DATA(p); + pa_assert_se(u->mixer_path = data->path); + mixer_volume_init(u); + + if (s->flags & PA_SINK_DEFERRED_VOLUME) + pa_asyncmsgq_send(u->sink->asyncmsgq, PA_MSGOBJECT(u->sink), SINK_MESSAGE_SYNC_MIXER, p, 0, NULL); + else + sync_mixer(u, p); + + if (data->suspend_when_unavailable && p->available == PA_AVAILABLE_NO) + pa_sink_suspend(s, true, PA_SUSPEND_UNAVAILABLE); + else + pa_sink_suspend(s, false, PA_SUSPEND_UNAVAILABLE); + + return 0; +} + +static void sink_update_requested_latency_cb(pa_sink *s) { + struct userdata *u = s->userdata; + pa_assert(u); + pa_assert(u->use_tsched); /* only when timer scheduling is used + * we can dynamically adjust the + * latency */ + + if (!u->pcm_handle) + return; + + update_sw_params(u, true); +} + +static pa_idxset* sink_get_formats(pa_sink *s) { + struct userdata *u = s->userdata; + + pa_assert(u); + + return pa_idxset_copy(u->formats, (pa_copy_func_t) pa_format_info_copy); +} + +static bool sink_set_formats(pa_sink *s, pa_idxset *formats) { + struct userdata *u = s->userdata; + pa_format_info *f, *g; + uint32_t idx, n; + + pa_assert(u); + + /* FIXME: also validate sample rates against what the device supports */ + PA_IDXSET_FOREACH(f, formats, idx) { + if (is_iec958(u) && f->encoding == PA_ENCODING_EAC3_IEC61937) + /* EAC3 cannot be sent over over S/PDIF */ + return false; + } + + pa_idxset_free(u->formats, (pa_free_cb_t) pa_format_info_free); + u->formats = pa_idxset_new(NULL, NULL); + + /* Note: the logic below won't apply if we're using software encoding. + * This is fine for now since we don't support that via the passthrough + * framework, but this must be changed if we do. */ + + /* Count how many sample rates we support */ + for (idx = 0, n = 0; u->supported_rates[idx]; idx++) + n++; + + /* First insert non-PCM formats since we prefer those. */ + PA_IDXSET_FOREACH(f, formats, idx) { + if (!pa_format_info_is_pcm(f)) { + g = pa_format_info_copy(f); + pa_format_info_set_prop_int_array(g, PA_PROP_FORMAT_RATE, (int *) u->supported_rates, n); + pa_idxset_put(u->formats, g, NULL); + } + } + + /* Now add any PCM formats */ + PA_IDXSET_FOREACH(f, formats, idx) { + if (pa_format_info_is_pcm(f)) { + /* We don't set rates here since we'll just tack on a resampler for + * unsupported rates */ + pa_idxset_put(u->formats, pa_format_info_copy(f), NULL); + } + } + + return true; +} + +static void sink_reconfigure_cb(pa_sink *s, pa_sample_spec *spec, bool passthrough) { + struct userdata *u = s->userdata; + int i; + bool format_supported = false; + bool rate_supported = false; + + pa_assert(u); + + for (i = 0; u->supported_formats[i] != PA_SAMPLE_MAX; i++) { + if (u->supported_formats[i] == spec->format) { + pa_sink_set_sample_format(u->sink, spec->format); + format_supported = true; + break; + } + } + + if (!format_supported) { + pa_log_info("Sink does not support sample format of %s, set it to a verified value", + pa_sample_format_to_string(spec->format)); + pa_sink_set_sample_format(u->sink, u->verified_sample_spec.format); + } + + for (i = 0; u->supported_rates[i]; i++) { + if (u->supported_rates[i] == spec->rate) { + pa_sink_set_sample_rate(u->sink, spec->rate); + rate_supported = true; + break; + } + } + + if (!rate_supported) { + pa_log_info("Sink does not support sample rate of %u, set it to a verified value", spec->rate); + pa_sink_set_sample_rate(u->sink, u->verified_sample_spec.rate); + } + + /* Passthrough status change is handled during unsuspend */ +} + +static int process_rewind(struct userdata *u) { + snd_pcm_sframes_t unused; + size_t rewind_nbytes, unused_nbytes, limit_nbytes; + int err; + pa_assert(u); + + if (!PA_SINK_IS_OPENED(u->sink->thread_info.state)) { + pa_sink_process_rewind(u->sink, 0); + return 0; + } + + /* Figure out how much we shall rewind and reset the counter */ + rewind_nbytes = u->sink->thread_info.rewind_nbytes; + + pa_log_debug("Requested to rewind %lu bytes.", (unsigned long) rewind_nbytes); + + if (PA_UNLIKELY((unused = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->sink->sample_spec)) < 0)) { + if ((err = try_recover(u, "snd_pcm_avail", (int) unused)) < 0) { + pa_log_warn("Trying to recover from underrun failed during rewind"); + return -1; + } + if (err == 1) + goto rewind_done; + } + + unused_nbytes = (size_t) unused * u->frame_size; + + /* make sure rewind doesn't go too far, can cause issues with DMAs */ + unused_nbytes += u->rewind_safeguard; + + if (u->hwbuf_size > unused_nbytes) + limit_nbytes = u->hwbuf_size - unused_nbytes; + else + limit_nbytes = 0; + + if (rewind_nbytes > limit_nbytes) + rewind_nbytes = limit_nbytes; + + if (rewind_nbytes > 0) { + snd_pcm_sframes_t in_frames, out_frames; + + pa_log_debug("Limited to %lu bytes.", (unsigned long) rewind_nbytes); + + in_frames = (snd_pcm_sframes_t) (rewind_nbytes / u->frame_size); + pa_log_debug("before: %lu", (unsigned long) in_frames); + if ((out_frames = snd_pcm_rewind(u->pcm_handle, (snd_pcm_uframes_t) in_frames)) < 0) { + pa_log("snd_pcm_rewind() failed: %s", pa_alsa_strerror((int) out_frames)); + if ((err = try_recover(u, "process_rewind", out_frames)) < 0) + return -1; + if (err == 1) + goto rewind_done; + out_frames = 0; + } + + pa_log_debug("after: %lu", (unsigned long) out_frames); + + rewind_nbytes = (size_t) out_frames * u->frame_size; + + if (rewind_nbytes <= 0) + pa_log_info("Tried rewind, but was apparently not possible."); + else { + u->write_count -= rewind_nbytes; + pa_log_debug("Rewound %lu bytes.", (unsigned long) rewind_nbytes); + pa_sink_process_rewind(u->sink, rewind_nbytes); + + u->after_rewind = true; + return 0; + } + } else + pa_log_debug("Mhmm, actually there is nothing to rewind."); + +rewind_done: + pa_sink_process_rewind(u->sink, 0); + return 0; +} + +static void thread_func(void *userdata) { + struct userdata *u = userdata; + unsigned short revents = 0; + + pa_assert(u); + + pa_log_debug("Thread starting up"); + + if (u->core->realtime_scheduling) + pa_thread_make_realtime(u->core->realtime_priority); + + pa_thread_mq_install(&u->thread_mq); + + for (;;) { + int ret; + pa_usec_t rtpoll_sleep = 0, real_sleep; + +#ifdef DEBUG_TIMING + pa_log_debug("Loop"); +#endif + + if (PA_UNLIKELY(u->sink->thread_info.rewind_requested)) { + if (process_rewind(u) < 0) + goto fail; + } + + /* Render some data and write it to the dsp */ + if (PA_SINK_IS_OPENED(u->sink->thread_info.state)) { + int work_done; + pa_usec_t sleep_usec = 0; + bool on_timeout = pa_rtpoll_timer_elapsed(u->rtpoll); + + if (u->use_mmap) + work_done = mmap_write(u, &sleep_usec, revents & POLLOUT, on_timeout); + else + work_done = unix_write(u, &sleep_usec, revents & POLLOUT, on_timeout); + + if (work_done < 0) + goto fail; + +/* pa_log_debug("work_done = %i", work_done); */ + + if (work_done) { + + if (u->first) { + pa_log_info("Starting playback."); + snd_pcm_start(u->pcm_handle); + + pa_smoother_resume(u->smoother, pa_rtclock_now(), true); + + u->first = false; + } + + update_smoother(u); + } + + if (u->use_tsched) { + pa_usec_t cusec; + + if (u->since_start <= u->hwbuf_size) { + + /* USB devices on ALSA seem to hit a buffer + * underrun during the first iterations much + * quicker then we calculate here, probably due to + * the transport latency. To accommodate for that + * we artificially decrease the sleep time until + * we have filled the buffer at least once + * completely.*/ + + if (pa_log_ratelimit(PA_LOG_DEBUG)) + pa_log_debug("Cutting sleep time for the initial iterations by half."); + sleep_usec /= 2; + } + + /* OK, the playback buffer is now full, let's + * calculate when to wake up next */ +#ifdef DEBUG_TIMING + pa_log_debug("Waking up in %0.2fms (sound card clock).", (double) sleep_usec / PA_USEC_PER_MSEC); +#endif + + /* Convert from the sound card time domain to the + * system time domain */ + cusec = pa_smoother_translate(u->smoother, pa_rtclock_now(), sleep_usec); + +#ifdef DEBUG_TIMING + pa_log_debug("Waking up in %0.2fms (system clock).", (double) cusec / PA_USEC_PER_MSEC); +#endif + + /* We don't trust the conversion, so we wake up whatever comes first */ + rtpoll_sleep = PA_MIN(sleep_usec, cusec); + } + + u->after_rewind = false; + + } + + if (u->sink->flags & PA_SINK_DEFERRED_VOLUME) { + pa_usec_t volume_sleep; + pa_sink_volume_change_apply(u->sink, &volume_sleep); + if (volume_sleep > 0) { + if (rtpoll_sleep > 0) + rtpoll_sleep = PA_MIN(volume_sleep, rtpoll_sleep); + else + rtpoll_sleep = volume_sleep; + } + } + + if (rtpoll_sleep > 0) { + pa_rtpoll_set_timer_relative(u->rtpoll, rtpoll_sleep); + real_sleep = pa_rtclock_now(); + } + else + pa_rtpoll_set_timer_disabled(u->rtpoll); + + /* Hmm, nothing to do. Let's sleep */ + if ((ret = pa_rtpoll_run(u->rtpoll)) < 0) + goto fail; + + if (rtpoll_sleep > 0) { + real_sleep = pa_rtclock_now() - real_sleep; +#ifdef DEBUG_TIMING + pa_log_debug("Expected sleep: %0.2fms, real sleep: %0.2fms (diff %0.2f ms)", + (double) rtpoll_sleep / PA_USEC_PER_MSEC, (double) real_sleep / PA_USEC_PER_MSEC, + (double) ((int64_t) real_sleep - (int64_t) rtpoll_sleep) / PA_USEC_PER_MSEC); +#endif + if (u->use_tsched && real_sleep > rtpoll_sleep + u->tsched_watermark_usec) + pa_log_info("Scheduling delay of %0.2f ms > %0.2f ms, you might want to investigate this to improve latency...", + (double) (real_sleep - rtpoll_sleep) / PA_USEC_PER_MSEC, + (double) (u->tsched_watermark_usec) / PA_USEC_PER_MSEC); + } + + if (u->sink->flags & PA_SINK_DEFERRED_VOLUME) + pa_sink_volume_change_apply(u->sink, NULL); + + if (ret == 0) + goto finish; + + /* Tell ALSA about this and process its response */ + if (PA_SINK_IS_OPENED(u->sink->thread_info.state)) { + struct pollfd *pollfd; + int err; + unsigned n; + + pollfd = pa_rtpoll_item_get_pollfd(u->alsa_rtpoll_item, &n); + + if ((err = snd_pcm_poll_descriptors_revents(u->pcm_handle, pollfd, n, &revents)) < 0) { + pa_log("snd_pcm_poll_descriptors_revents() failed: %s", pa_alsa_strerror(err)); + goto fail; + } + + if (revents & ~POLLOUT) { + if ((err = pa_alsa_recover_from_poll(u->pcm_handle, revents)) < 0) + goto fail; + + /* Stream needs to be restarted */ + if (err == 1) { + close_pcm(u); + if (unsuspend(u, true) < 0) + goto fail; + } else + reset_vars(u); + + revents = 0; + } else if (revents && u->use_tsched && pa_log_ratelimit(PA_LOG_DEBUG)) + pa_log_debug("Wakeup from ALSA!"); + + } else + revents = 0; + } + +fail: + /* If this was no regular exit from the loop we have to continue + * processing messages until we received PA_MESSAGE_SHUTDOWN */ + pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL); + pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN); + +finish: + pa_log_debug("Thread shutting down"); +} + +static void set_sink_name(pa_sink_new_data *data, pa_modargs *ma, const char *device_id, const char *device_name, pa_alsa_mapping *mapping) { + const char *n; + char *t; + + pa_assert(data); + pa_assert(ma); + pa_assert(device_name); + + if ((n = pa_modargs_get_value(ma, "sink_name", NULL))) { + pa_sink_new_data_set_name(data, n); + data->namereg_fail = true; + return; + } + + if ((n = pa_modargs_get_value(ma, "name", NULL))) + data->namereg_fail = true; + else { + n = device_id ? device_id : device_name; + data->namereg_fail = false; + } + + if (mapping) + t = pa_sprintf_malloc("alsa_output.%s.%s", n, mapping->name); + else + t = pa_sprintf_malloc("alsa_output.%s", n); + + pa_sink_new_data_set_name(data, t); + pa_xfree(t); +} + +static void find_mixer(struct userdata *u, pa_alsa_mapping *mapping, const char *element, bool ignore_dB) { + const char *mdev; + + if (!mapping && !element) + return; + + if (!element && mapping && pa_alsa_path_set_is_empty(mapping->output_path_set)) + return; + + u->mixers = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, + NULL, (pa_free_cb_t) pa_alsa_mixer_free); + + mdev = pa_proplist_gets(mapping->proplist, "alsa.mixer_device"); + if (mdev) { + u->mixer_handle = pa_alsa_open_mixer_by_name(u->mixers, mdev, true); + } else { + u->mixer_handle = pa_alsa_open_mixer_for_pcm(u->mixers, u->pcm_handle, true); + } + if (!u->mixer_handle) { + pa_log_info("Failed to find a working mixer device."); + return; + } + + if (element) { + + if (!(u->mixer_path = pa_alsa_path_synthesize(element, PA_ALSA_DIRECTION_OUTPUT))) + goto fail; + + if (pa_alsa_path_probe(u->mixer_path, NULL, u->mixer_handle, ignore_dB) < 0) + goto fail; + + pa_log_debug("Probed mixer path %s:", u->mixer_path->name); + pa_alsa_path_dump(u->mixer_path); + } else { + u->mixer_path_set = mapping->output_path_set; + } + + return; + +fail: + + if (u->mixer_path) { + pa_alsa_path_free(u->mixer_path); + u->mixer_path = NULL; + } + + u->mixer_handle = NULL; + pa_hashmap_free(u->mixers); + u->mixers = NULL; +} + +static int setup_mixer(struct userdata *u, bool ignore_dB) { + bool need_mixer_callback = false; + + pa_assert(u); + + /* This code is before the u->mixer_handle check, because if the UCM + * configuration doesn't specify volume or mute controls, u->mixer_handle + * will be NULL, but the UCM device enable sequence will still need to be + * executed. */ + if (u->sink->active_port && u->ucm_context) { + if (pa_alsa_ucm_set_port(u->ucm_context, u->sink->active_port, true) < 0) + return -1; + } + + if (!u->mixer_handle) + return 0; + + if (u->sink->active_port) { + if (!u->ucm_context) { + pa_alsa_port_data *data; + + /* We have a list of supported paths, so let's activate the + * one that has been chosen as active */ + + data = PA_DEVICE_PORT_DATA(u->sink->active_port); + u->mixer_path = data->path; + + pa_alsa_path_select(data->path, data->setting, u->mixer_handle, u->sink->muted); + } else { + pa_alsa_ucm_port_data *data; + + data = PA_DEVICE_PORT_DATA(u->sink->active_port); + + /* Now activate volume controls, if any */ + if (data->path) { + u->mixer_path = data->path; + pa_alsa_path_select(u->mixer_path, NULL, u->mixer_handle, u->sink->muted); + } + } + } else { + + if (!u->mixer_path && u->mixer_path_set) + u->mixer_path = pa_hashmap_first(u->mixer_path_set->paths); + + if (u->mixer_path) { + /* Hmm, we have only a single path, then let's activate it */ + + pa_alsa_path_select(u->mixer_path, u->mixer_path->settings, u->mixer_handle, u->sink->muted); + } else + return 0; + } + + mixer_volume_init(u); + + /* Will we need to register callbacks? */ + if (u->mixer_path_set && u->mixer_path_set->paths) { + pa_alsa_path *p; + void *state; + + PA_HASHMAP_FOREACH(p, u->mixer_path_set->paths, state) { + if (p->has_volume || p->has_mute) + need_mixer_callback = true; + } + } + else if (u->mixer_path) + need_mixer_callback = u->mixer_path->has_volume || u->mixer_path->has_mute; + + if (need_mixer_callback) { + int (*mixer_callback)(snd_mixer_elem_t *, unsigned int); + if (u->sink->flags & PA_SINK_DEFERRED_VOLUME) { + u->mixer_pd = pa_alsa_mixer_pdata_new(); + mixer_callback = io_mixer_callback; + + if (pa_alsa_set_mixer_rtpoll(u->mixer_pd, u->mixer_handle, u->rtpoll) < 0) { + pa_log("Failed to initialize file descriptor monitoring"); + return -1; + } + } else { + u->mixer_fdl = pa_alsa_fdlist_new(); + mixer_callback = ctl_mixer_callback; + + if (pa_alsa_fdlist_set_handle(u->mixer_fdl, u->mixer_handle, NULL, u->core->mainloop) < 0) { + pa_log("Failed to initialize file descriptor monitoring"); + return -1; + } + } + + if (u->mixer_path_set) + pa_alsa_path_set_set_callback(u->mixer_path_set, u->mixer_handle, mixer_callback, u); + else + pa_alsa_path_set_callback(u->mixer_path, u->mixer_handle, mixer_callback, u); + } + + return 0; +} + +pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_card *card, pa_alsa_mapping *mapping) { + + struct userdata *u = NULL; + const char *dev_id = NULL, *key, *mod_name; + pa_sample_spec ss; + char *thread_name = NULL; + uint32_t alternate_sample_rate; + pa_channel_map map; + uint32_t nfrags, frag_size, buffer_size, tsched_size, tsched_watermark, rewind_safeguard; + snd_pcm_uframes_t period_frames, buffer_frames, tsched_frames; + size_t frame_size; + bool use_mmap = true; + bool use_tsched = true; + bool ignore_dB = false; + bool namereg_fail = false; + bool deferred_volume = false; + bool set_formats = false; + bool fixed_latency_range = false; + bool b; + bool d; + bool avoid_resampling; + pa_sink_new_data data; + bool volume_is_set; + bool mute_is_set; + pa_alsa_profile_set *profile_set = NULL; + void *state; + + pa_assert(m); + pa_assert(ma); + + ss = m->core->default_sample_spec; + map = m->core->default_channel_map; + avoid_resampling = m->core->avoid_resampling; + + /* Pick sample spec overrides from the mapping, if any */ + if (mapping) { + if (mapping->sample_spec.format != PA_SAMPLE_INVALID) + ss.format = mapping->sample_spec.format; + if (mapping->sample_spec.rate != 0) + ss.rate = mapping->sample_spec.rate; + if (mapping->sample_spec.channels != 0) { + ss.channels = mapping->sample_spec.channels; + if (pa_channel_map_valid(&mapping->channel_map)) + pa_assert(pa_channel_map_compatible(&mapping->channel_map, &ss)); + } + } + + /* Override with modargs if provided */ + if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_ALSA) < 0) { + pa_log("Failed to parse sample specification and channel map"); + goto fail; + } + + alternate_sample_rate = m->core->alternate_sample_rate; + if (pa_modargs_get_alternate_sample_rate(ma, &alternate_sample_rate) < 0) { + pa_log("Failed to parse alternate sample rate"); + goto fail; + } + + frame_size = pa_frame_size(&ss); + + nfrags = m->core->default_n_fragments; + frag_size = (uint32_t) pa_usec_to_bytes(m->core->default_fragment_size_msec*PA_USEC_PER_MSEC, &ss); + if (frag_size <= 0) + frag_size = (uint32_t) frame_size; + tsched_size = (uint32_t) pa_usec_to_bytes(DEFAULT_TSCHED_BUFFER_USEC, &ss); + tsched_watermark = (uint32_t) pa_usec_to_bytes(DEFAULT_TSCHED_WATERMARK_USEC, &ss); + + if (pa_modargs_get_value_u32(ma, "fragments", &nfrags) < 0 || + pa_modargs_get_value_u32(ma, "fragment_size", &frag_size) < 0 || + pa_modargs_get_value_u32(ma, "tsched_buffer_size", &tsched_size) < 0 || + pa_modargs_get_value_u32(ma, "tsched_buffer_watermark", &tsched_watermark) < 0) { + pa_log("Failed to parse buffer metrics"); + goto fail; + } + + buffer_size = nfrags * frag_size; + + period_frames = frag_size/frame_size; + buffer_frames = buffer_size/frame_size; + tsched_frames = tsched_size/frame_size; + + if (pa_modargs_get_value_boolean(ma, "mmap", &use_mmap) < 0) { + pa_log("Failed to parse mmap argument."); + goto fail; + } + + if (pa_modargs_get_value_boolean(ma, "tsched", &use_tsched) < 0) { + pa_log("Failed to parse tsched argument."); + goto fail; + } + + if (pa_modargs_get_value_boolean(ma, "ignore_dB", &ignore_dB) < 0) { + pa_log("Failed to parse ignore_dB argument."); + goto fail; + } + + rewind_safeguard = PA_MAX(DEFAULT_REWIND_SAFEGUARD_BYTES, pa_usec_to_bytes(DEFAULT_REWIND_SAFEGUARD_USEC, &ss)); + if (pa_modargs_get_value_u32(ma, "rewind_safeguard", &rewind_safeguard) < 0) { + pa_log("Failed to parse rewind_safeguard argument"); + goto fail; + } + + deferred_volume = m->core->deferred_volume; + if (pa_modargs_get_value_boolean(ma, "deferred_volume", &deferred_volume) < 0) { + pa_log("Failed to parse deferred_volume argument."); + goto fail; + } + + if (pa_modargs_get_value_boolean(ma, "fixed_latency_range", &fixed_latency_range) < 0) { + pa_log("Failed to parse fixed_latency_range argument."); + goto fail; + } + + use_tsched = pa_alsa_may_tsched(use_tsched); + + u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + u->use_mmap = use_mmap; + u->use_tsched = use_tsched; + u->tsched_size = tsched_size; + u->initial_info.nfrags = (size_t) nfrags; + u->initial_info.fragment_size = (size_t) frag_size; + u->initial_info.tsched_size = (size_t) tsched_size; + u->initial_info.tsched_watermark = (size_t) tsched_watermark; + u->initial_info.rewind_safeguard = (size_t) rewind_safeguard; + u->deferred_volume = deferred_volume; + u->fixed_latency_range = fixed_latency_range; + u->first = true; + u->rewind_safeguard = rewind_safeguard; + u->rtpoll = pa_rtpoll_new(); + + if (pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll) < 0) { + pa_log("pa_thread_mq_init() failed."); + goto fail; + } + + u->smoother = pa_smoother_new( + SMOOTHER_ADJUST_USEC, + SMOOTHER_WINDOW_USEC, + true, + true, + 5, + pa_rtclock_now(), + true); + u->smoother_interval = SMOOTHER_MIN_INTERVAL; + + /* use ucm */ + if (mapping && mapping->ucm_context.ucm) + u->ucm_context = &mapping->ucm_context; + + dev_id = pa_modargs_get_value( + ma, "device_id", + pa_modargs_get_value(ma, "device", DEFAULT_DEVICE)); + + u->paths_dir = pa_xstrdup(pa_modargs_get_value(ma, "paths_dir", NULL)); + + if (reserve_init(u, dev_id) < 0) + goto fail; + + if (reserve_monitor_init(u, dev_id) < 0) + goto fail; + + b = use_mmap; + d = use_tsched; + + /* Force ALSA to reread its configuration if module-alsa-card didn't + * do it for us. This matters if our device was hot-plugged after ALSA + * has already read its configuration - see + * https://bugs.freedesktop.org/show_bug.cgi?id=54029 + */ + + if (!card) + snd_config_update_free_global(); + + if (mapping) { + + if (!(dev_id = pa_modargs_get_value(ma, "device_id", NULL))) { + pa_log("device_id= not set"); + goto fail; + } + + if ((mod_name = pa_proplist_gets(mapping->proplist, PA_ALSA_PROP_UCM_MODIFIER))) { + if (snd_use_case_set(u->ucm_context->ucm->ucm_mgr, "_enamod", mod_name) < 0) + pa_log("Failed to enable ucm modifier %s", mod_name); + else + pa_log_debug("Enabled ucm modifier %s", mod_name); + } + + if (!(u->pcm_handle = pa_alsa_open_by_device_id_mapping( + dev_id, + &u->device_name, + &ss, &map, + SND_PCM_STREAM_PLAYBACK, + &period_frames, &buffer_frames, tsched_frames, + &b, &d, mapping))) + goto fail; + + } else if ((dev_id = pa_modargs_get_value(ma, "device_id", NULL))) { + + if (!(profile_set = pa_alsa_profile_set_new(NULL, &map))) + goto fail; + + if (!(u->pcm_handle = pa_alsa_open_by_device_id_auto( + dev_id, + &u->device_name, + &ss, &map, + SND_PCM_STREAM_PLAYBACK, + &period_frames, &buffer_frames, tsched_frames, + &b, &d, profile_set, &mapping))) + goto fail; + + } else { + + if (!(u->pcm_handle = pa_alsa_open_by_device_string( + pa_modargs_get_value(ma, "device", DEFAULT_DEVICE), + &u->device_name, + &ss, &map, + SND_PCM_STREAM_PLAYBACK, + &period_frames, &buffer_frames, tsched_frames, + &b, &d, false))) + goto fail; + } + + pa_assert(u->device_name); + pa_log_info("Successfully opened device %s.", u->device_name); + + if (pa_alsa_pcm_is_modem(u->pcm_handle)) { + pa_log_notice("Device %s is modem, refusing further initialization.", u->device_name); + goto fail; + } + + if (mapping) + pa_log_info("Selected mapping '%s' (%s).", mapping->description, mapping->name); + + if (use_mmap && !b) { + pa_log_info("Device doesn't support mmap(), falling back to UNIX read/write mode."); + u->use_mmap = use_mmap = false; + } + + if (use_tsched && (!b || !d)) { + pa_log_info("Cannot enable timer-based scheduling, falling back to sound IRQ scheduling."); + u->use_tsched = use_tsched = false; + } + + if (u->use_mmap) + pa_log_info("Successfully enabled mmap() mode."); + + if (u->use_tsched) { + pa_log_info("Successfully enabled timer-based scheduling mode."); + + if (u->fixed_latency_range) + pa_log_info("Disabling latency range changes on underrun"); + } + + /* All passthrough formats supported by PulseAudio require + * IEC61937 framing with two fake channels. So, passthrough + * clients will always send two channels. Multichannel sinks + * cannot accept that, because nobody implemented sink channel count + * switching so far. So just don't show known non-working settings + * to the user. */ + if ((is_iec958(u) || is_hdmi(u)) && ss.channels == 2) + set_formats = true; + + u->verified_sample_spec = ss; + + u->supported_formats = pa_alsa_get_supported_formats(u->pcm_handle, ss.format); + if (!u->supported_formats) { + pa_log_error("Failed to find any supported sample formats."); + goto fail; + } + + u->supported_rates = pa_alsa_get_supported_rates(u->pcm_handle, ss.rate); + if (!u->supported_rates) { + pa_log_error("Failed to find any supported sample rates."); + goto fail; + } + + /* ALSA might tweak the sample spec, so recalculate the frame size */ + frame_size = pa_frame_size(&ss); + + pa_sink_new_data_init(&data); + data.driver = driver; + data.module = m; + data.card = card; + set_sink_name(&data, ma, dev_id, u->device_name, mapping); + + /* We need to give pa_modargs_get_value_boolean() a pointer to a local + * variable instead of using &data.namereg_fail directly, because + * data.namereg_fail is a bitfield and taking the address of a bitfield + * variable is impossible. */ + namereg_fail = data.namereg_fail; + if (pa_modargs_get_value_boolean(ma, "namereg_fail", &namereg_fail) < 0) { + pa_log("Failed to parse namereg_fail argument."); + pa_sink_new_data_done(&data); + goto fail; + } + data.namereg_fail = namereg_fail; + + if (pa_modargs_get_value_boolean(ma, "avoid_resampling", &avoid_resampling) < 0) { + pa_log("Failed to parse avoid_resampling argument."); + pa_sink_new_data_done(&data); + goto fail; + } + pa_sink_new_data_set_avoid_resampling(&data, avoid_resampling); + + pa_sink_new_data_set_sample_spec(&data, &ss); + pa_sink_new_data_set_channel_map(&data, &map); + pa_sink_new_data_set_alternate_sample_rate(&data, alternate_sample_rate); + + pa_alsa_init_proplist_pcm(m->core, data.proplist, u->pcm_handle); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, u->device_name); + pa_proplist_setf(data.proplist, PA_PROP_DEVICE_BUFFERING_BUFFER_SIZE, "%lu", (unsigned long) (buffer_frames * frame_size)); + pa_proplist_setf(data.proplist, PA_PROP_DEVICE_BUFFERING_FRAGMENT_SIZE, "%lu", (unsigned long) (period_frames * frame_size)); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_ACCESS_MODE, u->use_tsched ? "mmap+timer" : (u->use_mmap ? "mmap" : "serial")); + + if (mapping) { + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_PROFILE_NAME, mapping->name); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_PROFILE_DESCRIPTION, mapping->description); + + state = NULL; + while ((key = pa_proplist_iterate(mapping->proplist, &state))) + pa_proplist_sets(data.proplist, key, pa_proplist_gets(mapping->proplist, key)); + } + + pa_alsa_init_description(data.proplist, card); + + if (u->control_device) + pa_alsa_init_proplist_ctl(data.proplist, u->control_device); + + if (pa_modargs_get_proplist(ma, "sink_properties", data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_sink_new_data_done(&data); + goto fail; + } + + if (u->ucm_context) { + pa_alsa_ucm_add_ports(&data.ports, data.proplist, u->ucm_context, true, card, u->pcm_handle, ignore_dB); + find_mixer(u, mapping, pa_modargs_get_value(ma, "control", NULL), ignore_dB); + } else { + find_mixer(u, mapping, pa_modargs_get_value(ma, "control", NULL), ignore_dB); + if (u->mixer_path_set) + pa_alsa_add_ports(&data, u->mixer_path_set, card); + } + + u->sink = pa_sink_new(m->core, &data, PA_SINK_HARDWARE | PA_SINK_LATENCY | (u->use_tsched ? PA_SINK_DYNAMIC_LATENCY : 0) | + (set_formats ? PA_SINK_SET_FORMATS : 0)); + volume_is_set = data.volume_is_set; + mute_is_set = data.muted_is_set; + pa_sink_new_data_done(&data); + + if (!u->sink) { + pa_log("Failed to create sink object"); + goto fail; + } + + if (u->ucm_context) { + pa_device_port *port; + unsigned h_prio = 0; + PA_HASHMAP_FOREACH(port, u->sink->ports, state) { + if (!h_prio || port->priority > h_prio) + h_prio = port->priority; + } + /* ucm ports prioriy is 100, 200, ..., 900, change it to units digit */ + h_prio = h_prio / 100; + u->sink->priority += h_prio; + } + + if (pa_modargs_get_value_u32(ma, "deferred_volume_safety_margin", + &u->sink->thread_info.volume_change_safety_margin) < 0) { + pa_log("Failed to parse deferred_volume_safety_margin parameter"); + goto fail; + } + + if (pa_modargs_get_value_s32(ma, "deferred_volume_extra_delay", + &u->sink->thread_info.volume_change_extra_delay) < 0) { + pa_log("Failed to parse deferred_volume_extra_delay parameter"); + goto fail; + } + + u->sink->parent.process_msg = sink_process_msg; + if (u->use_tsched) + u->sink->update_requested_latency = sink_update_requested_latency_cb; + u->sink->set_state_in_main_thread = sink_set_state_in_main_thread_cb; + u->sink->set_state_in_io_thread = sink_set_state_in_io_thread_cb; + if (u->ucm_context) + u->sink->set_port = sink_set_port_ucm_cb; + else + u->sink->set_port = sink_set_port_cb; + u->sink->reconfigure = sink_reconfigure_cb; + u->sink->userdata = u; + + pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq); + pa_sink_set_rtpoll(u->sink, u->rtpoll); + + u->frame_size = frame_size; + u->frames_per_block = pa_mempool_block_size_max(m->core->mempool) / frame_size; + u->fragment_size = frag_size = (size_t) (period_frames * frame_size); + u->hwbuf_size = buffer_size = (size_t) (buffer_frames * frame_size); + pa_cvolume_mute(&u->hardware_volume, u->sink->sample_spec.channels); + + pa_log_info("Using %0.1f fragments of size %lu bytes (%0.2fms), buffer size is %lu bytes (%0.2fms)", + (double) u->hwbuf_size / (double) u->fragment_size, + (long unsigned) u->fragment_size, + (double) pa_bytes_to_usec(u->fragment_size, &ss) / PA_USEC_PER_MSEC, + (long unsigned) u->hwbuf_size, + (double) pa_bytes_to_usec(u->hwbuf_size, &ss) / PA_USEC_PER_MSEC); + + pa_sink_set_max_request(u->sink, u->hwbuf_size); + if (pa_alsa_pcm_is_hw(u->pcm_handle)) + pa_sink_set_max_rewind(u->sink, u->hwbuf_size); + else { + pa_log_info("Disabling rewind for device %s", u->device_name); + pa_sink_set_max_rewind(u->sink, 0); + } + + if (u->use_tsched) { + u->tsched_watermark_ref = tsched_watermark; + reset_watermark(u, u->tsched_watermark_ref, &ss, false); + } else + pa_sink_set_fixed_latency(u->sink, pa_bytes_to_usec(u->hwbuf_size, &ss)); + + reserve_update(u); + + if (update_sw_params(u, false) < 0) + goto fail; + + if (setup_mixer(u, ignore_dB) < 0) + goto fail; + + pa_alsa_dump(PA_LOG_DEBUG, u->pcm_handle); + + thread_name = pa_sprintf_malloc("alsa-sink-%s", pa_strnull(pa_proplist_gets(u->sink->proplist, "alsa.id"))); + if (!(u->thread = pa_thread_new(thread_name, thread_func, u))) { + pa_log("Failed to create thread."); + goto fail; + } + pa_xfree(thread_name); + thread_name = NULL; + + /* Get initial mixer settings */ + if (volume_is_set) { + if (u->sink->set_volume) + u->sink->set_volume(u->sink); + } else { + if (u->sink->get_volume) + u->sink->get_volume(u->sink); + } + + if (mute_is_set) { + if (u->sink->set_mute) + u->sink->set_mute(u->sink); + } else { + if (u->sink->get_mute) { + bool mute; + + if (u->sink->get_mute(u->sink, &mute) >= 0) + pa_sink_set_mute(u->sink, mute, false); + } + } + + if ((volume_is_set || mute_is_set) && u->sink->write_volume) + u->sink->write_volume(u->sink); + + if (set_formats) { + /* For S/PDIF and HDMI, allow getting/setting custom formats */ + pa_format_info *format; + + /* To start with, we only support PCM formats. Other formats may be added + * with pa_sink_set_formats().*/ + format = pa_format_info_new(); + format->encoding = PA_ENCODING_PCM; + u->formats = pa_idxset_new(NULL, NULL); + pa_idxset_put(u->formats, format, NULL); + + u->sink->get_formats = sink_get_formats; + u->sink->set_formats = sink_set_formats; + } + + pa_sink_put(u->sink); + + if (profile_set) + pa_alsa_profile_set_free(profile_set); + + /* Suspend if necessary. FIXME: It would be better to start suspended, but + * that would require some core changes. It's possible to set + * pa_sink_new_data.suspend_cause, but that has to be done before the + * pa_sink_new() call, and we know if we need to suspend only after the + * pa_sink_new() call when the initial port has been chosen. Calling + * pa_sink_suspend() between pa_sink_new() and pa_sink_put() would + * otherwise work, but currently pa_sink_suspend() will crash if + * pa_sink_put() hasn't been called. */ + if (u->sink->active_port && !u->ucm_context) { + pa_alsa_port_data *port_data; + + port_data = PA_DEVICE_PORT_DATA(u->sink->active_port); + + if (port_data->suspend_when_unavailable && u->sink->active_port->available == PA_AVAILABLE_NO) + pa_sink_suspend(u->sink, true, PA_SUSPEND_UNAVAILABLE); + } + + return u->sink; + +fail: + pa_xfree(thread_name); + + if (u) + userdata_free(u); + + if (profile_set) + pa_alsa_profile_set_free(profile_set); + + return NULL; +} + +static void userdata_free(struct userdata *u) { + pa_assert(u); + + if (u->sink) + pa_sink_unlink(u->sink); + + if (u->thread) { + pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL); + pa_thread_free(u->thread); + } + + pa_thread_mq_done(&u->thread_mq); + + if (u->sink) + pa_sink_unref(u->sink); + + if (u->memchunk.memblock) + pa_memblock_unref(u->memchunk.memblock); + + if (u->mixer_pd) + pa_alsa_mixer_pdata_free(u->mixer_pd); + + if (u->alsa_rtpoll_item) + pa_rtpoll_item_free(u->alsa_rtpoll_item); + + if (u->rtpoll) + pa_rtpoll_free(u->rtpoll); + + if (u->pcm_handle) { + snd_pcm_drop(u->pcm_handle); + snd_pcm_close(u->pcm_handle); + } + + if (u->mixer_fdl) + pa_alsa_fdlist_free(u->mixer_fdl); + + /* Only free the mixer_path if the sink owns it */ + if (u->mixer_path && !u->mixer_path_set && !u->ucm_context) + pa_alsa_path_free(u->mixer_path); + + if (u->mixers) + pa_hashmap_free(u->mixers); + + if (u->smoother) + pa_smoother_free(u->smoother); + + if (u->formats) + pa_idxset_free(u->formats, (pa_free_cb_t) pa_format_info_free); + + if (u->supported_formats) + pa_xfree(u->supported_formats); + + if (u->supported_rates) + pa_xfree(u->supported_rates); + + reserve_done(u); + monitor_done(u); + + pa_xfree(u->device_name); + pa_xfree(u->control_device); + pa_xfree(u->paths_dir); + pa_xfree(u); +} + +void pa_alsa_sink_free(pa_sink *s) { + struct userdata *u; + + pa_sink_assert_ref(s); + pa_assert_se(u = s->userdata); + + userdata_free(u); +} diff --git a/src/modules/alsa/alsa-sink.h b/src/modules/alsa/alsa-sink.h new file mode 100644 index 0000000..78a2cb2 --- /dev/null +++ b/src/modules/alsa/alsa-sink.h @@ -0,0 +1,34 @@ +#ifndef fooalsasinkhfoo +#define fooalsasinkhfoo + +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#include +#include +#include + +#include "alsa-util.h" + +pa_sink* pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_card *card, pa_alsa_mapping *mapping); + +void pa_alsa_sink_free(pa_sink *s); + +#endif diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c new file mode 100644 index 0000000..76370f8 --- /dev/null +++ b/src/modules/alsa/alsa-source.c @@ -0,0 +1,2473 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2008 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "alsa-util.h" +#include "alsa-source.h" + +/* #define DEBUG_TIMING */ + +#define DEFAULT_DEVICE "default" + +#define DEFAULT_TSCHED_BUFFER_USEC (2*PA_USEC_PER_SEC) /* 2s */ +#define DEFAULT_TSCHED_WATERMARK_USEC (20*PA_USEC_PER_MSEC) /* 20ms */ + +#define TSCHED_WATERMARK_INC_STEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms */ +#define TSCHED_WATERMARK_DEC_STEP_USEC (5*PA_USEC_PER_MSEC) /* 5ms */ +#define TSCHED_WATERMARK_VERIFY_AFTER_USEC (20*PA_USEC_PER_SEC) /* 20s */ +#define TSCHED_WATERMARK_INC_THRESHOLD_USEC (0*PA_USEC_PER_MSEC) /* 0ms */ +#define TSCHED_WATERMARK_DEC_THRESHOLD_USEC (100*PA_USEC_PER_MSEC) /* 100ms */ +#define TSCHED_WATERMARK_STEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms */ + +#define TSCHED_MIN_SLEEP_USEC (10*PA_USEC_PER_MSEC) /* 10ms */ +#define TSCHED_MIN_WAKEUP_USEC (4*PA_USEC_PER_MSEC) /* 4ms */ + +#define SMOOTHER_WINDOW_USEC (10*PA_USEC_PER_SEC) /* 10s */ +#define SMOOTHER_ADJUST_USEC (1*PA_USEC_PER_SEC) /* 1s */ + +#define SMOOTHER_MIN_INTERVAL (2*PA_USEC_PER_MSEC) /* 2ms */ +#define SMOOTHER_MAX_INTERVAL (200*PA_USEC_PER_MSEC) /* 200ms */ + +#define VOLUME_ACCURACY (PA_VOLUME_NORM/100) + +struct userdata { + pa_core *core; + pa_module *module; + pa_source *source; + + pa_thread *thread; + pa_thread_mq thread_mq; + pa_rtpoll *rtpoll; + + snd_pcm_t *pcm_handle; + + char *paths_dir; + pa_alsa_fdlist *mixer_fdl; + pa_alsa_mixer_pdata *mixer_pd; + pa_hashmap *mixers; + snd_mixer_t *mixer_handle; + pa_alsa_path_set *mixer_path_set; + pa_alsa_path *mixer_path; + + pa_cvolume hardware_volume; + + pa_sample_spec verified_sample_spec; + pa_sample_format_t *supported_formats; + unsigned int *supported_rates; + struct { + size_t fragment_size; + size_t nfrags; + size_t tsched_size; + size_t tsched_watermark; + } initial_info; + + size_t + frame_size, + fragment_size, + hwbuf_size, + tsched_size, + tsched_watermark, + tsched_watermark_ref, + hwbuf_unused, + min_sleep, + min_wakeup, + watermark_inc_step, + watermark_dec_step, + watermark_inc_threshold, + watermark_dec_threshold; + + snd_pcm_uframes_t frames_per_block; + + pa_usec_t watermark_dec_not_before; + pa_usec_t min_latency_ref; + pa_usec_t tsched_watermark_usec; + + char *device_name; /* name of the PCM device */ + char *control_device; /* name of the control device */ + + bool use_mmap:1, use_tsched:1, deferred_volume:1, fixed_latency_range:1; + + bool first; + + pa_rtpoll_item *alsa_rtpoll_item; + + pa_smoother *smoother; + uint64_t read_count; + pa_usec_t smoother_interval; + pa_usec_t last_smoother_update; + + pa_reserve_wrapper *reserve; + pa_hook_slot *reserve_slot; + pa_reserve_monitor_wrapper *monitor; + pa_hook_slot *monitor_slot; + + /* ucm context */ + pa_alsa_ucm_mapping_context *ucm_context; +}; + +enum { + SOURCE_MESSAGE_SYNC_MIXER = PA_SOURCE_MESSAGE_MAX +}; + +static void userdata_free(struct userdata *u); +static int unsuspend(struct userdata *u, bool recovering); + +static pa_hook_result_t reserve_cb(pa_reserve_wrapper *r, void *forced, struct userdata *u) { + pa_assert(r); + pa_assert(u); + + pa_log_debug("Suspending source %s, because another application requested us to release the device.", u->source->name); + + if (pa_source_suspend(u->source, true, PA_SUSPEND_APPLICATION) < 0) + return PA_HOOK_CANCEL; + + return PA_HOOK_OK; +} + +static void reserve_done(struct userdata *u) { + pa_assert(u); + + if (u->reserve_slot) { + pa_hook_slot_free(u->reserve_slot); + u->reserve_slot = NULL; + } + + if (u->reserve) { + pa_reserve_wrapper_unref(u->reserve); + u->reserve = NULL; + } +} + +static void reserve_update(struct userdata *u) { + const char *description; + pa_assert(u); + + if (!u->source || !u->reserve) + return; + + if ((description = pa_proplist_gets(u->source->proplist, PA_PROP_DEVICE_DESCRIPTION))) + pa_reserve_wrapper_set_application_device_name(u->reserve, description); +} + +static int reserve_init(struct userdata *u, const char *dname) { + char *rname; + + pa_assert(u); + pa_assert(dname); + + if (u->reserve) + return 0; + + if (pa_in_system_mode()) + return 0; + + if (!(rname = pa_alsa_get_reserve_name(dname))) + return 0; + + /* We are resuming, try to lock the device */ + u->reserve = pa_reserve_wrapper_get(u->core, rname); + pa_xfree(rname); + + if (!(u->reserve)) + return -1; + + reserve_update(u); + + pa_assert(!u->reserve_slot); + u->reserve_slot = pa_hook_connect(pa_reserve_wrapper_hook(u->reserve), PA_HOOK_NORMAL, (pa_hook_cb_t) reserve_cb, u); + + return 0; +} + +static pa_hook_result_t monitor_cb(pa_reserve_monitor_wrapper *w, void* busy, struct userdata *u) { + pa_assert(w); + pa_assert(u); + + if (PA_PTR_TO_UINT(busy) && !u->reserve) { + pa_log_debug("Suspending source %s, because another application is blocking the access to the device.", u->source->name); + pa_source_suspend(u->source, true, PA_SUSPEND_APPLICATION); + } else { + pa_log_debug("Resuming source %s, because other applications aren't blocking access to the device any more.", u->source->name); + pa_source_suspend(u->source, false, PA_SUSPEND_APPLICATION); + } + + return PA_HOOK_OK; +} + +static void monitor_done(struct userdata *u) { + pa_assert(u); + + if (u->monitor_slot) { + pa_hook_slot_free(u->monitor_slot); + u->monitor_slot = NULL; + } + + if (u->monitor) { + pa_reserve_monitor_wrapper_unref(u->monitor); + u->monitor = NULL; + } +} + +static int reserve_monitor_init(struct userdata *u, const char *dname) { + char *rname; + + pa_assert(u); + pa_assert(dname); + + if (pa_in_system_mode()) + return 0; + + if (!(rname = pa_alsa_get_reserve_name(dname))) + return 0; + + /* We are resuming, try to lock the device */ + u->monitor = pa_reserve_monitor_wrapper_get(u->core, rname); + pa_xfree(rname); + + if (!(u->monitor)) + return -1; + + pa_assert(!u->monitor_slot); + u->monitor_slot = pa_hook_connect(pa_reserve_monitor_wrapper_hook(u->monitor), PA_HOOK_NORMAL, (pa_hook_cb_t) monitor_cb, u); + + return 0; +} + +static void fix_min_sleep_wakeup(struct userdata *u) { + size_t max_use, max_use_2; + + pa_assert(u); + pa_assert(u->use_tsched); + + max_use = u->hwbuf_size - u->hwbuf_unused; + max_use_2 = pa_frame_align(max_use/2, &u->source->sample_spec); + + u->min_sleep = pa_usec_to_bytes(TSCHED_MIN_SLEEP_USEC, &u->source->sample_spec); + u->min_sleep = PA_CLAMP(u->min_sleep, u->frame_size, max_use_2); + + u->min_wakeup = pa_usec_to_bytes(TSCHED_MIN_WAKEUP_USEC, &u->source->sample_spec); + u->min_wakeup = PA_CLAMP(u->min_wakeup, u->frame_size, max_use_2); +} + +static void fix_tsched_watermark(struct userdata *u) { + size_t max_use; + pa_assert(u); + pa_assert(u->use_tsched); + + max_use = u->hwbuf_size - u->hwbuf_unused; + + if (u->tsched_watermark > max_use - u->min_sleep) + u->tsched_watermark = max_use - u->min_sleep; + + if (u->tsched_watermark < u->min_wakeup) + u->tsched_watermark = u->min_wakeup; + + u->tsched_watermark_usec = pa_bytes_to_usec(u->tsched_watermark, &u->source->sample_spec); +} + +static void increase_watermark(struct userdata *u) { + size_t old_watermark; + pa_usec_t old_min_latency, new_min_latency; + + pa_assert(u); + pa_assert(u->use_tsched); + + /* First, just try to increase the watermark */ + old_watermark = u->tsched_watermark; + u->tsched_watermark = PA_MIN(u->tsched_watermark * 2, u->tsched_watermark + u->watermark_inc_step); + fix_tsched_watermark(u); + + if (old_watermark != u->tsched_watermark) { + pa_log_info("Increasing wakeup watermark to %0.2f ms", + (double) u->tsched_watermark_usec / PA_USEC_PER_MSEC); + return; + } + + /* Hmm, we cannot increase the watermark any further, hence let's + raise the latency unless doing so was disabled in + configuration */ + if (u->fixed_latency_range) + return; + + old_min_latency = u->source->thread_info.min_latency; + new_min_latency = PA_MIN(old_min_latency * 2, old_min_latency + TSCHED_WATERMARK_INC_STEP_USEC); + new_min_latency = PA_MIN(new_min_latency, u->source->thread_info.max_latency); + + if (old_min_latency != new_min_latency) { + pa_log_info("Increasing minimal latency to %0.2f ms", + (double) new_min_latency / PA_USEC_PER_MSEC); + + pa_source_set_latency_range_within_thread(u->source, new_min_latency, u->source->thread_info.max_latency); + } + + /* When we reach this we're officially fucked! */ +} + +static void decrease_watermark(struct userdata *u) { + size_t old_watermark; + pa_usec_t now; + + pa_assert(u); + pa_assert(u->use_tsched); + + now = pa_rtclock_now(); + + if (u->watermark_dec_not_before <= 0) + goto restart; + + if (u->watermark_dec_not_before > now) + return; + + old_watermark = u->tsched_watermark; + + if (u->tsched_watermark < u->watermark_dec_step) + u->tsched_watermark = u->tsched_watermark / 2; + else + u->tsched_watermark = PA_MAX(u->tsched_watermark / 2, u->tsched_watermark - u->watermark_dec_step); + + fix_tsched_watermark(u); + + if (old_watermark != u->tsched_watermark) + pa_log_info("Decreasing wakeup watermark to %0.2f ms", + (double) u->tsched_watermark_usec / PA_USEC_PER_MSEC); + + /* We don't change the latency range*/ + +restart: + u->watermark_dec_not_before = now + TSCHED_WATERMARK_VERIFY_AFTER_USEC; +} + +/* Called from IO Context on unsuspend or from main thread when creating source */ +static void reset_watermark(struct userdata *u, size_t tsched_watermark, pa_sample_spec *ss, + bool in_thread) { + u->tsched_watermark = pa_convert_size(tsched_watermark, ss, &u->source->sample_spec); + + u->watermark_inc_step = pa_usec_to_bytes(TSCHED_WATERMARK_INC_STEP_USEC, &u->source->sample_spec); + u->watermark_dec_step = pa_usec_to_bytes(TSCHED_WATERMARK_DEC_STEP_USEC, &u->source->sample_spec); + + u->watermark_inc_threshold = pa_usec_to_bytes_round_up(TSCHED_WATERMARK_INC_THRESHOLD_USEC, &u->source->sample_spec); + u->watermark_dec_threshold = pa_usec_to_bytes_round_up(TSCHED_WATERMARK_DEC_THRESHOLD_USEC, &u->source->sample_spec); + + fix_min_sleep_wakeup(u); + fix_tsched_watermark(u); + + if (in_thread) + pa_source_set_latency_range_within_thread(u->source, + u->min_latency_ref, + pa_bytes_to_usec(u->hwbuf_size, ss)); + else { + pa_source_set_latency_range(u->source, + 0, + pa_bytes_to_usec(u->hwbuf_size, ss)); + + /* work-around assert in pa_source_set_latency_within_thead, + keep track of min_latency and reuse it when + this routine is called from IO context */ + u->min_latency_ref = u->source->thread_info.min_latency; + } + + pa_log_info("Time scheduling watermark is %0.2fms", + (double) u->tsched_watermark_usec / PA_USEC_PER_MSEC); +} + +static void hw_sleep_time(struct userdata *u, pa_usec_t *sleep_usec, pa_usec_t*process_usec) { + pa_usec_t wm, usec; + + pa_assert(sleep_usec); + pa_assert(process_usec); + + pa_assert(u); + pa_assert(u->use_tsched); + + usec = pa_source_get_requested_latency_within_thread(u->source); + + if (usec == (pa_usec_t) -1) + usec = pa_bytes_to_usec(u->hwbuf_size, &u->source->sample_spec); + + wm = u->tsched_watermark_usec; + + if (wm > usec) + wm = usec/2; + + *sleep_usec = usec - wm; + *process_usec = wm; + +#ifdef DEBUG_TIMING + pa_log_debug("Buffer time: %lu ms; Sleep time: %lu ms; Process time: %lu ms", + (unsigned long) (usec / PA_USEC_PER_MSEC), + (unsigned long) (*sleep_usec / PA_USEC_PER_MSEC), + (unsigned long) (*process_usec / PA_USEC_PER_MSEC)); +#endif +} + +/* Reset smoother and counters */ +static void reset_vars(struct userdata *u) { + + pa_smoother_reset(u->smoother, pa_rtclock_now(), true); + u->smoother_interval = SMOOTHER_MIN_INTERVAL; + u->last_smoother_update = 0; + + u->read_count = 0; + u->first = true; +} + +/* Called from IO context */ +static void close_pcm(struct userdata *u) { + pa_smoother_pause(u->smoother, pa_rtclock_now()); + + /* Let's suspend */ + snd_pcm_close(u->pcm_handle); + u->pcm_handle = NULL; + + if (u->alsa_rtpoll_item) { + pa_rtpoll_item_free(u->alsa_rtpoll_item); + u->alsa_rtpoll_item = NULL; + } +} + +static int try_recover(struct userdata *u, const char *call, int err) { + pa_assert(u); + pa_assert(call); + pa_assert(err < 0); + + pa_log_debug("%s: %s", call, pa_alsa_strerror(err)); + + pa_assert(err != -EAGAIN); + + if (err == -EPIPE) + pa_log_debug("%s: Buffer overrun!", call); + + if (err == -ESTRPIPE) + pa_log_debug("%s: System suspended!", call); + + if ((err = snd_pcm_recover(u->pcm_handle, err, 1)) < 0) { + pa_log("%s: %s, trying to restart PCM", call, pa_alsa_strerror(err)); + + /* As a last measure, restart the PCM and inform the caller about it. */ + close_pcm(u); + if (unsuspend(u, true) < 0) + return -1; + + return 1; + } + + reset_vars(u); + return 0; +} + +static size_t check_left_to_record(struct userdata *u, size_t n_bytes, bool on_timeout) { + size_t left_to_record; + size_t rec_space = u->hwbuf_size - u->hwbuf_unused; + bool overrun = false; + + /* We use <= instead of < for this check here because an overrun + * only happens after the last sample was processed, not already when + * it is removed from the buffer. This is particularly important + * when block transfer is used. */ + + if (n_bytes <= rec_space) + left_to_record = rec_space - n_bytes; + else { + + /* We got a dropout. What a mess! */ + left_to_record = 0; + overrun = true; + +#ifdef DEBUG_TIMING + PA_DEBUG_TRAP; +#endif + + if (pa_log_ratelimit(PA_LOG_INFO)) + pa_log_info("Overrun!"); + } + +#ifdef DEBUG_TIMING + pa_log_debug("%0.2f ms left to record", (double) pa_bytes_to_usec(left_to_record, &u->source->sample_spec) / PA_USEC_PER_MSEC); +#endif + + if (u->use_tsched) { + bool reset_not_before = true; + + if (overrun || left_to_record < u->watermark_inc_threshold) + increase_watermark(u); + else if (left_to_record > u->watermark_dec_threshold) { + reset_not_before = false; + + /* We decrease the watermark only if have actually + * been woken up by a timeout. If something else woke + * us up it's too easy to fulfill the deadlines... */ + + if (on_timeout) + decrease_watermark(u); + } + + if (reset_not_before) + u->watermark_dec_not_before = 0; + } + + return left_to_record; +} + +static int mmap_read(struct userdata *u, pa_usec_t *sleep_usec, bool polled, bool on_timeout) { + bool work_done = false; + bool recovery_done = false; + pa_usec_t max_sleep_usec = 0, process_usec = 0; + size_t left_to_record; + unsigned j = 0; + + pa_assert(u); + pa_source_assert_ref(u->source); + + if (u->use_tsched) + hw_sleep_time(u, &max_sleep_usec, &process_usec); + + for (;;) { + snd_pcm_sframes_t n; + size_t n_bytes; + int r; + bool after_avail = true; + + if (PA_UNLIKELY((n = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->source->sample_spec)) < 0)) { + + recovery_done = true; + if ((r = try_recover(u, "snd_pcm_avail", (int) n)) >= 0) + continue; + + return r; + } + + n_bytes = (size_t) n * u->frame_size; + +#ifdef DEBUG_TIMING + pa_log_debug("avail: %lu", (unsigned long) n_bytes); +#endif + + left_to_record = check_left_to_record(u, n_bytes, on_timeout); + on_timeout = false; + + if (u->use_tsched) + if (!polled && + pa_bytes_to_usec(left_to_record, &u->source->sample_spec) > process_usec+max_sleep_usec/2) { +#ifdef DEBUG_TIMING + pa_log_debug("Not reading, because too early."); +#endif + break; + } + + if (PA_UNLIKELY(n_bytes <= 0)) { + + if (polled) + PA_ONCE_BEGIN { + char *dn = pa_alsa_get_driver_name_by_pcm(u->pcm_handle); + pa_log(_("ALSA woke us up to read new data from the device, but there was actually nothing to read.\n" + "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n" + "We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."), + pa_strnull(dn)); + pa_xfree(dn); + } PA_ONCE_END; + +#ifdef DEBUG_TIMING + pa_log_debug("Not reading, because not necessary."); +#endif + break; + } + + if (++j > 10) { +#ifdef DEBUG_TIMING + pa_log_debug("Not filling up, because already too many iterations."); +#endif + + break; + } + + polled = false; + +#ifdef DEBUG_TIMING + pa_log_debug("Reading"); +#endif + + for (;;) { + pa_memchunk chunk; + void *p; + int err; + const snd_pcm_channel_area_t *areas; + snd_pcm_uframes_t offset, frames; + snd_pcm_sframes_t sframes; + + frames = (snd_pcm_uframes_t) (n_bytes / u->frame_size); +/* pa_log_debug("%lu frames to read", (unsigned long) frames); */ + + if (PA_UNLIKELY((err = pa_alsa_safe_mmap_begin(u->pcm_handle, &areas, &offset, &frames, u->hwbuf_size, &u->source->sample_spec)) < 0)) { + + if (!after_avail && err == -EAGAIN) + break; + + recovery_done = true; + if ((r = try_recover(u, "snd_pcm_mmap_begin", err)) == 0) + continue; + + if (r == 1) + break; + + return r; + } + + /* Make sure that if these memblocks need to be copied they will fit into one slot */ + frames = PA_MIN(frames, u->frames_per_block); + + if (!after_avail && frames == 0) + break; + + pa_assert(frames > 0); + after_avail = false; + + /* Check these are multiples of 8 bit */ + pa_assert((areas[0].first & 7) == 0); + pa_assert((areas[0].step & 7) == 0); + + /* We assume a single interleaved memory buffer */ + pa_assert((areas[0].first >> 3) == 0); + pa_assert((areas[0].step >> 3) == u->frame_size); + + p = (uint8_t*) areas[0].addr + (offset * u->frame_size); + + chunk.memblock = pa_memblock_new_fixed(u->core->mempool, p, frames * u->frame_size, true); + chunk.length = pa_memblock_get_length(chunk.memblock); + chunk.index = 0; + + pa_source_post(u->source, &chunk); + pa_memblock_unref_fixed(chunk.memblock); + + if (PA_UNLIKELY((sframes = snd_pcm_mmap_commit(u->pcm_handle, offset, frames)) < 0)) { + + recovery_done = true; + if ((r = try_recover(u, "snd_pcm_mmap_commit", (int) sframes)) == 0) + continue; + + if (r == 1) + break; + + return r; + } + + work_done = true; + + u->read_count += frames * u->frame_size; + +#ifdef DEBUG_TIMING + pa_log_debug("Read %lu bytes (of possible %lu bytes)", (unsigned long) (frames * u->frame_size), (unsigned long) n_bytes); +#endif + + if ((size_t) frames * u->frame_size >= n_bytes) + break; + + n_bytes -= (size_t) frames * u->frame_size; + } + } + + if (u->use_tsched) { + *sleep_usec = pa_bytes_to_usec(left_to_record, &u->source->sample_spec); + process_usec = u->tsched_watermark_usec; + + if (*sleep_usec > process_usec) + *sleep_usec -= process_usec; + else + *sleep_usec = 0; + + /* If the PCM was recovered, it may need restarting. Reduce the sleep time + * to 0 to ensure immediate restart. */ + if (recovery_done) + *sleep_usec = 0; + } + + return work_done ? 1 : 0; +} + +static int unix_read(struct userdata *u, pa_usec_t *sleep_usec, bool polled, bool on_timeout) { + int work_done = false; + bool recovery_done = false; + pa_usec_t max_sleep_usec = 0, process_usec = 0; + size_t left_to_record; + unsigned j = 0; + + pa_assert(u); + pa_source_assert_ref(u->source); + + if (u->use_tsched) + hw_sleep_time(u, &max_sleep_usec, &process_usec); + + for (;;) { + snd_pcm_sframes_t n; + size_t n_bytes; + int r; + bool after_avail = true; + + if (PA_UNLIKELY((n = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->source->sample_spec)) < 0)) { + + recovery_done = true; + if ((r = try_recover(u, "snd_pcm_avail", (int) n)) >= 0) + continue; + + return r; + } + + n_bytes = (size_t) n * u->frame_size; + left_to_record = check_left_to_record(u, n_bytes, on_timeout); + on_timeout = false; + + if (u->use_tsched) + if (!polled && + pa_bytes_to_usec(left_to_record, &u->source->sample_spec) > process_usec+max_sleep_usec/2) + break; + + if (PA_UNLIKELY(n_bytes <= 0)) { + + if (polled) + PA_ONCE_BEGIN { + char *dn = pa_alsa_get_driver_name_by_pcm(u->pcm_handle); + pa_log(_("ALSA woke us up to read new data from the device, but there was actually nothing to read.\n" + "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n" + "We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."), + pa_strnull(dn)); + pa_xfree(dn); + } PA_ONCE_END; + + break; + } + + if (++j > 10) { +#ifdef DEBUG_TIMING + pa_log_debug("Not filling up, because already too many iterations."); +#endif + + break; + } + + polled = false; + + for (;;) { + void *p; + snd_pcm_sframes_t frames; + pa_memchunk chunk; + + chunk.memblock = pa_memblock_new(u->core->mempool, (size_t) -1); + + frames = (snd_pcm_sframes_t) (pa_memblock_get_length(chunk.memblock) / u->frame_size); + + if (frames > (snd_pcm_sframes_t) (n_bytes/u->frame_size)) + frames = (snd_pcm_sframes_t) (n_bytes/u->frame_size); + +/* pa_log_debug("%lu frames to read", (unsigned long) n); */ + + p = pa_memblock_acquire(chunk.memblock); + frames = snd_pcm_readi(u->pcm_handle, (uint8_t*) p, (snd_pcm_uframes_t) frames); + pa_memblock_release(chunk.memblock); + + if (PA_UNLIKELY(frames < 0)) { + pa_memblock_unref(chunk.memblock); + + if (!after_avail && (int) frames == -EAGAIN) + break; + + recovery_done = true; + if ((r = try_recover(u, "snd_pcm_readi", (int) frames)) == 0) + continue; + + if (r == 1) + break; + + return r; + } + + if (!after_avail && frames == 0) { + pa_memblock_unref(chunk.memblock); + break; + } + + pa_assert(frames > 0); + after_avail = false; + + chunk.index = 0; + chunk.length = (size_t) frames * u->frame_size; + + pa_source_post(u->source, &chunk); + pa_memblock_unref(chunk.memblock); + + work_done = true; + + u->read_count += frames * u->frame_size; + +/* pa_log_debug("read %lu frames", (unsigned long) frames); */ + + if ((size_t) frames * u->frame_size >= n_bytes) + break; + + n_bytes -= (size_t) frames * u->frame_size; + } + } + + if (u->use_tsched) { + *sleep_usec = pa_bytes_to_usec(left_to_record, &u->source->sample_spec); + process_usec = u->tsched_watermark_usec; + + if (*sleep_usec > process_usec) + *sleep_usec -= process_usec; + else + *sleep_usec = 0; + + /* If the PCM was recovered, it may need restarting. Reduce the sleep time + * to 0 to ensure immediate restart. */ + if (recovery_done) + *sleep_usec = 0; + } + + return work_done ? 1 : 0; +} + +static void update_smoother(struct userdata *u) { + snd_pcm_sframes_t delay = 0; + uint64_t position; + int err; + pa_usec_t now1 = 0, now2; + snd_pcm_status_t *status; + snd_htimestamp_t htstamp = { 0, 0 }; + + snd_pcm_status_alloca(&status); + + pa_assert(u); + pa_assert(u->pcm_handle); + + /* Let's update the time smoother */ + + if (PA_UNLIKELY((err = pa_alsa_safe_delay(u->pcm_handle, status, &delay, u->hwbuf_size, &u->source->sample_spec, true)) < 0)) { + pa_log_warn("Failed to get delay: %s", pa_alsa_strerror(err)); + return; + } + + snd_pcm_status_get_htstamp(status, &htstamp); + now1 = pa_timespec_load(&htstamp); + + /* Hmm, if the timestamp is 0, then it wasn't set and we take the current time */ + if (now1 <= 0) + now1 = pa_rtclock_now(); + + /* check if the time since the last update is bigger than the interval */ + if (u->last_smoother_update > 0) + if (u->last_smoother_update + u->smoother_interval > now1) + return; + + position = u->read_count + ((uint64_t) delay * (uint64_t) u->frame_size); + now2 = pa_bytes_to_usec(position, &u->source->sample_spec); + + pa_smoother_put(u->smoother, now1, now2); + + u->last_smoother_update = now1; + /* exponentially increase the update interval up to the MAX limit */ + u->smoother_interval = PA_MIN (u->smoother_interval * 2, SMOOTHER_MAX_INTERVAL); +} + +static int64_t source_get_latency(struct userdata *u) { + int64_t delay; + pa_usec_t now1, now2; + + pa_assert(u); + + now1 = pa_rtclock_now(); + now2 = pa_smoother_get(u->smoother, now1); + + delay = (int64_t) now2 - (int64_t) pa_bytes_to_usec(u->read_count, &u->source->sample_spec); + + return delay; +} + +static int build_pollfd(struct userdata *u) { + pa_assert(u); + pa_assert(u->pcm_handle); + + if (u->alsa_rtpoll_item) + pa_rtpoll_item_free(u->alsa_rtpoll_item); + + if (!(u->alsa_rtpoll_item = pa_alsa_build_pollfd(u->pcm_handle, u->rtpoll))) + return -1; + + return 0; +} + +/* Called from IO context */ +static void suspend(struct userdata *u) { + pa_assert(u); + + /* PCM may have been invalidated due to device failure. + * In that case, there is nothing to do. */ + if (!u->pcm_handle) + return; + + /* Close PCM device */ + close_pcm(u); + + pa_log_info("Device suspended..."); +} + +/* Called from IO context */ +static int update_sw_params(struct userdata *u) { + snd_pcm_uframes_t avail_min; + int err; + + pa_assert(u); + + /* Use the full buffer if no one asked us for anything specific */ + u->hwbuf_unused = 0; + + if (u->use_tsched) { + pa_usec_t latency; + + if ((latency = pa_source_get_requested_latency_within_thread(u->source)) != (pa_usec_t) -1) { + size_t b; + + pa_log_debug("latency set to %0.2fms", (double) latency / PA_USEC_PER_MSEC); + + b = pa_usec_to_bytes(latency, &u->source->sample_spec); + + /* We need at least one sample in our buffer */ + + if (PA_UNLIKELY(b < u->frame_size)) + b = u->frame_size; + + u->hwbuf_unused = PA_LIKELY(b < u->hwbuf_size) ? (u->hwbuf_size - b) : 0; + } + + fix_min_sleep_wakeup(u); + fix_tsched_watermark(u); + } + + pa_log_debug("hwbuf_unused=%lu", (unsigned long) u->hwbuf_unused); + + avail_min = 1; + + if (u->use_tsched) { + pa_usec_t sleep_usec, process_usec; + + hw_sleep_time(u, &sleep_usec, &process_usec); + avail_min += pa_usec_to_bytes(sleep_usec, &u->source->sample_spec) / u->frame_size; + } + + pa_log_debug("setting avail_min=%lu", (unsigned long) avail_min); + + if ((err = pa_alsa_set_sw_params(u->pcm_handle, avail_min, !u->use_tsched)) < 0) { + pa_log("Failed to set software parameters: %s", pa_alsa_strerror(err)); + return err; + } + + return 0; +} + +/* Called from IO Context on unsuspend */ +static void update_size(struct userdata *u, pa_sample_spec *ss) { + pa_assert(u); + pa_assert(ss); + + u->frame_size = pa_frame_size(ss); + u->frames_per_block = pa_mempool_block_size_max(u->core->mempool) / u->frame_size; + + /* use initial values including module arguments */ + u->fragment_size = u->initial_info.fragment_size; + u->hwbuf_size = u->initial_info.nfrags * u->fragment_size; + u->tsched_size = u->initial_info.tsched_size; + u->tsched_watermark = u->initial_info.tsched_watermark; + + u->tsched_watermark_ref = u->tsched_watermark; + + pa_log_info("Updated frame_size %zu, frames_per_block %lu, fragment_size %zu, hwbuf_size %zu, tsched(size %zu, watermark %zu)", + u->frame_size, (unsigned long) u->frames_per_block, u->fragment_size, u->hwbuf_size, u->tsched_size, u->tsched_watermark); +} + +/* Called from IO context */ +static int unsuspend(struct userdata *u, bool recovering) { + pa_sample_spec ss; + int err, i; + bool b, d; + snd_pcm_uframes_t period_frames, buffer_frames; + snd_pcm_uframes_t tsched_frames = 0; + bool frame_size_changed = false; + + pa_assert(u); + pa_assert(!u->pcm_handle); + + pa_log_info("Trying resume..."); + + /* + * On some machines, during the system suspend and resume, the thread_func could receive + * POLLERR events before the dev nodes in /dev/snd/ are accessible, and thread_func calls + * the unsuspend() to try to recover the PCM, this will make the snd_pcm_open() fail, here + * we add msleep and retry to make sure those nodes are accessible. + */ + for (i = 0; i < 4; i++) { + if ((err = snd_pcm_open(&u->pcm_handle, u->device_name, SND_PCM_STREAM_CAPTURE, + SND_PCM_NONBLOCK| + SND_PCM_NO_AUTO_RESAMPLE| + SND_PCM_NO_AUTO_CHANNELS| + SND_PCM_NO_AUTO_FORMAT)) < 0 && recovering) + pa_msleep(25); + else + break; + } + + if (err < 0) { + pa_log("Error opening PCM device %s: %s", u->device_name, pa_alsa_strerror(err)); + goto fail; + } + + if (pa_frame_size(&u->source->sample_spec) != u->frame_size) { + update_size(u, &u->source->sample_spec); + tsched_frames = u->tsched_size / u->frame_size; + frame_size_changed = true; + } + + ss = u->source->sample_spec; + period_frames = u->fragment_size / u->frame_size; + buffer_frames = u->hwbuf_size / u->frame_size; + b = u->use_mmap; + d = u->use_tsched; + + if ((err = pa_alsa_set_hw_params(u->pcm_handle, &ss, &period_frames, &buffer_frames, tsched_frames, &b, &d, true)) < 0) { + pa_log("Failed to set hardware parameters: %s", pa_alsa_strerror(err)); + goto fail; + } + + if (b != u->use_mmap || d != u->use_tsched) { + pa_log_warn("Resume failed, couldn't get original access mode."); + goto fail; + } + + if (!pa_sample_spec_equal(&ss, &u->source->sample_spec)) { + pa_log_warn("Resume failed, couldn't restore original sample settings."); + goto fail; + } + + if (frame_size_changed) { + u->fragment_size = (size_t)(period_frames * u->frame_size); + u->hwbuf_size = (size_t)(buffer_frames * u->frame_size); + pa_proplist_setf(u->source->proplist, PA_PROP_DEVICE_BUFFERING_BUFFER_SIZE, "%zu", u->hwbuf_size); + pa_proplist_setf(u->source->proplist, PA_PROP_DEVICE_BUFFERING_FRAGMENT_SIZE, "%zu", u->fragment_size); + + } else if (period_frames * u->frame_size != u->fragment_size || + buffer_frames * u->frame_size != u->hwbuf_size) { + pa_log_warn("Resume failed, couldn't restore original fragment settings. (Old: %zu/%zu, New %lu/%lu)", + u->hwbuf_size, u->fragment_size, + (unsigned long) buffer_frames * u->frame_size, (unsigned long) period_frames * u->frame_size); + goto fail; + } + + if (update_sw_params(u) < 0) + goto fail; + + if (build_pollfd(u) < 0) + goto fail; + + /* FIXME: We need to reload the volume somehow */ + + reset_vars(u); + + /* reset the watermark to the value defined when source was created */ + if (u->use_tsched && !recovering) + reset_watermark(u, u->tsched_watermark_ref, &u->source->sample_spec, true); + + pa_log_info("Resumed successfully..."); + + return 0; + +fail: + if (u->pcm_handle) { + snd_pcm_close(u->pcm_handle); + u->pcm_handle = NULL; + } + + return -PA_ERR_IO; +} + +/* Called from the IO thread or the main thread depending on whether deferred + * volume is enabled or not (with deferred volume all mixer handling is done + * from the IO thread). + * + * Sets the mixer settings to match the current source and port state (the port + * is given as an argument, because active_port may still point to the old + * port, if we're switching ports). */ +static void sync_mixer(struct userdata *u, pa_device_port *port) { + pa_alsa_setting *setting = NULL; + + pa_assert(u); + + if (!u->mixer_path) + return; + + /* port may be NULL, because if we use a synthesized mixer path, then the + * source has no ports. */ + if (port && !u->ucm_context) { + pa_alsa_port_data *data; + + data = PA_DEVICE_PORT_DATA(port); + setting = data->setting; + } + + pa_alsa_path_select(u->mixer_path, setting, u->mixer_handle, u->source->muted); + + if (u->source->set_mute) + u->source->set_mute(u->source); + if (u->source->flags & PA_SOURCE_DEFERRED_VOLUME) { + if (u->source->write_volume) + u->source->write_volume(u->source); + } else { + if (u->source->set_volume) + u->source->set_volume(u->source); + } +} + +/* Called from IO context */ +static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SOURCE(o)->userdata; + + switch (code) { + + case PA_SOURCE_MESSAGE_GET_LATENCY: { + int64_t r = 0; + + if (u->pcm_handle) + r = source_get_latency(u); + + *((int64_t*) data) = r; + + return 0; + } + + case SOURCE_MESSAGE_SYNC_MIXER: { + pa_device_port *port = data; + + sync_mixer(u, port); + return 0; + } + } + + return pa_source_process_msg(o, code, data, offset, chunk); +} + +/* Called from main context */ +static int source_set_state_in_main_thread_cb(pa_source *s, pa_source_state_t new_state, pa_suspend_cause_t new_suspend_cause) { + pa_source_state_t old_state; + struct userdata *u; + + pa_source_assert_ref(s); + pa_assert_se(u = s->userdata); + + /* When our session becomes active, we need to sync the mixer, because + * another user may have changed the mixer settings. + * + * If deferred volume is enabled, the syncing is done in the + * set_state_in_io_thread() callback instead. */ + if (!(s->flags & PA_SOURCE_DEFERRED_VOLUME) + && (s->suspend_cause & PA_SUSPEND_SESSION) + && !(new_suspend_cause & PA_SUSPEND_SESSION)) + sync_mixer(u, s->active_port); + + old_state = u->source->state; + + if (PA_SOURCE_IS_OPENED(old_state) && new_state == PA_SOURCE_SUSPENDED) + reserve_done(u); + else if (old_state == PA_SOURCE_SUSPENDED && PA_SOURCE_IS_OPENED(new_state)) + if (reserve_init(u, u->device_name) < 0) + return -PA_ERR_BUSY; + + return 0; +} + +/* Called from the IO thread. */ +static int source_set_state_in_io_thread_cb(pa_source *s, pa_source_state_t new_state, pa_suspend_cause_t new_suspend_cause) { + struct userdata *u; + + pa_assert(s); + pa_assert_se(u = s->userdata); + + /* When our session becomes active, we need to sync the mixer, because + * another user may have changed the mixer settings. + * + * If deferred volume is disabled, the syncing is done in the + * set_state_in_main_thread() callback instead. */ + if ((s->flags & PA_SOURCE_DEFERRED_VOLUME) + && (s->suspend_cause & PA_SUSPEND_SESSION) + && !(new_suspend_cause & PA_SUSPEND_SESSION)) + sync_mixer(u, s->active_port); + + /* It may be that only the suspend cause is changing, in which case there's + * nothing more to do. */ + if (new_state == s->thread_info.state) + return 0; + + switch (new_state) { + + case PA_SOURCE_SUSPENDED: { + pa_assert(PA_SOURCE_IS_OPENED(s->thread_info.state)); + + suspend(u); + + break; + } + + case PA_SOURCE_IDLE: + case PA_SOURCE_RUNNING: { + int r; + + if (s->thread_info.state == PA_SOURCE_INIT) { + if (build_pollfd(u) < 0) + /* FIXME: This will cause an assertion failure, because + * with the current design pa_source_put() is not allowed + * to fail and pa_source_put() has no fallback code that + * would start the source suspended if opening the device + * fails. */ + return -PA_ERR_IO; + } + + if (s->thread_info.state == PA_SOURCE_SUSPENDED) { + if ((r = unsuspend(u, false)) < 0) + return r; + } + + break; + } + + case PA_SOURCE_UNLINKED: + case PA_SOURCE_INIT: + case PA_SOURCE_INVALID_STATE: + ; + } + + return 0; +} + +static int ctl_mixer_callback(snd_mixer_elem_t *elem, unsigned int mask) { + struct userdata *u = snd_mixer_elem_get_callback_private(elem); + + pa_assert(u); + pa_assert(u->mixer_handle); + + if (mask == SND_CTL_EVENT_MASK_REMOVE) + return 0; + + if (!PA_SOURCE_IS_LINKED(u->source->state)) + return 0; + + if (u->source->suspend_cause & PA_SUSPEND_SESSION) + return 0; + + if (mask & SND_CTL_EVENT_MASK_VALUE) { + pa_source_get_volume(u->source, true); + pa_source_get_mute(u->source, true); + } + + return 0; +} + +static int io_mixer_callback(snd_mixer_elem_t *elem, unsigned int mask) { + struct userdata *u = snd_mixer_elem_get_callback_private(elem); + + pa_assert(u); + pa_assert(u->mixer_handle); + + if (mask == SND_CTL_EVENT_MASK_REMOVE) + return 0; + + if (u->source->suspend_cause & PA_SUSPEND_SESSION) + return 0; + + if (mask & SND_CTL_EVENT_MASK_VALUE) + pa_source_update_volume_and_mute(u->source); + + return 0; +} + +static void source_get_volume_cb(pa_source *s) { + struct userdata *u = s->userdata; + pa_cvolume r; + char volume_buf[PA_CVOLUME_SNPRINT_VERBOSE_MAX]; + + pa_assert(u); + pa_assert(u->mixer_path); + pa_assert(u->mixer_handle); + + if (pa_alsa_path_get_volume(u->mixer_path, u->mixer_handle, &s->channel_map, &r) < 0) + return; + + /* Shift down by the base volume, so that 0dB becomes maximum volume */ + pa_sw_cvolume_multiply_scalar(&r, &r, s->base_volume); + + pa_log_debug("Read hardware volume: %s", + pa_cvolume_snprint_verbose(volume_buf, sizeof(volume_buf), &r, &s->channel_map, u->mixer_path->has_dB)); + + if (pa_cvolume_equal(&u->hardware_volume, &r)) + return; + + s->real_volume = u->hardware_volume = r; + + /* Hmm, so the hardware volume changed, let's reset our software volume */ + if (u->mixer_path->has_dB) + pa_source_set_soft_volume(s, NULL); +} + +static void source_set_volume_cb(pa_source *s) { + struct userdata *u = s->userdata; + pa_cvolume r; + char volume_buf[PA_CVOLUME_SNPRINT_VERBOSE_MAX]; + bool deferred_volume = !!(s->flags & PA_SOURCE_DEFERRED_VOLUME); + + pa_assert(u); + pa_assert(u->mixer_path); + pa_assert(u->mixer_handle); + + /* Shift up by the base volume */ + pa_sw_cvolume_divide_scalar(&r, &s->real_volume, s->base_volume); + + if (pa_alsa_path_set_volume(u->mixer_path, u->mixer_handle, &s->channel_map, &r, deferred_volume, !deferred_volume) < 0) + return; + + /* Shift down by the base volume, so that 0dB becomes maximum volume */ + pa_sw_cvolume_multiply_scalar(&r, &r, s->base_volume); + + u->hardware_volume = r; + + if (u->mixer_path->has_dB) { + pa_cvolume new_soft_volume; + bool accurate_enough; + + /* Match exactly what the user requested by software */ + pa_sw_cvolume_divide(&new_soft_volume, &s->real_volume, &u->hardware_volume); + + /* If the adjustment to do in software is only minimal we + * can skip it. That saves us CPU at the expense of a bit of + * accuracy */ + accurate_enough = + (pa_cvolume_min(&new_soft_volume) >= (PA_VOLUME_NORM - VOLUME_ACCURACY)) && + (pa_cvolume_max(&new_soft_volume) <= (PA_VOLUME_NORM + VOLUME_ACCURACY)); + + pa_log_debug("Requested volume: %s", + pa_cvolume_snprint_verbose(volume_buf, sizeof(volume_buf), &s->real_volume, &s->channel_map, true)); + pa_log_debug("Got hardware volume: %s", + pa_cvolume_snprint_verbose(volume_buf, sizeof(volume_buf), &u->hardware_volume, &s->channel_map, true)); + pa_log_debug("Calculated software volume: %s (accurate-enough=%s)", + pa_cvolume_snprint_verbose(volume_buf, sizeof(volume_buf), &new_soft_volume, &s->channel_map, true), + pa_yes_no(accurate_enough)); + + if (!accurate_enough) + s->soft_volume = new_soft_volume; + + } else { + pa_log_debug("Wrote hardware volume: %s", + pa_cvolume_snprint_verbose(volume_buf, sizeof(volume_buf), &r, &s->channel_map, false)); + + /* We can't match exactly what the user requested, hence let's + * at least tell the user about it */ + + s->real_volume = r; + } +} + +static void source_write_volume_cb(pa_source *s) { + struct userdata *u = s->userdata; + pa_cvolume hw_vol = s->thread_info.current_hw_volume; + + pa_assert(u); + pa_assert(u->mixer_path); + pa_assert(u->mixer_handle); + pa_assert(s->flags & PA_SOURCE_DEFERRED_VOLUME); + + /* Shift up by the base volume */ + pa_sw_cvolume_divide_scalar(&hw_vol, &hw_vol, s->base_volume); + + if (pa_alsa_path_set_volume(u->mixer_path, u->mixer_handle, &s->channel_map, &hw_vol, true, true) < 0) + pa_log_error("Writing HW volume failed"); + else { + pa_cvolume tmp_vol; + bool accurate_enough; + + /* Shift down by the base volume, so that 0dB becomes maximum volume */ + pa_sw_cvolume_multiply_scalar(&hw_vol, &hw_vol, s->base_volume); + + pa_sw_cvolume_divide(&tmp_vol, &hw_vol, &s->thread_info.current_hw_volume); + accurate_enough = + (pa_cvolume_min(&tmp_vol) >= (PA_VOLUME_NORM - VOLUME_ACCURACY)) && + (pa_cvolume_max(&tmp_vol) <= (PA_VOLUME_NORM + VOLUME_ACCURACY)); + + if (!accurate_enough) { + char volume_buf[2][PA_CVOLUME_SNPRINT_VERBOSE_MAX]; + + pa_log_debug("Written HW volume did not match with the request: %s (request) != %s", + pa_cvolume_snprint_verbose(volume_buf[0], + sizeof(volume_buf[0]), + &s->thread_info.current_hw_volume, + &s->channel_map, + true), + pa_cvolume_snprint_verbose(volume_buf[1], sizeof(volume_buf[1]), &hw_vol, &s->channel_map, true)); + } + } +} + +static int source_get_mute_cb(pa_source *s, bool *mute) { + struct userdata *u = s->userdata; + + pa_assert(u); + pa_assert(u->mixer_path); + pa_assert(u->mixer_handle); + + if (pa_alsa_path_get_mute(u->mixer_path, u->mixer_handle, mute) < 0) + return -1; + + return 0; +} + +static void source_set_mute_cb(pa_source *s) { + struct userdata *u = s->userdata; + + pa_assert(u); + pa_assert(u->mixer_path); + pa_assert(u->mixer_handle); + + pa_alsa_path_set_mute(u->mixer_path, u->mixer_handle, s->muted); +} + +static void mixer_volume_init(struct userdata *u) { + pa_assert(u); + + if (!u->mixer_path || !u->mixer_path->has_volume) { + pa_source_set_write_volume_callback(u->source, NULL); + pa_source_set_get_volume_callback(u->source, NULL); + pa_source_set_set_volume_callback(u->source, NULL); + + pa_log_info("Driver does not support hardware volume control, falling back to software volume control."); + } else { + pa_source_set_get_volume_callback(u->source, source_get_volume_cb); + pa_source_set_set_volume_callback(u->source, source_set_volume_cb); + + if (u->mixer_path->has_dB && u->deferred_volume) { + pa_source_set_write_volume_callback(u->source, source_write_volume_cb); + pa_log_info("Successfully enabled deferred volume."); + } else + pa_source_set_write_volume_callback(u->source, NULL); + + if (u->mixer_path->has_dB) { + pa_source_enable_decibel_volume(u->source, true); + pa_log_info("Hardware volume ranges from %0.2f dB to %0.2f dB.", u->mixer_path->min_dB, u->mixer_path->max_dB); + + u->source->base_volume = pa_sw_volume_from_dB(-u->mixer_path->max_dB); + u->source->n_volume_steps = PA_VOLUME_NORM+1; + + pa_log_info("Fixing base volume to %0.2f dB", pa_sw_volume_to_dB(u->source->base_volume)); + } else { + pa_source_enable_decibel_volume(u->source, false); + pa_log_info("Hardware volume ranges from %li to %li.", u->mixer_path->min_volume, u->mixer_path->max_volume); + + u->source->base_volume = PA_VOLUME_NORM; + u->source->n_volume_steps = u->mixer_path->max_volume - u->mixer_path->min_volume + 1; + } + + pa_log_info("Using hardware volume control. Hardware dB scale %s.", u->mixer_path->has_dB ? "supported" : "not supported"); + } + + if (!u->mixer_path || !u->mixer_path->has_mute) { + pa_source_set_get_mute_callback(u->source, NULL); + pa_source_set_set_mute_callback(u->source, NULL); + pa_log_info("Driver does not support hardware mute control, falling back to software mute control."); + } else { + pa_source_set_get_mute_callback(u->source, source_get_mute_cb); + pa_source_set_set_mute_callback(u->source, source_set_mute_cb); + pa_log_info("Using hardware mute control."); + } +} + +static int source_set_port_ucm_cb(pa_source *s, pa_device_port *p) { + struct userdata *u = s->userdata; + pa_alsa_ucm_port_data *data; + + pa_assert(u); + pa_assert(p); + pa_assert(u->ucm_context); + + data = PA_DEVICE_PORT_DATA(p); + u->mixer_path = data->path; + mixer_volume_init(u); + + if (s->flags & PA_SOURCE_DEFERRED_VOLUME) + pa_asyncmsgq_send(u->source->asyncmsgq, PA_MSGOBJECT(u->source), SOURCE_MESSAGE_SYNC_MIXER, p, 0, NULL); + else + sync_mixer(u, p); + + return pa_alsa_ucm_set_port(u->ucm_context, p, false); +} + +static int source_set_port_cb(pa_source *s, pa_device_port *p) { + struct userdata *u = s->userdata; + pa_alsa_port_data *data; + + pa_assert(u); + pa_assert(p); + pa_assert(u->mixer_handle); + pa_assert(!u->ucm_context); + + data = PA_DEVICE_PORT_DATA(p); + pa_assert_se(u->mixer_path = data->path); + mixer_volume_init(u); + + if (s->flags & PA_SOURCE_DEFERRED_VOLUME) + pa_asyncmsgq_send(u->source->asyncmsgq, PA_MSGOBJECT(u->source), SOURCE_MESSAGE_SYNC_MIXER, p, 0, NULL); + else + sync_mixer(u, p); + + return 0; +} + +static void source_update_requested_latency_cb(pa_source *s) { + struct userdata *u = s->userdata; + pa_assert(u); + pa_assert(u->use_tsched); /* only when timer scheduling is used + * we can dynamically adjust the + * latency */ + + if (!u->pcm_handle) + return; + + update_sw_params(u); +} + +static void source_reconfigure_cb(pa_source *s, pa_sample_spec *spec, bool passthrough) { + struct userdata *u = s->userdata; + int i; + bool format_supported = false; + bool rate_supported = false; + + pa_assert(u); + + for (i = 0; u->supported_formats[i] != PA_SAMPLE_MAX; i++) { + if (u->supported_formats[i] == spec->format) { + pa_source_set_sample_format(u->source, spec->format); + format_supported = true; + break; + } + } + + if (!format_supported) { + pa_log_info("Source does not support sample format of %s, set it to a verified value", + pa_sample_format_to_string(spec->format)); + pa_source_set_sample_format(u->source, u->verified_sample_spec.format); + } + + for (i = 0; u->supported_rates[i]; i++) { + if (u->supported_rates[i] == spec->rate) { + pa_source_set_sample_rate(u->source, spec->rate); + rate_supported = true; + break; + } + } + + if (!rate_supported) { + pa_log_info("Source does not support sample rate of %u, set it to a verfied value", spec->rate); + pa_source_set_sample_rate(u->source, u->verified_sample_spec.rate); + } +} + +static void thread_func(void *userdata) { + struct userdata *u = userdata; + unsigned short revents = 0; + + pa_assert(u); + + pa_log_debug("Thread starting up"); + + if (u->core->realtime_scheduling) + pa_thread_make_realtime(u->core->realtime_priority); + + pa_thread_mq_install(&u->thread_mq); + + for (;;) { + int ret; + pa_usec_t rtpoll_sleep = 0, real_sleep; + +#ifdef DEBUG_TIMING + pa_log_debug("Loop"); +#endif + + /* Read some data and pass it to the sources */ + if (PA_SOURCE_IS_OPENED(u->source->thread_info.state)) { + int work_done; + pa_usec_t sleep_usec = 0; + bool on_timeout = pa_rtpoll_timer_elapsed(u->rtpoll); + + if (u->first) { + pa_log_info("Starting capture."); + snd_pcm_start(u->pcm_handle); + + pa_smoother_resume(u->smoother, pa_rtclock_now(), true); + + u->first = false; + } + + if (u->use_mmap) + work_done = mmap_read(u, &sleep_usec, revents & POLLIN, on_timeout); + else + work_done = unix_read(u, &sleep_usec, revents & POLLIN, on_timeout); + + if (work_done < 0) + goto fail; + +/* pa_log_debug("work_done = %i", work_done); */ + + if (work_done) + update_smoother(u); + + if (u->use_tsched) { + pa_usec_t cusec; + + /* OK, the capture buffer is now empty, let's + * calculate when to wake up next */ + +/* pa_log_debug("Waking up in %0.2fms (sound card clock).", (double) sleep_usec / PA_USEC_PER_MSEC); */ + + /* Convert from the sound card time domain to the + * system time domain */ + cusec = pa_smoother_translate(u->smoother, pa_rtclock_now(), sleep_usec); + +/* pa_log_debug("Waking up in %0.2fms (system clock).", (double) cusec / PA_USEC_PER_MSEC); */ + + /* We don't trust the conversion, so we wake up whatever comes first */ + rtpoll_sleep = PA_MIN(sleep_usec, cusec); + } + } + + if (u->source->flags & PA_SOURCE_DEFERRED_VOLUME) { + pa_usec_t volume_sleep; + pa_source_volume_change_apply(u->source, &volume_sleep); + if (volume_sleep > 0) { + if (rtpoll_sleep > 0) + rtpoll_sleep = PA_MIN(volume_sleep, rtpoll_sleep); + else + rtpoll_sleep = volume_sleep; + } + } + + if (rtpoll_sleep > 0) { + pa_rtpoll_set_timer_relative(u->rtpoll, rtpoll_sleep); + real_sleep = pa_rtclock_now(); + } + else + pa_rtpoll_set_timer_disabled(u->rtpoll); + + /* Hmm, nothing to do. Let's sleep */ + if ((ret = pa_rtpoll_run(u->rtpoll)) < 0) + goto fail; + + if (rtpoll_sleep > 0) { + real_sleep = pa_rtclock_now() - real_sleep; +#ifdef DEBUG_TIMING + pa_log_debug("Expected sleep: %0.2fms, real sleep: %0.2fms (diff %0.2f ms)", + (double) rtpoll_sleep / PA_USEC_PER_MSEC, (double) real_sleep / PA_USEC_PER_MSEC, + (double) ((int64_t) real_sleep - (int64_t) rtpoll_sleep) / PA_USEC_PER_MSEC); +#endif + if (u->use_tsched && real_sleep > rtpoll_sleep + u->tsched_watermark_usec) + pa_log_info("Scheduling delay of %0.2f ms > %0.2f ms, you might want to investigate this to improve latency...", + (double) (real_sleep - rtpoll_sleep) / PA_USEC_PER_MSEC, + (double) (u->tsched_watermark_usec) / PA_USEC_PER_MSEC); + } + + if (u->source->flags & PA_SOURCE_DEFERRED_VOLUME) + pa_source_volume_change_apply(u->source, NULL); + + if (ret == 0) + goto finish; + + /* Tell ALSA about this and process its response */ + if (PA_SOURCE_IS_OPENED(u->source->thread_info.state)) { + struct pollfd *pollfd; + int err; + unsigned n; + + pollfd = pa_rtpoll_item_get_pollfd(u->alsa_rtpoll_item, &n); + + if ((err = snd_pcm_poll_descriptors_revents(u->pcm_handle, pollfd, n, &revents)) < 0) { + pa_log("snd_pcm_poll_descriptors_revents() failed: %s", pa_alsa_strerror(err)); + goto fail; + } + + if (revents & ~POLLIN) { + if ((err = pa_alsa_recover_from_poll(u->pcm_handle, revents)) < 0) + goto fail; + + /* Stream needs to be restarted */ + if (err == 1) { + close_pcm(u); + if (unsuspend(u, true) < 0) + goto fail; + } else + reset_vars(u); + + revents = 0; + } else if (revents && u->use_tsched && pa_log_ratelimit(PA_LOG_DEBUG)) + pa_log_debug("Wakeup from ALSA!"); + + } else + revents = 0; + } + +fail: + /* If this was no regular exit from the loop we have to continue + * processing messages until we received PA_MESSAGE_SHUTDOWN */ + pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL); + pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN); + +finish: + pa_log_debug("Thread shutting down"); +} + +static void set_source_name(pa_source_new_data *data, pa_modargs *ma, const char *device_id, const char *device_name, pa_alsa_mapping *mapping) { + const char *n; + char *t; + + pa_assert(data); + pa_assert(ma); + pa_assert(device_name); + + if ((n = pa_modargs_get_value(ma, "source_name", NULL))) { + pa_source_new_data_set_name(data, n); + data->namereg_fail = true; + return; + } + + if ((n = pa_modargs_get_value(ma, "name", NULL))) + data->namereg_fail = true; + else { + n = device_id ? device_id : device_name; + data->namereg_fail = false; + } + + if (mapping) + t = pa_sprintf_malloc("alsa_input.%s.%s", n, mapping->name); + else + t = pa_sprintf_malloc("alsa_input.%s", n); + + pa_source_new_data_set_name(data, t); + pa_xfree(t); +} + +static void find_mixer(struct userdata *u, pa_alsa_mapping *mapping, const char *element, bool ignore_dB) { + const char *mdev; + + if (!mapping && !element) + return; + + if (!element && mapping && pa_alsa_path_set_is_empty(mapping->input_path_set)) + return; + + u->mixers = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, + NULL, (pa_free_cb_t) pa_alsa_mixer_free); + + mdev = pa_proplist_gets(mapping->proplist, "alsa.mixer_device"); + if (mdev) { + u->mixer_handle = pa_alsa_open_mixer_by_name(u->mixers, mdev, false); + } else { + u->mixer_handle = pa_alsa_open_mixer_for_pcm(u->mixers, u->pcm_handle, false); + } + if (!u->mixer_handle) { + pa_log_info("Failed to find a working mixer device."); + return; + } + + if (element) { + + if (!(u->mixer_path = pa_alsa_path_synthesize(element, PA_ALSA_DIRECTION_INPUT))) + goto fail; + + if (pa_alsa_path_probe(u->mixer_path, NULL, u->mixer_handle, ignore_dB) < 0) + goto fail; + + pa_log_debug("Probed mixer path %s:", u->mixer_path->name); + pa_alsa_path_dump(u->mixer_path); + } else { + u->mixer_path_set = mapping->input_path_set; + } + + return; + +fail: + + if (u->mixer_path) { + pa_alsa_path_free(u->mixer_path); + u->mixer_path = NULL; + } + + u->mixer_handle = NULL; + pa_hashmap_free(u->mixers); + u->mixers = NULL; +} + +static int setup_mixer(struct userdata *u, bool ignore_dB) { + bool need_mixer_callback = false; + + pa_assert(u); + + /* This code is before the u->mixer_handle check, because if the UCM + * configuration doesn't specify volume or mute controls, u->mixer_handle + * will be NULL, but the UCM device enable sequence will still need to be + * executed. */ + if (u->source->active_port && u->ucm_context) { + if (pa_alsa_ucm_set_port(u->ucm_context, u->source->active_port, false) < 0) + return -1; + } + + if (!u->mixer_handle) + return 0; + + if (u->source->active_port) { + if (!u->ucm_context) { + pa_alsa_port_data *data; + + /* We have a list of supported paths, so let's activate the + * one that has been chosen as active */ + + data = PA_DEVICE_PORT_DATA(u->source->active_port); + u->mixer_path = data->path; + + pa_alsa_path_select(data->path, data->setting, u->mixer_handle, u->source->muted); + } else { + pa_alsa_ucm_port_data *data; + + data = PA_DEVICE_PORT_DATA(u->source->active_port); + + /* Now activate volume controls, if any */ + if (data->path) { + u->mixer_path = data->path; + pa_alsa_path_select(u->mixer_path, NULL, u->mixer_handle, u->source->muted); + } + } + } else { + + if (!u->mixer_path && u->mixer_path_set) + u->mixer_path = pa_hashmap_first(u->mixer_path_set->paths); + + if (u->mixer_path) { + /* Hmm, we have only a single path, then let's activate it */ + + pa_alsa_path_select(u->mixer_path, u->mixer_path->settings, u->mixer_handle, u->source->muted); + } else + return 0; + } + + mixer_volume_init(u); + + /* Will we need to register callbacks? */ + if (u->mixer_path_set && u->mixer_path_set->paths) { + pa_alsa_path *p; + void *state; + + PA_HASHMAP_FOREACH(p, u->mixer_path_set->paths, state) { + if (p->has_volume || p->has_mute) + need_mixer_callback = true; + } + } + else if (u->mixer_path) + need_mixer_callback = u->mixer_path->has_volume || u->mixer_path->has_mute; + + if (need_mixer_callback) { + int (*mixer_callback)(snd_mixer_elem_t *, unsigned int); + if (u->source->flags & PA_SOURCE_DEFERRED_VOLUME) { + u->mixer_pd = pa_alsa_mixer_pdata_new(); + mixer_callback = io_mixer_callback; + + if (pa_alsa_set_mixer_rtpoll(u->mixer_pd, u->mixer_handle, u->rtpoll) < 0) { + pa_log("Failed to initialize file descriptor monitoring"); + return -1; + } + } else { + u->mixer_fdl = pa_alsa_fdlist_new(); + mixer_callback = ctl_mixer_callback; + + if (pa_alsa_fdlist_set_handle(u->mixer_fdl, u->mixer_handle, NULL, u->core->mainloop) < 0) { + pa_log("Failed to initialize file descriptor monitoring"); + return -1; + } + } + + if (u->mixer_path_set) + pa_alsa_path_set_set_callback(u->mixer_path_set, u->mixer_handle, mixer_callback, u); + else + pa_alsa_path_set_callback(u->mixer_path, u->mixer_handle, mixer_callback, u); + } + + return 0; +} + +pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, pa_card *card, pa_alsa_mapping *mapping) { + + struct userdata *u = NULL; + const char *dev_id = NULL, *key, *mod_name; + pa_sample_spec ss; + char *thread_name = NULL; + uint32_t alternate_sample_rate; + pa_channel_map map; + uint32_t nfrags, frag_size, buffer_size, tsched_size, tsched_watermark; + snd_pcm_uframes_t period_frames, buffer_frames, tsched_frames; + size_t frame_size; + bool use_mmap = true; + bool use_tsched = true; + bool ignore_dB = false; + bool namereg_fail = false; + bool deferred_volume = false; + bool fixed_latency_range = false; + bool b; + bool d; + bool avoid_resampling; + pa_source_new_data data; + bool volume_is_set; + bool mute_is_set; + pa_alsa_profile_set *profile_set = NULL; + void *state; + + pa_assert(m); + pa_assert(ma); + + ss = m->core->default_sample_spec; + map = m->core->default_channel_map; + avoid_resampling = m->core->avoid_resampling; + + /* Pick sample spec overrides from the mapping, if any */ + if (mapping) { + if (mapping->sample_spec.format != PA_SAMPLE_INVALID) + ss.format = mapping->sample_spec.format; + if (mapping->sample_spec.rate != 0) + ss.rate = mapping->sample_spec.rate; + if (mapping->sample_spec.channels != 0) { + ss.channels = mapping->sample_spec.channels; + if (pa_channel_map_valid(&mapping->channel_map)) + pa_assert(pa_channel_map_compatible(&mapping->channel_map, &ss)); + } + } + + /* Override with modargs if provided */ + if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_ALSA) < 0) { + pa_log("Failed to parse sample specification and channel map"); + goto fail; + } + + alternate_sample_rate = m->core->alternate_sample_rate; + if (pa_modargs_get_alternate_sample_rate(ma, &alternate_sample_rate) < 0) { + pa_log("Failed to parse alternate sample rate"); + goto fail; + } + + frame_size = pa_frame_size(&ss); + + nfrags = m->core->default_n_fragments; + frag_size = (uint32_t) pa_usec_to_bytes(m->core->default_fragment_size_msec*PA_USEC_PER_MSEC, &ss); + if (frag_size <= 0) + frag_size = (uint32_t) frame_size; + tsched_size = (uint32_t) pa_usec_to_bytes(DEFAULT_TSCHED_BUFFER_USEC, &ss); + tsched_watermark = (uint32_t) pa_usec_to_bytes(DEFAULT_TSCHED_WATERMARK_USEC, &ss); + + if (pa_modargs_get_value_u32(ma, "fragments", &nfrags) < 0 || + pa_modargs_get_value_u32(ma, "fragment_size", &frag_size) < 0 || + pa_modargs_get_value_u32(ma, "tsched_buffer_size", &tsched_size) < 0 || + pa_modargs_get_value_u32(ma, "tsched_buffer_watermark", &tsched_watermark) < 0) { + pa_log("Failed to parse buffer metrics"); + goto fail; + } + + buffer_size = nfrags * frag_size; + + period_frames = frag_size/frame_size; + buffer_frames = buffer_size/frame_size; + tsched_frames = tsched_size/frame_size; + + if (pa_modargs_get_value_boolean(ma, "mmap", &use_mmap) < 0) { + pa_log("Failed to parse mmap argument."); + goto fail; + } + + if (pa_modargs_get_value_boolean(ma, "tsched", &use_tsched) < 0) { + pa_log("Failed to parse tsched argument."); + goto fail; + } + + if (pa_modargs_get_value_boolean(ma, "ignore_dB", &ignore_dB) < 0) { + pa_log("Failed to parse ignore_dB argument."); + goto fail; + } + + deferred_volume = m->core->deferred_volume; + if (pa_modargs_get_value_boolean(ma, "deferred_volume", &deferred_volume) < 0) { + pa_log("Failed to parse deferred_volume argument."); + goto fail; + } + + if (pa_modargs_get_value_boolean(ma, "fixed_latency_range", &fixed_latency_range) < 0) { + pa_log("Failed to parse fixed_latency_range argument."); + goto fail; + } + + use_tsched = pa_alsa_may_tsched(use_tsched); + + u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + u->use_mmap = use_mmap; + u->use_tsched = use_tsched; + u->tsched_size = tsched_size; + u->initial_info.nfrags = (size_t) nfrags; + u->initial_info.fragment_size = (size_t) frag_size; + u->initial_info.tsched_size = (size_t) tsched_size; + u->initial_info.tsched_watermark = (size_t) tsched_watermark; + u->deferred_volume = deferred_volume; + u->fixed_latency_range = fixed_latency_range; + u->first = true; + u->rtpoll = pa_rtpoll_new(); + + if (pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll) < 0) { + pa_log("pa_thread_mq_init() failed."); + goto fail; + } + + u->smoother = pa_smoother_new( + SMOOTHER_ADJUST_USEC, + SMOOTHER_WINDOW_USEC, + true, + true, + 5, + pa_rtclock_now(), + true); + u->smoother_interval = SMOOTHER_MIN_INTERVAL; + + /* use ucm */ + if (mapping && mapping->ucm_context.ucm) + u->ucm_context = &mapping->ucm_context; + + dev_id = pa_modargs_get_value( + ma, "device_id", + pa_modargs_get_value(ma, "device", DEFAULT_DEVICE)); + + u->paths_dir = pa_xstrdup(pa_modargs_get_value(ma, "paths_dir", NULL)); + + if (reserve_init(u, dev_id) < 0) + goto fail; + + if (reserve_monitor_init(u, dev_id) < 0) + goto fail; + + b = use_mmap; + d = use_tsched; + + /* Force ALSA to reread its configuration if module-alsa-card didn't + * do it for us. This matters if our device was hot-plugged after ALSA + * has already read its configuration - see + * https://bugs.freedesktop.org/show_bug.cgi?id=54029 + */ + + if (!card) + snd_config_update_free_global(); + + if (mapping) { + + if (!(dev_id = pa_modargs_get_value(ma, "device_id", NULL))) { + pa_log("device_id= not set"); + goto fail; + } + + if ((mod_name = pa_proplist_gets(mapping->proplist, PA_ALSA_PROP_UCM_MODIFIER))) { + if (snd_use_case_set(u->ucm_context->ucm->ucm_mgr, "_enamod", mod_name) < 0) + pa_log("Failed to enable ucm modifier %s", mod_name); + else + pa_log_debug("Enabled ucm modifier %s", mod_name); + } + + if (!(u->pcm_handle = pa_alsa_open_by_device_id_mapping( + dev_id, + &u->device_name, + &ss, &map, + SND_PCM_STREAM_CAPTURE, + &period_frames, &buffer_frames, tsched_frames, + &b, &d, mapping))) + goto fail; + + } else if ((dev_id = pa_modargs_get_value(ma, "device_id", NULL))) { + + if (!(profile_set = pa_alsa_profile_set_new(NULL, &map))) + goto fail; + + if (!(u->pcm_handle = pa_alsa_open_by_device_id_auto( + dev_id, + &u->device_name, + &ss, &map, + SND_PCM_STREAM_CAPTURE, + &period_frames, &buffer_frames, tsched_frames, + &b, &d, profile_set, &mapping))) + goto fail; + + } else { + + if (!(u->pcm_handle = pa_alsa_open_by_device_string( + pa_modargs_get_value(ma, "device", DEFAULT_DEVICE), + &u->device_name, + &ss, &map, + SND_PCM_STREAM_CAPTURE, + &period_frames, &buffer_frames, tsched_frames, + &b, &d, false))) + goto fail; + } + + pa_assert(u->device_name); + pa_log_info("Successfully opened device %s.", u->device_name); + + if (pa_alsa_pcm_is_modem(u->pcm_handle)) { + pa_log_notice("Device %s is modem, refusing further initialization.", u->device_name); + goto fail; + } + + if (mapping) + pa_log_info("Selected mapping '%s' (%s).", mapping->description, mapping->name); + + if (use_mmap && !b) { + pa_log_info("Device doesn't support mmap(), falling back to UNIX read/write mode."); + u->use_mmap = use_mmap = false; + } + + if (use_tsched && (!b || !d)) { + pa_log_info("Cannot enable timer-based scheduling, falling back to sound IRQ scheduling."); + u->use_tsched = use_tsched = false; + } + + if (u->use_mmap) + pa_log_info("Successfully enabled mmap() mode."); + + if (u->use_tsched) { + pa_log_info("Successfully enabled timer-based scheduling mode."); + if (u->fixed_latency_range) + pa_log_info("Disabling latency range changes on overrun"); + } + + u->verified_sample_spec = ss; + + u->supported_formats = pa_alsa_get_supported_formats(u->pcm_handle, ss.format); + if (!u->supported_formats) { + pa_log_error("Failed to find any supported sample formats."); + goto fail; + } + + u->supported_rates = pa_alsa_get_supported_rates(u->pcm_handle, ss.rate); + if (!u->supported_rates) { + pa_log_error("Failed to find any supported sample rates."); + goto fail; + } + + /* ALSA might tweak the sample spec, so recalculate the frame size */ + frame_size = pa_frame_size(&ss); + + pa_source_new_data_init(&data); + data.driver = driver; + data.module = m; + data.card = card; + set_source_name(&data, ma, dev_id, u->device_name, mapping); + + /* We need to give pa_modargs_get_value_boolean() a pointer to a local + * variable instead of using &data.namereg_fail directly, because + * data.namereg_fail is a bitfield and taking the address of a bitfield + * variable is impossible. */ + namereg_fail = data.namereg_fail; + if (pa_modargs_get_value_boolean(ma, "namereg_fail", &namereg_fail) < 0) { + pa_log("Failed to parse namereg_fail argument."); + pa_source_new_data_done(&data); + goto fail; + } + data.namereg_fail = namereg_fail; + + if (pa_modargs_get_value_boolean(ma, "avoid_resampling", &avoid_resampling) < 0) { + pa_log("Failed to parse avoid_resampling argument."); + pa_source_new_data_done(&data); + goto fail; + } + pa_source_new_data_set_avoid_resampling(&data, avoid_resampling); + + pa_source_new_data_set_sample_spec(&data, &ss); + pa_source_new_data_set_channel_map(&data, &map); + pa_source_new_data_set_alternate_sample_rate(&data, alternate_sample_rate); + + pa_alsa_init_proplist_pcm(m->core, data.proplist, u->pcm_handle); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, u->device_name); + pa_proplist_setf(data.proplist, PA_PROP_DEVICE_BUFFERING_BUFFER_SIZE, "%lu", (unsigned long) (buffer_frames * frame_size)); + pa_proplist_setf(data.proplist, PA_PROP_DEVICE_BUFFERING_FRAGMENT_SIZE, "%lu", (unsigned long) (period_frames * frame_size)); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_ACCESS_MODE, u->use_tsched ? "mmap+timer" : (u->use_mmap ? "mmap" : "serial")); + + if (mapping) { + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_PROFILE_NAME, mapping->name); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_PROFILE_DESCRIPTION, mapping->description); + + state = NULL; + while ((key = pa_proplist_iterate(mapping->proplist, &state))) + pa_proplist_sets(data.proplist, key, pa_proplist_gets(mapping->proplist, key)); + } + + pa_alsa_init_description(data.proplist, card); + + if (u->control_device) + pa_alsa_init_proplist_ctl(data.proplist, u->control_device); + + if (pa_modargs_get_proplist(ma, "source_properties", data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_source_new_data_done(&data); + goto fail; + } + + if (u->ucm_context) { + pa_alsa_ucm_add_ports(&data.ports, data.proplist, u->ucm_context, false, card, u->pcm_handle, ignore_dB); + find_mixer(u, mapping, pa_modargs_get_value(ma, "control", NULL), ignore_dB); + } else { + find_mixer(u, mapping, pa_modargs_get_value(ma, "control", NULL), ignore_dB); + if (u->mixer_path_set) + pa_alsa_add_ports(&data, u->mixer_path_set, card); + } + + u->source = pa_source_new(m->core, &data, PA_SOURCE_HARDWARE|PA_SOURCE_LATENCY|(u->use_tsched ? PA_SOURCE_DYNAMIC_LATENCY : 0)); + volume_is_set = data.volume_is_set; + mute_is_set = data.muted_is_set; + pa_source_new_data_done(&data); + + if (!u->source) { + pa_log("Failed to create source object"); + goto fail; + } + + if (u->ucm_context) { + pa_device_port *port; + unsigned h_prio = 0; + PA_HASHMAP_FOREACH(port, u->source->ports, state) { + if (!h_prio || port->priority > h_prio) + h_prio = port->priority; + } + /* ucm ports prioriy is 100, 200, ..., 900, change it to units digit */ + h_prio = h_prio / 100; + u->source->priority += h_prio; + } + + if (pa_modargs_get_value_u32(ma, "deferred_volume_safety_margin", + &u->source->thread_info.volume_change_safety_margin) < 0) { + pa_log("Failed to parse deferred_volume_safety_margin parameter"); + goto fail; + } + + if (pa_modargs_get_value_s32(ma, "deferred_volume_extra_delay", + &u->source->thread_info.volume_change_extra_delay) < 0) { + pa_log("Failed to parse deferred_volume_extra_delay parameter"); + goto fail; + } + + u->source->parent.process_msg = source_process_msg; + if (u->use_tsched) + u->source->update_requested_latency = source_update_requested_latency_cb; + u->source->set_state_in_main_thread = source_set_state_in_main_thread_cb; + u->source->set_state_in_io_thread = source_set_state_in_io_thread_cb; + if (u->ucm_context) + u->source->set_port = source_set_port_ucm_cb; + else + u->source->set_port = source_set_port_cb; + u->source->reconfigure = source_reconfigure_cb; + u->source->userdata = u; + + pa_source_set_asyncmsgq(u->source, u->thread_mq.inq); + pa_source_set_rtpoll(u->source, u->rtpoll); + + u->frame_size = frame_size; + u->frames_per_block = pa_mempool_block_size_max(m->core->mempool) / frame_size; + u->fragment_size = frag_size = (size_t) (period_frames * frame_size); + u->hwbuf_size = buffer_size = (size_t) (buffer_frames * frame_size); + pa_cvolume_mute(&u->hardware_volume, u->source->sample_spec.channels); + + pa_log_info("Using %0.1f fragments of size %lu bytes (%0.2fms), buffer size is %lu bytes (%0.2fms)", + (double) u->hwbuf_size / (double) u->fragment_size, + (long unsigned) u->fragment_size, + (double) pa_bytes_to_usec(u->fragment_size, &ss) / PA_USEC_PER_MSEC, + (long unsigned) u->hwbuf_size, + (double) pa_bytes_to_usec(u->hwbuf_size, &ss) / PA_USEC_PER_MSEC); + + if (u->use_tsched) { + u->tsched_watermark_ref = tsched_watermark; + reset_watermark(u, u->tsched_watermark_ref, &ss, false); + } + else + pa_source_set_fixed_latency(u->source, pa_bytes_to_usec(u->hwbuf_size, &ss)); + + reserve_update(u); + + if (update_sw_params(u) < 0) + goto fail; + + if (setup_mixer(u, ignore_dB) < 0) + goto fail; + + pa_alsa_dump(PA_LOG_DEBUG, u->pcm_handle); + + thread_name = pa_sprintf_malloc("alsa-source-%s", pa_strnull(pa_proplist_gets(u->source->proplist, "alsa.id"))); + if (!(u->thread = pa_thread_new(thread_name, thread_func, u))) { + pa_log("Failed to create thread."); + goto fail; + } + pa_xfree(thread_name); + thread_name = NULL; + + /* Get initial mixer settings */ + if (volume_is_set) { + if (u->source->set_volume) + u->source->set_volume(u->source); + } else { + if (u->source->get_volume) + u->source->get_volume(u->source); + } + + if (mute_is_set) { + if (u->source->set_mute) + u->source->set_mute(u->source); + } else { + if (u->source->get_mute) { + bool mute; + + if (u->source->get_mute(u->source, &mute) >= 0) + pa_source_set_mute(u->source, mute, false); + } + } + + if ((volume_is_set || mute_is_set) && u->source->write_volume) + u->source->write_volume(u->source); + + pa_source_put(u->source); + + if (profile_set) + pa_alsa_profile_set_free(profile_set); + + return u->source; + +fail: + pa_xfree(thread_name); + + if (u) + userdata_free(u); + + if (profile_set) + pa_alsa_profile_set_free(profile_set); + + return NULL; +} + +static void userdata_free(struct userdata *u) { + pa_assert(u); + + if (u->source) + pa_source_unlink(u->source); + + if (u->thread) { + pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL); + pa_thread_free(u->thread); + } + + pa_thread_mq_done(&u->thread_mq); + + if (u->source) + pa_source_unref(u->source); + + if (u->mixer_pd) + pa_alsa_mixer_pdata_free(u->mixer_pd); + + if (u->alsa_rtpoll_item) + pa_rtpoll_item_free(u->alsa_rtpoll_item); + + if (u->rtpoll) + pa_rtpoll_free(u->rtpoll); + + if (u->pcm_handle) { + snd_pcm_drop(u->pcm_handle); + snd_pcm_close(u->pcm_handle); + } + + if (u->mixer_fdl) + pa_alsa_fdlist_free(u->mixer_fdl); + + /* Only free the mixer_path if the sink owns it */ + if (u->mixer_path && !u->mixer_path_set && !u->ucm_context) + pa_alsa_path_free(u->mixer_path); + + if (u->mixers) + pa_hashmap_free(u->mixers); + + if (u->smoother) + pa_smoother_free(u->smoother); + + if (u->supported_formats) + pa_xfree(u->supported_formats); + + if (u->supported_rates) + pa_xfree(u->supported_rates); + + reserve_done(u); + monitor_done(u); + + pa_xfree(u->device_name); + pa_xfree(u->control_device); + pa_xfree(u->paths_dir); + pa_xfree(u); +} + +void pa_alsa_source_free(pa_source *s) { + struct userdata *u; + + pa_source_assert_ref(s); + pa_assert_se(u = s->userdata); + + userdata_free(u); +} diff --git a/src/modules/alsa/alsa-source.h b/src/modules/alsa/alsa-source.h new file mode 100644 index 0000000..ecbdfcd --- /dev/null +++ b/src/modules/alsa/alsa-source.h @@ -0,0 +1,34 @@ +#ifndef fooalsasourcehfoo +#define fooalsasourcehfoo + +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#include +#include +#include + +#include "alsa-util.h" + +pa_source* pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, pa_card *card, pa_alsa_mapping *mapping); + +void pa_alsa_source_free(pa_source *s); + +#endif diff --git a/src/modules/alsa/alsa-ucm.c b/src/modules/alsa/alsa-ucm.c new file mode 100644 index 0000000..d9cea61 --- /dev/null +++ b/src/modules/alsa/alsa-ucm.c @@ -0,0 +1,2396 @@ +/*** + This file is part of PulseAudio. + + Copyright 2011 Wolfson Microelectronics PLC + Author Margarita Olaya + Copyright 2012 Feng Wei , Freescale Ltd. + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . + +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#ifdef HAVE_VALGRIND_MEMCHECK_H +#include +#endif + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "alsa-mixer.h" +#include "alsa-util.h" +#include "alsa-ucm.h" + +#define PA_UCM_PRE_TAG_OUTPUT "[Out] " +#define PA_UCM_PRE_TAG_INPUT "[In] " + +#define PA_UCM_PLAYBACK_PRIORITY_UNSET(device) ((device)->playback_channels && !(device)->playback_priority) +#define PA_UCM_CAPTURE_PRIORITY_UNSET(device) ((device)->capture_channels && !(device)->capture_priority) +#define PA_UCM_DEVICE_PRIORITY_SET(device, priority) \ + do { \ + if (PA_UCM_PLAYBACK_PRIORITY_UNSET(device)) (device)->playback_priority = (priority); \ + if (PA_UCM_CAPTURE_PRIORITY_UNSET(device)) (device)->capture_priority = (priority); \ + } while (0) +#define PA_UCM_IS_MODIFIER_MAPPING(m) ((pa_proplist_gets((m)->proplist, PA_ALSA_PROP_UCM_MODIFIER)) != NULL) + +#ifdef HAVE_ALSA_UCM + +struct ucm_type { + const char *prefix; + pa_device_port_type_t type; +}; + +struct ucm_items { + const char *id; + const char *property; +}; + +struct ucm_info { + const char *id; + unsigned priority; +}; + +static pa_alsa_jack* ucm_get_jack(pa_alsa_ucm_config *ucm, pa_alsa_ucm_device *device); +static void device_set_jack(pa_alsa_ucm_device *device, pa_alsa_jack *jack); +static void device_add_hw_mute_jack(pa_alsa_ucm_device *device, pa_alsa_jack *jack); + +static pa_alsa_ucm_device *verb_find_device(pa_alsa_ucm_verb *verb, const char *device_name); + + +static void ucm_port_data_init(pa_alsa_ucm_port_data *port, pa_alsa_ucm_config *ucm, pa_device_port *core_port, + pa_alsa_ucm_device **devices, unsigned n_devices); +static void ucm_port_data_free(pa_device_port *port); +static void ucm_port_update_available(pa_alsa_ucm_port_data *port); + +static struct ucm_type types[] = { + {"None", PA_DEVICE_PORT_TYPE_UNKNOWN}, + {"Speaker", PA_DEVICE_PORT_TYPE_SPEAKER}, + {"Line", PA_DEVICE_PORT_TYPE_LINE}, + {"Mic", PA_DEVICE_PORT_TYPE_MIC}, + {"Headphones", PA_DEVICE_PORT_TYPE_HEADPHONES}, + {"Headset", PA_DEVICE_PORT_TYPE_HEADSET}, + {"Handset", PA_DEVICE_PORT_TYPE_HANDSET}, + {"Bluetooth", PA_DEVICE_PORT_TYPE_BLUETOOTH}, + {"Earpiece", PA_DEVICE_PORT_TYPE_EARPIECE}, + {"SPDIF", PA_DEVICE_PORT_TYPE_SPDIF}, + {"HDMI", PA_DEVICE_PORT_TYPE_HDMI}, + {NULL, 0} +}; + +static struct ucm_items item[] = { + {"PlaybackPCM", PA_ALSA_PROP_UCM_SINK}, + {"CapturePCM", PA_ALSA_PROP_UCM_SOURCE}, + {"PlaybackCTL", PA_ALSA_PROP_UCM_PLAYBACK_CTL_DEVICE}, + {"PlaybackVolume", PA_ALSA_PROP_UCM_PLAYBACK_VOLUME}, + {"PlaybackSwitch", PA_ALSA_PROP_UCM_PLAYBACK_SWITCH}, + {"PlaybackMixer", PA_ALSA_PROP_UCM_PLAYBACK_MIXER_DEVICE}, + {"PlaybackMixerElem", PA_ALSA_PROP_UCM_PLAYBACK_MIXER_ELEM}, + {"PlaybackMasterElem", PA_ALSA_PROP_UCM_PLAYBACK_MASTER_ELEM}, + {"PlaybackMasterType", PA_ALSA_PROP_UCM_PLAYBACK_MASTER_TYPE}, + {"PlaybackPriority", PA_ALSA_PROP_UCM_PLAYBACK_PRIORITY}, + {"PlaybackRate", PA_ALSA_PROP_UCM_PLAYBACK_RATE}, + {"PlaybackChannels", PA_ALSA_PROP_UCM_PLAYBACK_CHANNELS}, + {"CaptureCTL", PA_ALSA_PROP_UCM_CAPTURE_CTL_DEVICE}, + {"CaptureVolume", PA_ALSA_PROP_UCM_CAPTURE_VOLUME}, + {"CaptureSwitch", PA_ALSA_PROP_UCM_CAPTURE_SWITCH}, + {"CaptureMixer", PA_ALSA_PROP_UCM_CAPTURE_MIXER_DEVICE}, + {"CaptureMixerElem", PA_ALSA_PROP_UCM_CAPTURE_MIXER_ELEM}, + {"CaptureMasterElem", PA_ALSA_PROP_UCM_CAPTURE_MASTER_ELEM}, + {"CaptureMasterType", PA_ALSA_PROP_UCM_CAPTURE_MASTER_TYPE}, + {"CapturePriority", PA_ALSA_PROP_UCM_CAPTURE_PRIORITY}, + {"CaptureRate", PA_ALSA_PROP_UCM_CAPTURE_RATE}, + {"CaptureChannels", PA_ALSA_PROP_UCM_CAPTURE_CHANNELS}, + {"TQ", PA_ALSA_PROP_UCM_QOS}, + {"JackCTL", PA_ALSA_PROP_UCM_JACK_DEVICE}, + {"JackControl", PA_ALSA_PROP_UCM_JACK_CONTROL}, + {"JackHWMute", PA_ALSA_PROP_UCM_JACK_HW_MUTE}, + {NULL, NULL}, +}; + +/* UCM verb info - this should eventually be part of policy manangement */ +static struct ucm_info verb_info[] = { + {SND_USE_CASE_VERB_INACTIVE, 0}, + {SND_USE_CASE_VERB_HIFI, 8000}, + {SND_USE_CASE_VERB_HIFI_LOW_POWER, 7000}, + {SND_USE_CASE_VERB_VOICE, 6000}, + {SND_USE_CASE_VERB_VOICE_LOW_POWER, 5000}, + {SND_USE_CASE_VERB_VOICECALL, 4000}, + {SND_USE_CASE_VERB_IP_VOICECALL, 4000}, + {SND_USE_CASE_VERB_ANALOG_RADIO, 3000}, + {SND_USE_CASE_VERB_DIGITAL_RADIO, 3000}, + {NULL, 0} +}; + +/* UCM device info - should be overwritten by ucm property */ +static struct ucm_info dev_info[] = { + {SND_USE_CASE_DEV_SPEAKER, 100}, + {SND_USE_CASE_DEV_LINE, 100}, + {SND_USE_CASE_DEV_HEADPHONES, 100}, + {SND_USE_CASE_DEV_HEADSET, 300}, + {SND_USE_CASE_DEV_HANDSET, 200}, + {SND_USE_CASE_DEV_BLUETOOTH, 400}, + {SND_USE_CASE_DEV_EARPIECE, 100}, + {SND_USE_CASE_DEV_SPDIF, 100}, + {SND_USE_CASE_DEV_HDMI, 100}, + {SND_USE_CASE_DEV_NONE, 100}, + {NULL, 0} +}; + + +static char *ucm_verb_value( + snd_use_case_mgr_t *uc_mgr, + const char *verb_name, + const char *id) { + + const char *value; + char *_id = pa_sprintf_malloc("=%s//%s", id, verb_name); + int err = snd_use_case_get(uc_mgr, _id, &value); + pa_xfree(_id); + if (err < 0) + return NULL; + pa_log_debug("Got %s for verb %s: %s", id, verb_name, value); + /* Use the cast here to allow free() call without casting for callers. + * The snd_use_case_get() returns mallocated string. + * See the Note: in use-case.h for snd_use_case_get(). + */ + return (char *)value; +} + +static int ucm_device_exists(pa_idxset *idxset, pa_alsa_ucm_device *dev) { + pa_alsa_ucm_device *d; + uint32_t idx; + + PA_IDXSET_FOREACH(d, idxset, idx) + if (d == dev) + return 1; + + return 0; +} + +static void ucm_add_devices_to_idxset( + pa_idxset *idxset, + pa_alsa_ucm_device *me, + pa_alsa_ucm_device *devices, + const char **dev_names, + int n) { + + pa_alsa_ucm_device *d; + + PA_LLIST_FOREACH(d, devices) { + const char *name; + int i; + + if (d == me) + continue; + + name = pa_proplist_gets(d->proplist, PA_ALSA_PROP_UCM_NAME); + + for (i = 0; i < n; i++) + if (pa_streq(dev_names[i], name)) + pa_idxset_put(idxset, d, NULL); + } +} + +/* Split a string into words. Like pa_split_spaces() but handle '' and "". */ +static char *ucm_split_devnames(const char *c, const char **state) { + const char *current = *state ? *state : c; + char h; + size_t l; + + if (!*current || *c == 0) + return NULL; + + current += strspn(current, "\n\r \t"); + h = *current; + if (h == '\'' || h =='"') { + c = ++current; + for (l = 0; *c && *c != h; l++) c++; + if (*c != h) + return NULL; + *state = c + 1; + } else { + l = strcspn(current, "\n\r \t"); + *state = current+l; + } + + return pa_xstrndup(current, l); +} + + +static void ucm_volume_free(pa_alsa_ucm_volume *vol) { + pa_assert(vol); + pa_xfree(vol->mixer_elem); + pa_xfree(vol->master_elem); + pa_xfree(vol->master_type); + pa_xfree(vol); +} + +/* Get the volume identifier */ +static char *ucm_get_mixer_id( + pa_alsa_ucm_device *device, + const char *mprop, + const char *cprop, + const char *cid) +{ +#if SND_LIB_VERSION >= 0x10201 /* alsa-lib-1.2.1+ check */ + snd_ctl_elem_id_t *ctl; + int err; +#endif + const char *value; + char *value2; + int index; + + /* mixer element as first, if it's found, return it without modifications */ + value = pa_proplist_gets(device->proplist, mprop); + if (value) + return pa_xstrdup(value); + /* fallback, get the control element identifier */ + /* and try to do some heuristic to determine the mixer element name */ + value = pa_proplist_gets(device->proplist, cprop); + if (value == NULL) + return NULL; +#if SND_LIB_VERSION >= 0x10201 /* alsa-lib-1.2.1+ check */ + /* The new parser may return also element index. */ + snd_ctl_elem_id_alloca(&ctl); + err = snd_use_case_parse_ctl_elem_id(ctl, cid, value); + if (err < 0) + return NULL; + value = snd_ctl_elem_id_get_name(ctl); + index = snd_ctl_elem_id_get_index(ctl); +#else +#warning "Upgrade to alsa-lib 1.2.1!" + index = 0; +#endif + if (!(value2 = pa_str_strip_suffix(value, " Playback Volume"))) + if (!(value2 = pa_str_strip_suffix(value, " Capture Volume"))) + if (!(value2 = pa_str_strip_suffix(value, " Volume"))) + value2 = pa_xstrdup(value); + if (index > 0) { + char *mix = pa_sprintf_malloc("'%s',%d", value2, index); + pa_xfree(value2); + return mix; + } + return value2; +} + +/* Get the volume identifier */ +static pa_alsa_ucm_volume *ucm_get_mixer_volume( + pa_alsa_ucm_device *device, + const char *mprop, + const char *cprop, + const char *cid, + const char *masterid, + const char *mastertype) +{ + pa_alsa_ucm_volume *vol; + char *mixer_elem; + + mixer_elem = ucm_get_mixer_id(device, mprop, cprop, cid); + if (mixer_elem == NULL) + return NULL; + vol = pa_xnew0(pa_alsa_ucm_volume, 1); + if (vol == NULL) { + pa_xfree(mixer_elem); + return NULL; + } + vol->mixer_elem = mixer_elem; + vol->master_elem = pa_xstrdup(pa_proplist_gets(device->proplist, masterid)); + vol->master_type = pa_xstrdup(pa_proplist_gets(device->proplist, mastertype)); + return vol; +} + +/* Get the ALSA mixer device for the UCM device */ +static const char *get_mixer_device(pa_alsa_ucm_device *dev, bool is_sink) +{ + const char *dev_name; + + if (is_sink) { + dev_name = pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_PLAYBACK_MIXER_DEVICE); + if (!dev_name) + dev_name = pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_PLAYBACK_CTL_DEVICE); + } else { + dev_name = pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_CAPTURE_MIXER_DEVICE); + if (!dev_name) + dev_name = pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_CAPTURE_CTL_DEVICE); + } + return dev_name; +} + +/* Get the ALSA mixer device for the UCM jack */ +static const char *get_jack_mixer_device(pa_alsa_ucm_device *dev, bool is_sink) { + const char *dev_name = pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_JACK_DEVICE); + if (!dev_name) + return get_mixer_device(dev, is_sink); + return dev_name; +} + +/* Create a property list for this ucm device */ +static int ucm_get_device_property( + pa_alsa_ucm_device *device, + snd_use_case_mgr_t *uc_mgr, + pa_alsa_ucm_verb *verb, + const char *device_name) { + + const char *value; + const char **devices; + char *id, *s; + int i; + int err; + uint32_t ui; + int n_confdev, n_suppdev; + pa_alsa_ucm_volume *vol; + + /* determine the device type */ + device->type = PA_DEVICE_PORT_TYPE_UNKNOWN; + id = s = pa_xstrdup(device_name); + while (s && *s && isalpha(*s)) s++; + if (s) + *s = '\0'; + for (i = 0; types[i].prefix; i++) + if (pa_streq(id, types[i].prefix)) { + device->type = types[i].type; + break; + } + pa_xfree(id); + + /* set properties */ + for (i = 0; item[i].id; i++) { + id = pa_sprintf_malloc("%s/%s", item[i].id, device_name); + err = snd_use_case_get(uc_mgr, id, &value); + pa_xfree(id); + if (err < 0) + continue; + + pa_log_debug("Got %s for device %s: %s", item[i].id, device_name, value); + pa_proplist_sets(device->proplist, item[i].property, value); + free((void*)value); + } + + /* get direction and channels */ + value = pa_proplist_gets(device->proplist, PA_ALSA_PROP_UCM_PLAYBACK_CHANNELS); + if (value) { /* output */ + /* get channels */ + if (pa_atou(value, &ui) == 0 && pa_channels_valid(ui)) + device->playback_channels = ui; + else + pa_log("UCM playback channels %s for device %s out of range", value, device_name); + + /* get pcm */ + value = pa_proplist_gets(device->proplist, PA_ALSA_PROP_UCM_SINK); + if (!value) /* take pcm from verb playback default */ + pa_log("UCM playback device %s fetch pcm failed", device_name); + } + + if (pa_proplist_gets(device->proplist, PA_ALSA_PROP_UCM_SINK) && + device->playback_channels == 0) { + pa_log_info("UCM file does not specify 'PlaybackChannels' " + "for device %s, assuming stereo.", device_name); + device->playback_channels = 2; + } + + value = pa_proplist_gets(device->proplist, PA_ALSA_PROP_UCM_CAPTURE_CHANNELS); + if (value) { /* input */ + /* get channels */ + if (pa_atou(value, &ui) == 0 && pa_channels_valid(ui)) + device->capture_channels = ui; + else + pa_log("UCM capture channels %s for device %s out of range", value, device_name); + + /* get pcm */ + value = pa_proplist_gets(device->proplist, PA_ALSA_PROP_UCM_SOURCE); + if (!value) /* take pcm from verb capture default */ + pa_log("UCM capture device %s fetch pcm failed", device_name); + } + + if (pa_proplist_gets(device->proplist, PA_ALSA_PROP_UCM_SOURCE) && + device->capture_channels == 0) { + pa_log_info("UCM file does not specify 'CaptureChannels' " + "for device %s, assuming stereo.", device_name); + device->capture_channels = 2; + } + + /* get rate and priority of device */ + if (device->playback_channels) { /* sink device */ + /* get rate */ + if ((value = pa_proplist_gets(device->proplist, PA_ALSA_PROP_UCM_PLAYBACK_RATE))) { + if (pa_atou(value, &ui) == 0 && pa_sample_rate_valid(ui)) { + pa_log_debug("UCM playback device %s rate %d", device_name, ui); + device->playback_rate = ui; + } else + pa_log_debug("UCM playback device %s has bad rate %s", device_name, value); + } + + value = pa_proplist_gets(device->proplist, PA_ALSA_PROP_UCM_PLAYBACK_PRIORITY); + if (value) { + /* get priority from ucm config */ + if (pa_atou(value, &ui) == 0) + device->playback_priority = ui; + else + pa_log_debug("UCM playback priority %s for device %s error", value, device_name); + } + + vol = ucm_get_mixer_volume(device, + PA_ALSA_PROP_UCM_PLAYBACK_MIXER_ELEM, + PA_ALSA_PROP_UCM_PLAYBACK_VOLUME, + "PlaybackVolume", + PA_ALSA_PROP_UCM_PLAYBACK_MASTER_ELEM, + PA_ALSA_PROP_UCM_PLAYBACK_MASTER_TYPE); + if (vol) + pa_hashmap_put(device->playback_volumes, pa_xstrdup(pa_proplist_gets(verb->proplist, PA_ALSA_PROP_UCM_NAME)), vol); + } + + if (device->capture_channels) { /* source device */ + /* get rate */ + if ((value = pa_proplist_gets(device->proplist, PA_ALSA_PROP_UCM_CAPTURE_RATE))) { + if (pa_atou(value, &ui) == 0 && pa_sample_rate_valid(ui)) { + pa_log_debug("UCM capture device %s rate %d", device_name, ui); + device->capture_rate = ui; + } else + pa_log_debug("UCM capture device %s has bad rate %s", device_name, value); + } + + value = pa_proplist_gets(device->proplist, PA_ALSA_PROP_UCM_CAPTURE_PRIORITY); + if (value) { + /* get priority from ucm config */ + if (pa_atou(value, &ui) == 0) + device->capture_priority = ui; + else + pa_log_debug("UCM capture priority %s for device %s error", value, device_name); + } + + vol = ucm_get_mixer_volume(device, + PA_ALSA_PROP_UCM_CAPTURE_MIXER_ELEM, + PA_ALSA_PROP_UCM_CAPTURE_VOLUME, + "CaptureVolume", + PA_ALSA_PROP_UCM_CAPTURE_MASTER_ELEM, + PA_ALSA_PROP_UCM_CAPTURE_MASTER_TYPE); + if (vol) + pa_hashmap_put(device->capture_volumes, pa_xstrdup(pa_proplist_gets(verb->proplist, PA_ALSA_PROP_UCM_NAME)), vol); + } + + if (PA_UCM_PLAYBACK_PRIORITY_UNSET(device) || PA_UCM_CAPTURE_PRIORITY_UNSET(device)) { + /* get priority from static table */ + for (i = 0; dev_info[i].id; i++) { + if (strcasecmp(dev_info[i].id, device_name) == 0) { + PA_UCM_DEVICE_PRIORITY_SET(device, dev_info[i].priority); + break; + } + } + } + + if (PA_UCM_PLAYBACK_PRIORITY_UNSET(device)) { + /* fall through to default priority */ + device->playback_priority = 100; + } + + if (PA_UCM_CAPTURE_PRIORITY_UNSET(device)) { + /* fall through to default priority */ + device->capture_priority = 100; + } + + id = pa_sprintf_malloc("%s/%s", "_conflictingdevs", device_name); + n_confdev = snd_use_case_get_list(uc_mgr, id, &devices); + pa_xfree(id); + + if (n_confdev <= 0) + pa_log_debug("No %s for device %s", "_conflictingdevs", device_name); + else { + device->conflicting_devices = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + ucm_add_devices_to_idxset(device->conflicting_devices, device, verb->devices, devices, n_confdev); + snd_use_case_free_list(devices, n_confdev); + } + + id = pa_sprintf_malloc("%s/%s", "_supporteddevs", device_name); + n_suppdev = snd_use_case_get_list(uc_mgr, id, &devices); + pa_xfree(id); + + if (n_suppdev <= 0) + pa_log_debug("No %s for device %s", "_supporteddevs", device_name); + else { + device->supported_devices = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + ucm_add_devices_to_idxset(device->supported_devices, device, verb->devices, devices, n_suppdev); + snd_use_case_free_list(devices, n_suppdev); + } + + return 0; +}; + +/* Create a property list for this ucm modifier */ +static int ucm_get_modifier_property(pa_alsa_ucm_modifier *modifier, snd_use_case_mgr_t *uc_mgr, const char *modifier_name) { + const char *value; + char *id; + int i; + + for (i = 0; item[i].id; i++) { + int err; + + id = pa_sprintf_malloc("=%s/%s", item[i].id, modifier_name); + err = snd_use_case_get(uc_mgr, id, &value); + pa_xfree(id); + if (err < 0) + continue; + + pa_log_debug("Got %s for modifier %s: %s", item[i].id, modifier_name, value); + pa_proplist_sets(modifier->proplist, item[i].property, value); + free((void*)value); + } + + id = pa_sprintf_malloc("%s/%s", "_conflictingdevs", modifier_name); + modifier->n_confdev = snd_use_case_get_list(uc_mgr, id, &modifier->conflicting_devices); + pa_xfree(id); + if (modifier->n_confdev < 0) + pa_log_debug("No %s for modifier %s", "_conflictingdevs", modifier_name); + + id = pa_sprintf_malloc("%s/%s", "_supporteddevs", modifier_name); + modifier->n_suppdev = snd_use_case_get_list(uc_mgr, id, &modifier->supported_devices); + pa_xfree(id); + if (modifier->n_suppdev < 0) + pa_log_debug("No %s for modifier %s", "_supporteddevs", modifier_name); + + return 0; +}; + +/* Create a list of devices for this verb */ +static int ucm_get_devices(pa_alsa_ucm_verb *verb, snd_use_case_mgr_t *uc_mgr) { + const char **dev_list; + int num_dev, i; + + num_dev = snd_use_case_get_list(uc_mgr, "_devices", &dev_list); + if (num_dev < 0) + return num_dev; + + for (i = 0; i < num_dev; i += 2) { + pa_alsa_ucm_device *d = pa_xnew0(pa_alsa_ucm_device, 1); + + d->proplist = pa_proplist_new(); + pa_proplist_sets(d->proplist, PA_ALSA_PROP_UCM_NAME, pa_strnull(dev_list[i])); + pa_proplist_sets(d->proplist, PA_ALSA_PROP_UCM_DESCRIPTION, pa_strna(dev_list[i + 1])); + d->ucm_ports = pa_dynarray_new(NULL); + d->hw_mute_jacks = pa_dynarray_new(NULL); + d->available = PA_AVAILABLE_UNKNOWN; + + d->playback_volumes = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, pa_xfree, + (pa_free_cb_t) ucm_volume_free); + d->capture_volumes = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, pa_xfree, + (pa_free_cb_t) ucm_volume_free); + + PA_LLIST_PREPEND(pa_alsa_ucm_device, verb->devices, d); + } + + snd_use_case_free_list(dev_list, num_dev); + + return 0; +}; + +static int ucm_get_modifiers(pa_alsa_ucm_verb *verb, snd_use_case_mgr_t *uc_mgr) { + const char **mod_list; + int num_mod, i; + + num_mod = snd_use_case_get_list(uc_mgr, "_modifiers", &mod_list); + if (num_mod < 0) + return num_mod; + + for (i = 0; i < num_mod; i += 2) { + pa_alsa_ucm_modifier *m; + + if (!mod_list[i]) { + pa_log_warn("Got a modifier with a null name. Skipping."); + continue; + } + + m = pa_xnew0(pa_alsa_ucm_modifier, 1); + m->proplist = pa_proplist_new(); + + pa_proplist_sets(m->proplist, PA_ALSA_PROP_UCM_NAME, mod_list[i]); + pa_proplist_sets(m->proplist, PA_ALSA_PROP_UCM_DESCRIPTION, pa_strna(mod_list[i + 1])); + + PA_LLIST_PREPEND(pa_alsa_ucm_modifier, verb->modifiers, m); + } + + snd_use_case_free_list(mod_list, num_mod); + + return 0; +}; + +static void add_role_to_device(pa_alsa_ucm_device *dev, const char *dev_name, const char *role_name, const char *role) { + const char *cur = pa_proplist_gets(dev->proplist, role_name); + + if (!cur) + pa_proplist_sets(dev->proplist, role_name, role); + else if (!pa_str_in_list_spaces(cur, role)) { /* does not exist */ + char *value = pa_sprintf_malloc("%s %s", cur, role); + + pa_proplist_sets(dev->proplist, role_name, value); + pa_xfree(value); + } + + pa_log_info("Add role %s to device %s(%s), result %s", role, dev_name, role_name, pa_proplist_gets(dev->proplist, + role_name)); +} + +static void add_media_role(const char *name, pa_alsa_ucm_device *list, const char *role_name, const char *role, bool is_sink) { + pa_alsa_ucm_device *d; + + PA_LLIST_FOREACH(d, list) { + const char *dev_name = pa_proplist_gets(d->proplist, PA_ALSA_PROP_UCM_NAME); + + if (pa_streq(dev_name, name)) { + const char *sink = pa_proplist_gets(d->proplist, PA_ALSA_PROP_UCM_SINK); + const char *source = pa_proplist_gets(d->proplist, PA_ALSA_PROP_UCM_SOURCE); + + if (is_sink && sink) + add_role_to_device(d, dev_name, role_name, role); + else if (!is_sink && source) + add_role_to_device(d, dev_name, role_name, role); + break; + } + } +} + +static char *modifier_name_to_role(const char *mod_name, bool *is_sink) { + char *sub = NULL, *tmp; + + *is_sink = false; + + if (pa_startswith(mod_name, "Play")) { + *is_sink = true; + sub = pa_xstrdup(mod_name + 4); + } else if (pa_startswith(mod_name, "Capture")) + sub = pa_xstrdup(mod_name + 7); + + if (!sub || !*sub) { + pa_xfree(sub); + pa_log_warn("Can't match media roles for modifer %s", mod_name); + return NULL; + } + + tmp = sub; + + do { + *tmp = tolower(*tmp); + } while (*(++tmp)); + + return sub; +} + +static void ucm_set_media_roles(pa_alsa_ucm_modifier *modifier, pa_alsa_ucm_device *list, const char *mod_name) { + int i; + bool is_sink = false; + char *sub = NULL; + const char *role_name; + + sub = modifier_name_to_role(mod_name, &is_sink); + if (!sub) + return; + + modifier->action_direction = is_sink ? PA_DIRECTION_OUTPUT : PA_DIRECTION_INPUT; + modifier->media_role = sub; + + role_name = is_sink ? PA_ALSA_PROP_UCM_PLAYBACK_ROLES : PA_ALSA_PROP_UCM_CAPTURE_ROLES; + for (i = 0; i < modifier->n_suppdev; i++) { + /* if modifier has no specific pcm, we add role intent to its supported devices */ + if (!pa_proplist_gets(modifier->proplist, PA_ALSA_PROP_UCM_SINK) && + !pa_proplist_gets(modifier->proplist, PA_ALSA_PROP_UCM_SOURCE)) + add_media_role(modifier->supported_devices[i], list, role_name, sub, is_sink); + } +} + +static void append_lost_relationship(pa_alsa_ucm_device *dev) { + uint32_t idx; + pa_alsa_ucm_device *d; + + if (dev->conflicting_devices) { + PA_IDXSET_FOREACH(d, dev->conflicting_devices, idx) { + if (!d->conflicting_devices) + d->conflicting_devices = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + + if (pa_idxset_put(d->conflicting_devices, dev, NULL) == 0) + pa_log_warn("Add lost conflicting device %s to %s", + pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_NAME), + pa_proplist_gets(d->proplist, PA_ALSA_PROP_UCM_NAME)); + } + } + + if (dev->supported_devices) { + PA_IDXSET_FOREACH(d, dev->supported_devices, idx) { + if (!d->supported_devices) + d->supported_devices = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + + if (pa_idxset_put(d->supported_devices, dev, NULL) == 0) + pa_log_warn("Add lost supported device %s to %s", + pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_NAME), + pa_proplist_gets(d->proplist, PA_ALSA_PROP_UCM_NAME)); + } + } +} + +int pa_alsa_ucm_query_profiles(pa_alsa_ucm_config *ucm, int card_index) { + char *card_name; + const char **verb_list, *value; + int num_verbs, i, err = 0; + + /* support multiple card instances, address card directly by index */ + card_name = pa_sprintf_malloc("hw:%i", card_index); + err = snd_use_case_mgr_open(&ucm->ucm_mgr, card_name); + if (err < 0) { + /* fallback longname: is UCM available for this card ? */ + pa_xfree(card_name); + err = snd_card_get_name(card_index, &card_name); + if (err < 0) { + pa_log("Card can't get card_name from card_index %d", card_index); + err = -PA_ALSA_ERR_UNSPECIFIED; + goto name_fail; + } + + err = snd_use_case_mgr_open(&ucm->ucm_mgr, card_name); + if (err < 0) { + pa_log_info("UCM not available for card %s", card_name); + err = -PA_ALSA_ERR_UCM_OPEN; + goto ucm_mgr_fail; + } + } + + err = snd_use_case_get(ucm->ucm_mgr, "=Linked", &value); + if (err >= 0) { + if (strcasecmp(value, "true") == 0 || strcasecmp(value, "1") == 0) { + free((void *)value); + pa_log_info("Empty (linked) UCM for card %s", card_name); + err = -PA_ALSA_ERR_UCM_LINKED; + goto ucm_verb_fail; + } + free((void *)value); + } + + pa_log_info("UCM available for card %s", card_name); + + /* get a list of all UCM verbs (profiles) for this card */ + num_verbs = snd_use_case_verb_list(ucm->ucm_mgr, &verb_list); + if (num_verbs < 0) { + pa_log("UCM verb list not found for %s", card_name); + err = -PA_ALSA_ERR_UNSPECIFIED; + goto ucm_verb_fail; + } + + /* get the properties of each UCM verb */ + for (i = 0; i < num_verbs; i += 2) { + pa_alsa_ucm_verb *verb; + + /* Get devices and modifiers for each verb */ + err = pa_alsa_ucm_get_verb(ucm->ucm_mgr, verb_list[i], verb_list[i+1], &verb); + if (err < 0) { + pa_log("Failed to get the verb %s", verb_list[i]); + continue; + } + + PA_LLIST_PREPEND(pa_alsa_ucm_verb, ucm->verbs, verb); + } + + if (!ucm->verbs) { + pa_log("No UCM verb is valid for %s", card_name); + err = -PA_ALSA_ERR_UCM_NO_VERB; + } + + snd_use_case_free_list(verb_list, num_verbs); + +ucm_verb_fail: + if (err < 0) { + snd_use_case_mgr_close(ucm->ucm_mgr); + ucm->ucm_mgr = NULL; + } + +ucm_mgr_fail: + pa_xfree(card_name); + +name_fail: + return err; +} + +int pa_alsa_ucm_get_verb(snd_use_case_mgr_t *uc_mgr, const char *verb_name, const char *verb_desc, pa_alsa_ucm_verb **p_verb) { + pa_alsa_ucm_device *d; + pa_alsa_ucm_modifier *mod; + pa_alsa_ucm_verb *verb; + char *value; + unsigned ui; + int err = 0; + + *p_verb = NULL; + pa_log_info("Set UCM verb to %s", verb_name); + err = snd_use_case_set(uc_mgr, "_verb", verb_name); + if (err < 0) + return err; + + verb = pa_xnew0(pa_alsa_ucm_verb, 1); + verb->proplist = pa_proplist_new(); + + pa_proplist_sets(verb->proplist, PA_ALSA_PROP_UCM_NAME, pa_strnull(verb_name)); + pa_proplist_sets(verb->proplist, PA_ALSA_PROP_UCM_DESCRIPTION, pa_strna(verb_desc)); + + value = ucm_verb_value(uc_mgr, verb_name, "Priority"); + if (value && !pa_atou(value, &ui)) + verb->priority = ui > 10000 ? 10000 : ui; + free(value); + + err = ucm_get_devices(verb, uc_mgr); + if (err < 0) + pa_log("No UCM devices for verb %s", verb_name); + + err = ucm_get_modifiers(verb, uc_mgr); + if (err < 0) + pa_log("No UCM modifiers for verb %s", verb_name); + + PA_LLIST_FOREACH(d, verb->devices) { + const char *dev_name = pa_proplist_gets(d->proplist, PA_ALSA_PROP_UCM_NAME); + + /* Devices properties */ + ucm_get_device_property(d, uc_mgr, verb, dev_name); + } + /* make conflicting or supported device mutual */ + PA_LLIST_FOREACH(d, verb->devices) + append_lost_relationship(d); + + PA_LLIST_FOREACH(mod, verb->modifiers) { + const char *mod_name = pa_proplist_gets(mod->proplist, PA_ALSA_PROP_UCM_NAME); + + /* Modifier properties */ + ucm_get_modifier_property(mod, uc_mgr, mod_name); + + /* Set PA_PROP_DEVICE_INTENDED_ROLES property to devices */ + pa_log_debug("Set media roles for verb %s, modifier %s", verb_name, mod_name); + ucm_set_media_roles(mod, verb->devices, mod_name); + } + + *p_verb = verb; + return 0; +} + +static int pa_alsa_ucm_device_cmp(const void *a, const void *b) { + const pa_alsa_ucm_device *d1 = *(pa_alsa_ucm_device **)a; + const pa_alsa_ucm_device *d2 = *(pa_alsa_ucm_device **)b; + + return strcmp(pa_proplist_gets(d1->proplist, PA_ALSA_PROP_UCM_NAME), pa_proplist_gets(d2->proplist, PA_ALSA_PROP_UCM_NAME)); +} + +static void set_eld_devices(pa_hashmap *hash) +{ + pa_device_port *port; + pa_alsa_ucm_port_data *data; + pa_alsa_ucm_device *dev; + const char *eld_mixer_device_name; + void *state; + int idx, eld_device; + + PA_HASHMAP_FOREACH(port, hash, state) { + data = PA_DEVICE_PORT_DATA(port); + eld_mixer_device_name = NULL; + eld_device = -1; + PA_DYNARRAY_FOREACH(dev, data->devices, idx) { + if (dev->eld_device >= 0 && dev->eld_mixer_device_name) { + if (eld_device >= 0 && eld_device != dev->eld_device) { + pa_log_error("The ELD device is already set!"); + } else if (eld_mixer_device_name && pa_streq(dev->eld_mixer_device_name, eld_mixer_device_name)) { + pa_log_error("The ELD mixer device is already set (%s, %s)!", dev->eld_mixer_device_name, dev->eld_mixer_device_name); + } else { + eld_mixer_device_name = dev->eld_mixer_device_name; + eld_device = dev->eld_device; + } + } + } + data->eld_device = eld_device; + data->eld_mixer_device_name = pa_xstrdup(eld_mixer_device_name); + } +} + +static void probe_volumes(pa_hashmap *hash, bool is_sink, snd_pcm_t *pcm_handle, pa_hashmap *mixers, bool ignore_dB) { + pa_device_port *port; + pa_alsa_path *path; + pa_alsa_ucm_port_data *data; + pa_alsa_ucm_device *dev; + snd_mixer_t *mixer_handle; + const char *profile, *mdev, *mdev2; + void *state, *state2; + int idx; + + PA_HASHMAP_FOREACH(port, hash, state) { + data = PA_DEVICE_PORT_DATA(port); + + mdev = NULL; + PA_DYNARRAY_FOREACH(dev, data->devices, idx) { + mdev2 = get_mixer_device(dev, is_sink); + if (mdev && mdev2 && !pa_streq(mdev, mdev2)) { + pa_log_error("Two mixer device names found ('%s', '%s'), using s/w volume", mdev, mdev2); + goto fail; + } + if (mdev2) + mdev = mdev2; + } + + if (mdev == NULL || !(mixer_handle = pa_alsa_open_mixer_by_name(mixers, mdev, true))) { + pa_log_error("Failed to find a working mixer device (%s).", mdev); + goto fail; + } + + PA_HASHMAP_FOREACH_KV(profile, path, data->paths, state2) { + if (pa_alsa_path_probe(path, NULL, mixer_handle, ignore_dB) < 0) { + pa_log_warn("Could not probe path: %s, using s/w volume", data->path->name); + pa_hashmap_remove(data->paths, profile); + } else if (!path->has_volume) { + pa_log_warn("Path %s is not a volume control", data->path->name); + pa_hashmap_remove(data->paths, profile); + } else + pa_log_debug("Set up h/w volume using '%s' for %s:%s", path->name, profile, port->name); + } + } + + return; + +fail: + /* We could not probe the paths we created. Free them and revert to software volumes. */ + PA_HASHMAP_FOREACH(port, hash, state) { + data = PA_DEVICE_PORT_DATA(port); + pa_hashmap_remove_all(data->paths); + } +} + +static void ucm_add_port_combination( + pa_hashmap *hash, + pa_alsa_ucm_mapping_context *context, + bool is_sink, + pa_alsa_ucm_device **pdevices, + int num, + pa_hashmap *ports, + pa_card_profile *cp, + pa_core *core) { + + pa_device_port *port; + int i; + unsigned priority; + double prio2; + char *name, *desc; + const char *dev_name; + const char *direction; + const char *profile; + pa_alsa_ucm_device *sorted[num], *dev; + pa_alsa_ucm_port_data *data; + pa_alsa_ucm_volume *vol; + pa_alsa_jack *jack, *jack2; + pa_device_port_type_t type, type2; + void *state; + + for (i = 0; i < num; i++) + sorted[i] = pdevices[i]; + + /* Sort by alphabetical order so as to have a deterministic naming scheme + * for combination ports */ + qsort(&sorted[0], num, sizeof(pa_alsa_ucm_device *), pa_alsa_ucm_device_cmp); + + dev = sorted[0]; + dev_name = pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_NAME); + + name = pa_sprintf_malloc("%s%s", is_sink ? PA_UCM_PRE_TAG_OUTPUT : PA_UCM_PRE_TAG_INPUT, dev_name); + desc = num == 1 ? pa_xstrdup(pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_DESCRIPTION)) + : pa_sprintf_malloc("Combination port for %s", dev_name); + + priority = is_sink ? dev->playback_priority : dev->capture_priority; + prio2 = (priority == 0 ? 0 : 1.0/priority); + jack = ucm_get_jack(context->ucm, dev); + type = dev->type; + + for (i = 1; i < num; i++) { + char *tmp; + + dev = sorted[i]; + dev_name = pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_NAME); + + tmp = pa_sprintf_malloc("%s+%s", name, dev_name); + pa_xfree(name); + name = tmp; + + tmp = pa_sprintf_malloc("%s,%s", desc, dev_name); + pa_xfree(desc); + desc = tmp; + + priority = is_sink ? dev->playback_priority : dev->capture_priority; + if (priority != 0 && prio2 > 0) + prio2 += 1.0/priority; + + jack2 = ucm_get_jack(context->ucm, dev); + if (jack2) { + if (jack && jack != jack2) + pa_log_warn("Multiple jacks per combined device '%s': '%s' '%s'", name, jack->name, jack2->name); + jack = jack2; + } + + type2 = dev->type; + if (type2 != PA_DEVICE_PORT_TYPE_UNKNOWN) { + if (type != PA_DEVICE_PORT_TYPE_UNKNOWN && type != type2) + pa_log_warn("Multiple device types per combined device '%s': %d %d", name, type, type2); + type = type2; + } + } + + /* Make combination ports always have lower priority, and use the formula + 1/p = 1/p1 + 1/p2 + ... 1/pn. + This way, the result will always be less than the individual components, + yet higher components will lead to higher result. */ + + if (num > 1) + priority = prio2 > 0 ? 1.0/prio2 : 0; + + port = pa_hashmap_get(ports, name); + if (!port) { + pa_device_port_new_data port_data; + + pa_device_port_new_data_init(&port_data); + pa_device_port_new_data_set_name(&port_data, name); + pa_device_port_new_data_set_description(&port_data, desc); + pa_device_port_new_data_set_type(&port_data, type); + pa_device_port_new_data_set_direction(&port_data, is_sink ? PA_DIRECTION_OUTPUT : PA_DIRECTION_INPUT); + if (jack) + pa_device_port_new_data_set_availability_group(&port_data, jack->name); + + port = pa_device_port_new(core, &port_data, sizeof(pa_alsa_ucm_port_data)); + pa_device_port_new_data_done(&port_data); + + data = PA_DEVICE_PORT_DATA(port); + ucm_port_data_init(data, context->ucm, port, pdevices, num); + port->impl_free = ucm_port_data_free; + + pa_hashmap_put(ports, port->name, port); + pa_log_debug("Add port %s: %s", port->name, port->description); + + if (num == 1) { + /* To keep things simple and not worry about stacking controls, we only support hardware volumes on non-combination + * ports. */ + data = PA_DEVICE_PORT_DATA(port); + + PA_HASHMAP_FOREACH_KV(profile, vol, is_sink ? dev->playback_volumes : dev->capture_volumes, state) { + pa_alsa_path *path = pa_alsa_path_synthesize(vol->mixer_elem, + is_sink ? PA_ALSA_DIRECTION_OUTPUT : PA_ALSA_DIRECTION_INPUT); + + if (!path) + pa_log_warn("Failed to set up volume control: %s", vol->mixer_elem); + else { + if (vol->master_elem) { + pa_alsa_element *e = pa_alsa_element_get(path, vol->master_elem, false); + e->switch_use = PA_ALSA_SWITCH_MUTE; + e->volume_use = PA_ALSA_VOLUME_MERGE; + } + + pa_hashmap_put(data->paths, pa_xstrdup(profile), path); + + /* Add path also to already created empty path set */ + dev = sorted[0]; + if (is_sink) + pa_hashmap_put(dev->playback_mapping->output_path_set->paths, pa_xstrdup(vol->mixer_elem), path); + else + pa_hashmap_put(dev->capture_mapping->input_path_set->paths, pa_xstrdup(vol->mixer_elem), path); + } + } + } + } + + port->priority = priority; + + pa_xfree(name); + pa_xfree(desc); + + direction = is_sink ? "output" : "input"; + pa_log_debug("Port %s direction %s, priority %d", port->name, direction, priority); + + if (cp) { + pa_log_debug("Adding profile %s to port %s.", cp->name, port->name); + pa_hashmap_put(port->profiles, cp->name, cp); + } + + if (hash) { + pa_hashmap_put(hash, port->name, port); + pa_device_port_ref(port); + } +} + +static int ucm_port_contains(const char *port_name, const char *dev_name, bool is_sink) { + int ret = 0; + const char *r; + const char *state = NULL; + size_t len; + + if (!port_name || !dev_name) + return false; + + port_name += is_sink ? strlen(PA_UCM_PRE_TAG_OUTPUT) : strlen(PA_UCM_PRE_TAG_INPUT); + + while ((r = pa_split_in_place(port_name, "+", &len, &state))) { + if (strlen(dev_name) == len && !strncmp(r, dev_name, len)) { + ret = 1; + break; + } + } + + return ret; +} + +static int ucm_check_conformance( + pa_alsa_ucm_mapping_context *context, + pa_alsa_ucm_device **pdevices, + int dev_num, + pa_alsa_ucm_device *dev) { + + uint32_t idx; + pa_alsa_ucm_device *d; + int i; + + pa_assert(dev); + + pa_log_debug("Check device %s conformance with %d other devices", + pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_NAME), dev_num); + if (dev_num == 0) { + pa_log_debug("First device in combination, number 1"); + return 1; + } + + if (dev->conflicting_devices) { /* the device defines conflicting devices */ + PA_IDXSET_FOREACH(d, dev->conflicting_devices, idx) { + for (i = 0; i < dev_num; i++) { + if (pdevices[i] == d) { + pa_log_debug("Conflicting device found"); + return 0; + } + } + } + } else if (dev->supported_devices) { /* the device defines supported devices */ + for (i = 0; i < dev_num; i++) { + if (!ucm_device_exists(dev->supported_devices, pdevices[i])) { + pa_log_debug("Supported device not found"); + return 0; + } + } + } else { /* not support any other devices */ + pa_log_debug("Not support any other devices"); + return 0; + } + + pa_log_debug("Device added to combination, number %d", dev_num + 1); + return 1; +} + +static inline pa_alsa_ucm_device *get_next_device(pa_idxset *idxset, uint32_t *idx) { + pa_alsa_ucm_device *dev; + + if (*idx == PA_IDXSET_INVALID) + dev = pa_idxset_first(idxset, idx); + else + dev = pa_idxset_next(idxset, idx); + + return dev; +} + +static void ucm_add_ports_combination( + pa_hashmap *hash, + pa_alsa_ucm_mapping_context *context, + bool is_sink, + pa_alsa_ucm_device **pdevices, + int dev_num, + uint32_t map_index, + pa_hashmap *ports, + pa_card_profile *cp, + pa_core *core) { + + pa_alsa_ucm_device *dev; + uint32_t idx = map_index; + + if ((dev = get_next_device(context->ucm_devices, &idx)) == NULL) + return; + + /* check if device at map_index can combine with existing devices combination */ + if (ucm_check_conformance(context, pdevices, dev_num, dev)) { + /* add device at map_index to devices combination */ + pdevices[dev_num] = dev; + /* add current devices combination as a new port */ + ucm_add_port_combination(hash, context, is_sink, pdevices, dev_num + 1, ports, cp, core); + /* try more elements combination */ + ucm_add_ports_combination(hash, context, is_sink, pdevices, dev_num + 1, idx, ports, cp, core); + } + + /* try other device with current elements number */ + ucm_add_ports_combination(hash, context, is_sink, pdevices, dev_num, idx, ports, cp, core); +} + +static char* merge_roles(const char *cur, const char *add) { + char *r, *ret; + const char *state = NULL; + + if (add == NULL) + return pa_xstrdup(cur); + else if (cur == NULL) + return pa_xstrdup(add); + + ret = pa_xstrdup(cur); + + while ((r = pa_split_spaces(add, &state))) { + char *value; + + if (!pa_str_in_list_spaces(ret, r)) + value = pa_sprintf_malloc("%s %s", ret, r); + else { + pa_xfree(r); + continue; + } + + pa_xfree(ret); + ret = value; + pa_xfree(r); + } + + return ret; +} + +void pa_alsa_ucm_add_ports_combination( + pa_hashmap *p, + pa_alsa_ucm_mapping_context *context, + bool is_sink, + pa_hashmap *ports, + pa_card_profile *cp, + pa_core *core) { + + pa_alsa_ucm_device **pdevices; + + pa_assert(context->ucm_devices); + + if (pa_idxset_size(context->ucm_devices) > 0) { + pdevices = pa_xnew(pa_alsa_ucm_device *, pa_idxset_size(context->ucm_devices)); + ucm_add_ports_combination(p, context, is_sink, pdevices, 0, PA_IDXSET_INVALID, ports, cp, core); + pa_xfree(pdevices); + } + + /* ELD devices */ + set_eld_devices(ports); +} + +void pa_alsa_ucm_add_ports( + pa_hashmap **p, + pa_proplist *proplist, + pa_alsa_ucm_mapping_context *context, + bool is_sink, + pa_card *card, + snd_pcm_t *pcm_handle, + bool ignore_dB) { + + uint32_t idx; + char *merged_roles; + const char *role_name = is_sink ? PA_ALSA_PROP_UCM_PLAYBACK_ROLES : PA_ALSA_PROP_UCM_CAPTURE_ROLES; + pa_alsa_ucm_device *dev; + pa_alsa_ucm_modifier *mod; + char *tmp; + + pa_assert(p); + pa_assert(*p); + + /* add ports first */ + pa_alsa_ucm_add_ports_combination(*p, context, is_sink, card->ports, NULL, card->core); + + /* now set up volume paths if any */ + probe_volumes(*p, is_sink, pcm_handle, context->ucm->mixers, ignore_dB); + + /* then set property PA_PROP_DEVICE_INTENDED_ROLES */ + merged_roles = pa_xstrdup(pa_proplist_gets(proplist, PA_PROP_DEVICE_INTENDED_ROLES)); + PA_IDXSET_FOREACH(dev, context->ucm_devices, idx) { + const char *roles = pa_proplist_gets(dev->proplist, role_name); + tmp = merge_roles(merged_roles, roles); + pa_xfree(merged_roles); + merged_roles = tmp; + } + + if (context->ucm_modifiers) + PA_IDXSET_FOREACH(mod, context->ucm_modifiers, idx) { + tmp = merge_roles(merged_roles, mod->media_role); + pa_xfree(merged_roles); + merged_roles = tmp; + } + + if (merged_roles) + pa_proplist_sets(proplist, PA_PROP_DEVICE_INTENDED_ROLES, merged_roles); + + pa_log_info("ALSA device %s roles: %s", pa_proplist_gets(proplist, PA_PROP_DEVICE_STRING), pa_strnull(merged_roles)); + pa_xfree(merged_roles); +} + +/* Change UCM verb and device to match selected card profile */ +int pa_alsa_ucm_set_profile(pa_alsa_ucm_config *ucm, pa_card *card, const char *new_profile, const char *old_profile) { + int ret = 0; + const char *profile; + pa_alsa_ucm_verb *verb; + pa_device_port *port; + pa_alsa_ucm_port_data *data; + void *state; + + if (new_profile == old_profile) + return ret; + else if (new_profile == NULL || old_profile == NULL) + profile = new_profile ? new_profile : SND_USE_CASE_VERB_INACTIVE; + else if (!pa_streq(new_profile, old_profile)) + profile = new_profile; + else + return ret; + + /* change verb */ + pa_log_info("Set UCM verb to %s", profile); + if ((snd_use_case_set(ucm->ucm_mgr, "_verb", profile)) < 0) { + pa_log("Failed to set verb %s", profile); + ret = -1; + } + + /* find active verb */ + ucm->active_verb = NULL; + PA_LLIST_FOREACH(verb, ucm->verbs) { + const char *verb_name; + verb_name = pa_proplist_gets(verb->proplist, PA_ALSA_PROP_UCM_NAME); + if (pa_streq(verb_name, profile)) { + ucm->active_verb = verb; + break; + } + } + + /* select volume controls on ports */ + PA_HASHMAP_FOREACH(port, card->ports, state) { + data = PA_DEVICE_PORT_DATA(port); + data->path = pa_hashmap_get(data->paths, profile); + } + + return ret; +} + +int pa_alsa_ucm_set_port(pa_alsa_ucm_mapping_context *context, pa_device_port *port, bool is_sink) { + int i; + int ret = 0; + pa_alsa_ucm_config *ucm; + const char **enable_devs; + int enable_num = 0; + uint32_t idx; + pa_alsa_ucm_device *dev; + + pa_assert(context && context->ucm); + + ucm = context->ucm; + pa_assert(ucm->ucm_mgr); + + enable_devs = pa_xnew(const char *, pa_idxset_size(context->ucm_devices)); + + /* first disable then enable */ + PA_IDXSET_FOREACH(dev, context->ucm_devices, idx) { + const char *dev_name = pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_NAME); + + if (ucm_port_contains(port->name, dev_name, is_sink)) + enable_devs[enable_num++] = dev_name; + else { + pa_log_debug("Disable ucm device %s", dev_name); + if (snd_use_case_set(ucm->ucm_mgr, "_disdev", dev_name) > 0) { + pa_log("Failed to disable ucm device %s", dev_name); + ret = -1; + break; + } + } + } + + for (i = 0; i < enable_num; i++) { + pa_log_debug("Enable ucm device %s", enable_devs[i]); + if (snd_use_case_set(ucm->ucm_mgr, "_enadev", enable_devs[i]) < 0) { + pa_log("Failed to enable ucm device %s", enable_devs[i]); + ret = -1; + break; + } + } + + pa_xfree(enable_devs); + + return ret; +} + +static void ucm_add_mapping(pa_alsa_profile *p, pa_alsa_mapping *m) { + + pa_alsa_path_set *ps; + + /* create empty path set for the future path additions */ + ps = pa_xnew0(pa_alsa_path_set, 1); + ps->direction = m->direction; + ps->paths = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + + switch (m->direction) { + case PA_ALSA_DIRECTION_ANY: + pa_idxset_put(p->output_mappings, m, NULL); + pa_idxset_put(p->input_mappings, m, NULL); + m->output_path_set = ps; + m->input_path_set = ps; + break; + case PA_ALSA_DIRECTION_OUTPUT: + pa_idxset_put(p->output_mappings, m, NULL); + m->output_path_set = ps; + break; + case PA_ALSA_DIRECTION_INPUT: + pa_idxset_put(p->input_mappings, m, NULL); + m->input_path_set = ps; + break; + } +} + +static void alsa_mapping_add_ucm_device(pa_alsa_mapping *m, pa_alsa_ucm_device *device) { + char *cur_desc; + const char *new_desc, *mdev; + bool is_sink = m->direction == PA_ALSA_DIRECTION_OUTPUT; + + pa_idxset_put(m->ucm_context.ucm_devices, device, NULL); + + new_desc = pa_proplist_gets(device->proplist, PA_ALSA_PROP_UCM_DESCRIPTION); + cur_desc = m->description; + if (cur_desc) + m->description = pa_sprintf_malloc("%s + %s", cur_desc, new_desc); + else + m->description = pa_xstrdup(new_desc); + pa_xfree(cur_desc); + + /* walk around null case */ + m->description = m->description ? m->description : pa_xstrdup(""); + + /* save mapping to ucm device */ + if (is_sink) + device->playback_mapping = m; + else + device->capture_mapping = m; + + mdev = get_mixer_device(device, is_sink); + if (mdev) + pa_proplist_sets(m->proplist, "alsa.mixer_device", mdev); +} + +static void alsa_mapping_add_ucm_modifier(pa_alsa_mapping *m, pa_alsa_ucm_modifier *modifier) { + char *cur_desc; + const char *new_desc, *mod_name, *channel_str; + uint32_t channels = 0; + + pa_idxset_put(m->ucm_context.ucm_modifiers, modifier, NULL); + + new_desc = pa_proplist_gets(modifier->proplist, PA_ALSA_PROP_UCM_DESCRIPTION); + cur_desc = m->description; + if (cur_desc) + m->description = pa_sprintf_malloc("%s + %s", cur_desc, new_desc); + else + m->description = pa_xstrdup(new_desc); + pa_xfree(cur_desc); + + m->description = m->description ? m->description : pa_xstrdup(""); + + /* Modifier sinks should not be routed to by default */ + m->priority = 0; + + mod_name = pa_proplist_gets(modifier->proplist, PA_ALSA_PROP_UCM_NAME); + pa_proplist_sets(m->proplist, PA_ALSA_PROP_UCM_MODIFIER, mod_name); + + /* save mapping to ucm modifier */ + if (m->direction == PA_ALSA_DIRECTION_OUTPUT) { + modifier->playback_mapping = m; + channel_str = pa_proplist_gets(modifier->proplist, PA_ALSA_PROP_UCM_PLAYBACK_CHANNELS); + } else { + modifier->capture_mapping = m; + channel_str = pa_proplist_gets(modifier->proplist, PA_ALSA_PROP_UCM_CAPTURE_CHANNELS); + } + + if (channel_str) { + /* FIXME: channel_str is unsanitized input from the UCM configuration, + * we should do proper error handling instead of asserting. + * https://bugs.freedesktop.org/show_bug.cgi?id=71823 */ + pa_assert_se(pa_atou(channel_str, &channels) == 0 && pa_channels_valid(channels)); + pa_log_debug("Got channel count %" PRIu32 " for modifier", channels); + } + + if (channels) + pa_channel_map_init_extend(&m->channel_map, channels, PA_CHANNEL_MAP_ALSA); + else + pa_channel_map_init(&m->channel_map); +} + +static int ucm_create_mapping_direction( + pa_alsa_ucm_config *ucm, + pa_alsa_profile_set *ps, + pa_alsa_profile *p, + pa_alsa_ucm_device *device, + const char *verb_name, + const char *device_name, + const char *device_str, + bool is_sink) { + + pa_alsa_mapping *m; + char *mapping_name; + unsigned priority, rate, channels; + + mapping_name = pa_sprintf_malloc("Mapping %s: %s: %s", verb_name, device_str, is_sink ? "sink" : "source"); + + m = pa_alsa_mapping_get(ps, mapping_name); + if (!m) { + pa_log("No mapping for %s", mapping_name); + pa_xfree(mapping_name); + return -1; + } + pa_log_debug("UCM mapping: %s dev %s", mapping_name, device_name); + pa_xfree(mapping_name); + + priority = is_sink ? device->playback_priority : device->capture_priority; + rate = is_sink ? device->playback_rate : device->capture_rate; + channels = is_sink ? device->playback_channels : device->capture_channels; + + if (!m->ucm_context.ucm_devices) { /* new mapping */ + m->ucm_context.ucm_devices = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + m->ucm_context.ucm = ucm; + m->ucm_context.direction = is_sink ? PA_DIRECTION_OUTPUT : PA_DIRECTION_INPUT; + + m->device_strings = pa_xnew0(char*, 2); + m->device_strings[0] = pa_xstrdup(device_str); + m->direction = is_sink ? PA_ALSA_DIRECTION_OUTPUT : PA_ALSA_DIRECTION_INPUT; + + ucm_add_mapping(p, m); + if (rate) + m->sample_spec.rate = rate; + pa_channel_map_init_extend(&m->channel_map, channels, PA_CHANNEL_MAP_ALSA); + } + + /* mapping priority is the highest one of ucm devices */ + if (priority > m->priority) + m->priority = priority; + + /* mapping channels is the lowest one of ucm devices */ + if (channels < m->channel_map.channels) + pa_channel_map_init_extend(&m->channel_map, channels, PA_CHANNEL_MAP_ALSA); + + alsa_mapping_add_ucm_device(m, device); + + return 0; +} + +static int ucm_create_mapping_for_modifier( + pa_alsa_ucm_config *ucm, + pa_alsa_profile_set *ps, + pa_alsa_profile *p, + pa_alsa_ucm_modifier *modifier, + const char *verb_name, + const char *mod_name, + const char *device_str, + bool is_sink) { + + pa_alsa_mapping *m; + char *mapping_name; + + mapping_name = pa_sprintf_malloc("Mapping %s: %s: %s", verb_name, device_str, is_sink ? "sink" : "source"); + + m = pa_alsa_mapping_get(ps, mapping_name); + if (!m) { + pa_log("no mapping for %s", mapping_name); + pa_xfree(mapping_name); + return -1; + } + pa_log_info("ucm mapping: %s modifier %s", mapping_name, mod_name); + pa_xfree(mapping_name); + + if (!m->ucm_context.ucm_devices && !m->ucm_context.ucm_modifiers) { /* new mapping */ + m->ucm_context.ucm_devices = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + m->ucm_context.ucm_modifiers = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + m->ucm_context.ucm = ucm; + m->ucm_context.direction = is_sink ? PA_DIRECTION_OUTPUT : PA_DIRECTION_INPUT; + + m->device_strings = pa_xnew0(char*, 2); + m->device_strings[0] = pa_xstrdup(device_str); + m->direction = is_sink ? PA_ALSA_DIRECTION_OUTPUT : PA_ALSA_DIRECTION_INPUT; + /* Modifier sinks should not be routed to by default */ + m->priority = 0; + + ucm_add_mapping(p, m); + } else if (!m->ucm_context.ucm_modifiers) /* share pcm with device */ + m->ucm_context.ucm_modifiers = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + + alsa_mapping_add_ucm_modifier(m, modifier); + + return 0; +} + +static int ucm_create_mapping( + pa_alsa_ucm_config *ucm, + pa_alsa_profile_set *ps, + pa_alsa_profile *p, + pa_alsa_ucm_device *device, + const char *verb_name, + const char *device_name, + const char *sink, + const char *source) { + + int ret = 0; + + if (!sink && !source) { + pa_log("No sink and source at %s: %s", verb_name, device_name); + return -1; + } + + if (sink) + ret = ucm_create_mapping_direction(ucm, ps, p, device, verb_name, device_name, sink, true); + if (ret == 0 && source) + ret = ucm_create_mapping_direction(ucm, ps, p, device, verb_name, device_name, source, false); + + return ret; +} + +static pa_alsa_jack* ucm_get_jack(pa_alsa_ucm_config *ucm, pa_alsa_ucm_device *device) { + pa_alsa_jack *j; + const char *device_name; + const char *jack_control; + const char *mixer_device_name; + char *name; + + pa_assert(ucm); + pa_assert(device); + + device_name = pa_proplist_gets(device->proplist, PA_ALSA_PROP_UCM_NAME); + + jack_control = pa_proplist_gets(device->proplist, PA_ALSA_PROP_UCM_JACK_CONTROL); + if (jack_control) { +#if SND_LIB_VERSION >= 0x10201 + snd_ctl_elem_id_t *ctl; + int err, index; + snd_ctl_elem_id_alloca(&ctl); + err = snd_use_case_parse_ctl_elem_id(ctl, "JackControl", jack_control); + if (err < 0) + return NULL; + jack_control = snd_ctl_elem_id_get_name(ctl); + index = snd_ctl_elem_id_get_index(ctl); + if (index > 0) { + pa_log("[%s] Invalid JackControl index value: \"%s\",%d", device_name, jack_control, index); + return NULL; + } +#else +#warning "Upgrade to alsa-lib 1.2.1!" +#endif + if (!pa_endswith(jack_control, " Jack")) { + pa_log("[%s] Invalid JackControl value: \"%s\"", device_name, jack_control); + return NULL; + } + + /* pa_alsa_jack_new() expects a jack name without " Jack" at the + * end, so drop the trailing " Jack". */ + name = pa_xstrndup(jack_control, strlen(jack_control) - 5); + } else { + /* The jack control hasn't been explicitly configured, fail. */ + return NULL; + } + + PA_LLIST_FOREACH(j, ucm->jacks) + if (pa_streq(j->name, name)) + goto finish; + + mixer_device_name = get_jack_mixer_device(device, true); + if (!mixer_device_name) + mixer_device_name = get_jack_mixer_device(device, false); + if (!mixer_device_name) { + pa_log("[%s] No mixer device name for JackControl \"%s\"", device_name, jack_control); + return NULL; + } + j = pa_alsa_jack_new(NULL, mixer_device_name, name, 0); + PA_LLIST_PREPEND(pa_alsa_jack, ucm->jacks, j); + +finish: + pa_xfree(name); + + return j; +} + +static int ucm_create_profile( + pa_alsa_ucm_config *ucm, + pa_alsa_profile_set *ps, + pa_alsa_ucm_verb *verb, + const char *verb_name, + const char *verb_desc) { + + pa_alsa_profile *p; + pa_alsa_ucm_device *dev; + pa_alsa_ucm_modifier *mod; + int i = 0; + const char *name, *sink, *source; + unsigned int priority; + + pa_assert(ps); + + if (pa_hashmap_get(ps->profiles, verb_name)) { + pa_log("Verb %s already exists", verb_name); + return -1; + } + + p = pa_xnew0(pa_alsa_profile, 1); + p->profile_set = ps; + p->name = pa_xstrdup(verb_name); + p->description = pa_xstrdup(verb_desc); + + p->output_mappings = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + p->input_mappings = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + + p->supported = true; + pa_hashmap_put(ps->profiles, p->name, p); + + /* TODO: get profile priority from policy management */ + priority = verb->priority; + + if (priority == 0) { + char *verb_cmp, *c; + c = verb_cmp = pa_xstrdup(verb_name); + while (*c) { + if (*c == '_') *c = ' '; + c++; + } + for (i = 0; verb_info[i].id; i++) { + if (strcasecmp(verb_info[i].id, verb_cmp) == 0) { + priority = verb_info[i].priority; + break; + } + } + pa_xfree(verb_cmp); + } + + p->priority = priority; + + PA_LLIST_FOREACH(dev, verb->devices) { + pa_alsa_jack *jack; + const char *jack_hw_mute; + + name = pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_NAME); + + sink = pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_SINK); + source = pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_SOURCE); + + ucm_create_mapping(ucm, ps, p, dev, verb_name, name, sink, source); + + jack = ucm_get_jack(ucm, dev); + if (jack) + device_set_jack(dev, jack); + + /* JackHWMute contains a list of device names. Each listed device must + * be associated with the jack object that we just created. */ + jack_hw_mute = pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_JACK_HW_MUTE); + if (jack_hw_mute && !jack) { + pa_log("[%s] JackHWMute set, but JackControl is missing", name); + jack_hw_mute = NULL; + } + if (jack_hw_mute) { + char *hw_mute_device_name; + const char *state = NULL; + + while ((hw_mute_device_name = ucm_split_devnames(jack_hw_mute, &state))) { + pa_alsa_ucm_verb *verb2; + bool device_found = false; + + /* Search the referenced device from all verbs. If there are + * multiple verbs that have a device with this name, we add the + * hw mute association to each of those devices. */ + PA_LLIST_FOREACH(verb2, ucm->verbs) { + pa_alsa_ucm_device *hw_mute_device; + + hw_mute_device = verb_find_device(verb2, hw_mute_device_name); + if (hw_mute_device) { + device_found = true; + device_add_hw_mute_jack(hw_mute_device, jack); + } + } + + if (!device_found) + pa_log("[%s] JackHWMute references an unknown device: %s", name, hw_mute_device_name); + + pa_xfree(hw_mute_device_name); + } + } + } + + /* Now find modifiers that have their own PlaybackPCM and create + * separate sinks for them. */ + PA_LLIST_FOREACH(mod, verb->modifiers) { + name = pa_proplist_gets(mod->proplist, PA_ALSA_PROP_UCM_NAME); + + sink = pa_proplist_gets(mod->proplist, PA_ALSA_PROP_UCM_SINK); + source = pa_proplist_gets(mod->proplist, PA_ALSA_PROP_UCM_SOURCE); + + if (sink) + ucm_create_mapping_for_modifier(ucm, ps, p, mod, verb_name, name, sink, true); + else if (source) + ucm_create_mapping_for_modifier(ucm, ps, p, mod, verb_name, name, source, false); + } + + pa_alsa_profile_dump(p); + + return 0; +} + +static void mapping_init_eld(pa_alsa_mapping *m, snd_pcm_t *pcm) +{ + pa_alsa_ucm_mapping_context *context = &m->ucm_context; + pa_alsa_ucm_device *dev; + uint32_t idx; + char *mdev; + snd_pcm_info_t *info; + int pcm_card, pcm_device; + + snd_pcm_info_alloca(&info); + if (snd_pcm_info(pcm, info) < 0) + return; + + if ((pcm_card = snd_pcm_info_get_card(info)) < 0) + return; + if ((pcm_device = snd_pcm_info_get_device(info)) < 0) + return; + + PA_IDXSET_FOREACH(dev, context->ucm_devices, idx) { + mdev = pa_sprintf_malloc("hw:%i", pcm_card); + if (mdev == NULL) + continue; + dev->eld_mixer_device_name = mdev; + dev->eld_device = pcm_device; + } +} + +static snd_pcm_t* mapping_open_pcm(pa_alsa_ucm_config *ucm, pa_alsa_mapping *m, int mode) { + snd_pcm_t* pcm; + pa_sample_spec try_ss = ucm->core->default_sample_spec; + pa_channel_map try_map; + snd_pcm_uframes_t try_period_size, try_buffer_size; + bool exact_channels = m->channel_map.channels > 0; + + if (exact_channels) { + try_map = m->channel_map; + try_ss.channels = try_map.channels; + } else + pa_channel_map_init_extend(&try_map, try_ss.channels, PA_CHANNEL_MAP_ALSA); + + try_period_size = + pa_usec_to_bytes(ucm->core->default_fragment_size_msec * PA_USEC_PER_MSEC, &try_ss) / + pa_frame_size(&try_ss); + try_buffer_size = ucm->core->default_n_fragments * try_period_size; + + pcm = pa_alsa_open_by_device_string(m->device_strings[0], NULL, &try_ss, + &try_map, mode, &try_period_size, &try_buffer_size, 0, NULL, NULL, exact_channels); + + if (pcm) { + if (!exact_channels) + m->channel_map = try_map; + mapping_init_eld(m, pcm); + } + + return pcm; +} + +static void profile_finalize_probing(pa_alsa_profile *p) { + pa_alsa_mapping *m; + uint32_t idx; + + PA_IDXSET_FOREACH(m, p->output_mappings, idx) { + if (p->supported) + m->supported++; + + if (!m->output_pcm) + continue; + + snd_pcm_close(m->output_pcm); + m->output_pcm = NULL; + } + + PA_IDXSET_FOREACH(m, p->input_mappings, idx) { + if (p->supported) + m->supported++; + + if (!m->input_pcm) + continue; + + snd_pcm_close(m->input_pcm); + m->input_pcm = NULL; + } +} + +static void ucm_mapping_jack_probe(pa_alsa_mapping *m, pa_hashmap *mixers) { + snd_mixer_t *mixer_handle; + pa_alsa_ucm_mapping_context *context = &m->ucm_context; + pa_alsa_ucm_device *dev; + uint32_t idx; + + PA_IDXSET_FOREACH(dev, context->ucm_devices, idx) { + bool has_control; + + if (!dev->jack || !dev->jack->mixer_device_name) + continue; + + mixer_handle = pa_alsa_open_mixer_by_name(mixers, dev->jack->mixer_device_name, true); + if (!mixer_handle) { + pa_log_error("Unable to determine open mixer device '%s' for jack %s", dev->jack->mixer_device_name, dev->jack->name); + continue; + } + + has_control = pa_alsa_mixer_find_card(mixer_handle, &dev->jack->alsa_id, 0) != NULL; + pa_alsa_jack_set_has_control(dev->jack, has_control); + pa_log_info("UCM jack %s has_control=%d", dev->jack->name, dev->jack->has_control); + } +} + +static void ucm_probe_profile_set(pa_alsa_ucm_config *ucm, pa_alsa_profile_set *ps) { + void *state; + pa_alsa_profile *p; + pa_alsa_mapping *m; + uint32_t idx; + + PA_HASHMAP_FOREACH(p, ps->profiles, state) { + /* change verb */ + pa_log_info("Set ucm verb to %s", p->name); + + if ((snd_use_case_set(ucm->ucm_mgr, "_verb", p->name)) < 0) { + pa_log("Failed to set verb %s", p->name); + p->supported = false; + continue; + } + + PA_IDXSET_FOREACH(m, p->output_mappings, idx) { + if (PA_UCM_IS_MODIFIER_MAPPING(m)) { + /* Skip jack probing on modifier PCMs since we expect this to + * only be controlled on the main device/verb PCM. */ + continue; + } + + m->output_pcm = mapping_open_pcm(ucm, m, SND_PCM_STREAM_PLAYBACK); + if (!m->output_pcm) { + p->supported = false; + break; + } + } + + if (p->supported) { + PA_IDXSET_FOREACH(m, p->input_mappings, idx) { + if (PA_UCM_IS_MODIFIER_MAPPING(m)) { + /* Skip jack probing on modifier PCMs since we expect this to + * only be controlled on the main device/verb PCM. */ + continue; + } + + m->input_pcm = mapping_open_pcm(ucm, m, SND_PCM_STREAM_CAPTURE); + if (!m->input_pcm) { + p->supported = false; + break; + } + } + } + + if (!p->supported) { + profile_finalize_probing(p); + continue; + } + + pa_log_debug("Profile %s supported.", p->name); + + PA_IDXSET_FOREACH(m, p->output_mappings, idx) + if (!PA_UCM_IS_MODIFIER_MAPPING(m)) + ucm_mapping_jack_probe(m, ucm->mixers); + + PA_IDXSET_FOREACH(m, p->input_mappings, idx) + if (!PA_UCM_IS_MODIFIER_MAPPING(m)) + ucm_mapping_jack_probe(m, ucm->mixers); + + profile_finalize_probing(p); + } + + /* restore ucm state */ + snd_use_case_set(ucm->ucm_mgr, "_verb", SND_USE_CASE_VERB_INACTIVE); + + pa_alsa_profile_set_drop_unsupported(ps); +} + +pa_alsa_profile_set* pa_alsa_ucm_add_profile_set(pa_alsa_ucm_config *ucm, pa_channel_map *default_channel_map) { + pa_alsa_ucm_verb *verb; + pa_alsa_profile_set *ps; + + ps = pa_xnew0(pa_alsa_profile_set, 1); + ps->mappings = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + ps->profiles = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + ps->decibel_fixes = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + + /* create a profile for each verb */ + PA_LLIST_FOREACH(verb, ucm->verbs) { + const char *verb_name; + const char *verb_desc; + + verb_name = pa_proplist_gets(verb->proplist, PA_ALSA_PROP_UCM_NAME); + verb_desc = pa_proplist_gets(verb->proplist, PA_ALSA_PROP_UCM_DESCRIPTION); + if (verb_name == NULL) { + pa_log("Verb with no name"); + continue; + } + + ucm_create_profile(ucm, ps, verb, verb_name, verb_desc); + } + + ucm_probe_profile_set(ucm, ps); + ps->probed = true; + + return ps; +} + +static void free_verb(pa_alsa_ucm_verb *verb) { + pa_alsa_ucm_device *di, *dn; + pa_alsa_ucm_modifier *mi, *mn; + + PA_LLIST_FOREACH_SAFE(di, dn, verb->devices) { + PA_LLIST_REMOVE(pa_alsa_ucm_device, verb->devices, di); + + if (di->hw_mute_jacks) + pa_dynarray_free(di->hw_mute_jacks); + + if (di->ucm_ports) + pa_dynarray_free(di->ucm_ports); + + if (di->playback_volumes) + pa_hashmap_free(di->playback_volumes); + if (di->capture_volumes) + pa_hashmap_free(di->capture_volumes); + + pa_proplist_free(di->proplist); + + if (di->conflicting_devices) + pa_idxset_free(di->conflicting_devices, NULL); + if (di->supported_devices) + pa_idxset_free(di->supported_devices, NULL); + + pa_xfree(di->eld_mixer_device_name); + + pa_xfree(di); + } + + PA_LLIST_FOREACH_SAFE(mi, mn, verb->modifiers) { + PA_LLIST_REMOVE(pa_alsa_ucm_modifier, verb->modifiers, mi); + pa_proplist_free(mi->proplist); + if (mi->n_suppdev > 0) + snd_use_case_free_list(mi->supported_devices, mi->n_suppdev); + if (mi->n_confdev > 0) + snd_use_case_free_list(mi->conflicting_devices, mi->n_confdev); + pa_xfree(mi->media_role); + pa_xfree(mi); + } + pa_proplist_free(verb->proplist); + pa_xfree(verb); +} + +static pa_alsa_ucm_device *verb_find_device(pa_alsa_ucm_verb *verb, const char *device_name) { + pa_alsa_ucm_device *device; + + pa_assert(verb); + pa_assert(device_name); + + PA_LLIST_FOREACH(device, verb->devices) { + const char *name; + + name = pa_proplist_gets(device->proplist, PA_ALSA_PROP_UCM_NAME); + if (pa_streq(name, device_name)) + return device; + } + + return NULL; +} + +void pa_alsa_ucm_free(pa_alsa_ucm_config *ucm) { + pa_alsa_ucm_verb *vi, *vn; + pa_alsa_jack *ji, *jn; + + PA_LLIST_FOREACH_SAFE(vi, vn, ucm->verbs) { + PA_LLIST_REMOVE(pa_alsa_ucm_verb, ucm->verbs, vi); + free_verb(vi); + } + PA_LLIST_FOREACH_SAFE(ji, jn, ucm->jacks) { + PA_LLIST_REMOVE(pa_alsa_jack, ucm->jacks, ji); + pa_alsa_jack_free(ji); + } + if (ucm->ucm_mgr) { + snd_use_case_mgr_close(ucm->ucm_mgr); + ucm->ucm_mgr = NULL; + } +} + +void pa_alsa_ucm_mapping_context_free(pa_alsa_ucm_mapping_context *context) { + pa_alsa_ucm_device *dev; + pa_alsa_ucm_modifier *mod; + uint32_t idx; + + if (context->ucm_devices) { + /* clear ucm device pointer to mapping */ + PA_IDXSET_FOREACH(dev, context->ucm_devices, idx) { + if (context->direction == PA_DIRECTION_OUTPUT) + dev->playback_mapping = NULL; + else + dev->capture_mapping = NULL; + } + + pa_idxset_free(context->ucm_devices, NULL); + } + + if (context->ucm_modifiers) { + PA_IDXSET_FOREACH(mod, context->ucm_modifiers, idx) { + if (context->direction == PA_DIRECTION_OUTPUT) + mod->playback_mapping = NULL; + else + mod->capture_mapping = NULL; + } + + pa_idxset_free(context->ucm_modifiers, NULL); + } +} + +/* Enable the modifier when the first stream with matched role starts */ +void pa_alsa_ucm_roled_stream_begin(pa_alsa_ucm_config *ucm, const char *role, pa_direction_t dir) { + pa_alsa_ucm_modifier *mod; + + if (!ucm->active_verb) + return; + + PA_LLIST_FOREACH(mod, ucm->active_verb->modifiers) { + if ((mod->action_direction == dir) && (pa_streq(mod->media_role, role))) { + if (mod->enabled_counter == 0) { + const char *mod_name = pa_proplist_gets(mod->proplist, PA_ALSA_PROP_UCM_NAME); + + pa_log_info("Enable ucm modifier %s", mod_name); + if (snd_use_case_set(ucm->ucm_mgr, "_enamod", mod_name) < 0) { + pa_log("Failed to enable ucm modifier %s", mod_name); + } + } + + mod->enabled_counter++; + break; + } + } +} + +/* Disable the modifier when the last stream with matched role ends */ +void pa_alsa_ucm_roled_stream_end(pa_alsa_ucm_config *ucm, const char *role, pa_direction_t dir) { + pa_alsa_ucm_modifier *mod; + + if (!ucm->active_verb) + return; + + PA_LLIST_FOREACH(mod, ucm->active_verb->modifiers) { + if ((mod->action_direction == dir) && (pa_streq(mod->media_role, role))) { + + mod->enabled_counter--; + if (mod->enabled_counter == 0) { + const char *mod_name = pa_proplist_gets(mod->proplist, PA_ALSA_PROP_UCM_NAME); + + pa_log_info("Disable ucm modifier %s", mod_name); + if (snd_use_case_set(ucm->ucm_mgr, "_dismod", mod_name) < 0) { + pa_log("Failed to disable ucm modifier %s", mod_name); + } + } + + break; + } + } +} + +static void device_add_ucm_port(pa_alsa_ucm_device *device, pa_alsa_ucm_port_data *port) { + pa_assert(device); + pa_assert(port); + + pa_dynarray_append(device->ucm_ports, port); +} + +static void device_set_jack(pa_alsa_ucm_device *device, pa_alsa_jack *jack) { + pa_assert(device); + pa_assert(jack); + + device->jack = jack; + pa_alsa_jack_add_ucm_device(jack, device); + + pa_alsa_ucm_device_update_available(device); +} + +static void device_add_hw_mute_jack(pa_alsa_ucm_device *device, pa_alsa_jack *jack) { + pa_assert(device); + pa_assert(jack); + + pa_dynarray_append(device->hw_mute_jacks, jack); + pa_alsa_jack_add_ucm_hw_mute_device(jack, device); + + pa_alsa_ucm_device_update_available(device); +} + +static void device_set_available(pa_alsa_ucm_device *device, pa_available_t available) { + pa_alsa_ucm_port_data *port; + unsigned idx; + + pa_assert(device); + + if (available == device->available) + return; + + device->available = available; + + PA_DYNARRAY_FOREACH(port, device->ucm_ports, idx) + ucm_port_update_available(port); +} + +void pa_alsa_ucm_device_update_available(pa_alsa_ucm_device *device) { + pa_available_t available = PA_AVAILABLE_UNKNOWN; + pa_alsa_jack *jack; + unsigned idx; + + pa_assert(device); + + if (device->jack && device->jack->has_control) + available = device->jack->plugged_in ? PA_AVAILABLE_YES : PA_AVAILABLE_NO; + + PA_DYNARRAY_FOREACH(jack, device->hw_mute_jacks, idx) { + if (jack->plugged_in) { + available = PA_AVAILABLE_NO; + break; + } + } + + device_set_available(device, available); +} + +static void ucm_port_data_init(pa_alsa_ucm_port_data *port, pa_alsa_ucm_config *ucm, pa_device_port *core_port, + pa_alsa_ucm_device **devices, unsigned n_devices) { + unsigned i; + + pa_assert(ucm); + pa_assert(core_port); + pa_assert(devices); + + port->ucm = ucm; + port->core_port = core_port; + port->devices = pa_dynarray_new(NULL); + port->eld_device = -1; + + for (i = 0; i < n_devices; i++) { + pa_dynarray_append(port->devices, devices[i]); + device_add_ucm_port(devices[i], port); + } + + port->paths = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, pa_xfree, + (pa_free_cb_t) pa_alsa_path_free); + + ucm_port_update_available(port); +} + +static void ucm_port_data_free(pa_device_port *port) { + pa_alsa_ucm_port_data *ucm_port; + + pa_assert(port); + + ucm_port = PA_DEVICE_PORT_DATA(port); + + if (ucm_port->devices) + pa_dynarray_free(ucm_port->devices); + + if (ucm_port->paths) + pa_hashmap_free(ucm_port->paths); + + pa_xfree(ucm_port->eld_mixer_device_name); +} + +static void ucm_port_update_available(pa_alsa_ucm_port_data *port) { + pa_alsa_ucm_device *device; + unsigned idx; + pa_available_t available = PA_AVAILABLE_YES; + + pa_assert(port); + + PA_DYNARRAY_FOREACH(device, port->devices, idx) { + if (device->available == PA_AVAILABLE_UNKNOWN) + available = PA_AVAILABLE_UNKNOWN; + else if (device->available == PA_AVAILABLE_NO) { + available = PA_AVAILABLE_NO; + break; + } + } + + pa_device_port_set_available(port->core_port, available); +} + +#else /* HAVE_ALSA_UCM */ + +/* Dummy functions for systems without UCM support */ + +int pa_alsa_ucm_query_profiles(pa_alsa_ucm_config *ucm, int card_index) { + pa_log_info("UCM not available."); + return -1; +} + +pa_alsa_profile_set* pa_alsa_ucm_add_profile_set(pa_alsa_ucm_config *ucm, pa_channel_map *default_channel_map) { + return NULL; +} + +int pa_alsa_ucm_set_profile(pa_alsa_ucm_config *ucm, pa_card *card, const char *new_profile, const char *old_profile) { + return -1; +} + +int pa_alsa_ucm_get_verb(snd_use_case_mgr_t *uc_mgr, const char *verb_name, const char *verb_desc, pa_alsa_ucm_verb **p_verb) { + return -1; +} + +void pa_alsa_ucm_add_ports( + pa_hashmap **hash, + pa_proplist *proplist, + pa_alsa_ucm_mapping_context *context, + bool is_sink, + pa_card *card, + snd_pcm_t *pcm_handle, + bool ignore_dB) { +} + +void pa_alsa_ucm_add_ports_combination( + pa_hashmap *hash, + pa_alsa_ucm_mapping_context *context, + bool is_sink, + pa_hashmap *ports, + pa_card_profile *cp, + pa_core *core) { +} + +int pa_alsa_ucm_set_port(pa_alsa_ucm_mapping_context *context, pa_device_port *port, bool is_sink) { + return -1; +} + +void pa_alsa_ucm_free(pa_alsa_ucm_config *ucm) { +} + +void pa_alsa_ucm_mapping_context_free(pa_alsa_ucm_mapping_context *context) { +} + +void pa_alsa_ucm_roled_stream_begin(pa_alsa_ucm_config *ucm, const char *role, pa_direction_t dir) { +} + +void pa_alsa_ucm_roled_stream_end(pa_alsa_ucm_config *ucm, const char *role, pa_direction_t dir) { +} + +#endif diff --git a/src/modules/alsa/alsa-ucm.h b/src/modules/alsa/alsa-ucm.h new file mode 100644 index 0000000..0bb2eb5 --- /dev/null +++ b/src/modules/alsa/alsa-ucm.h @@ -0,0 +1,294 @@ +#ifndef fooalsaucmhfoo +#define fooalsaucmhfoo + +/*** + This file is part of PulseAudio. + + Copyright 2011 Wolfson Microelectronics PLC + Author Margarita Olaya + Copyright 2012 Feng Wei , Freescale Ltd. + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_ALSA_UCM +#include +#else +typedef void snd_use_case_mgr_t; +#endif + +#include "alsa-mixer.h" + +/** For devices: List of verbs, devices or modifiers available */ +#define PA_ALSA_PROP_UCM_NAME "alsa.ucm.name" + +/** For devices: List of supported devices per verb*/ +#define PA_ALSA_PROP_UCM_DESCRIPTION "alsa.ucm.description" + +/** For devices: Playback device name e.g PlaybackPCM */ +#define PA_ALSA_PROP_UCM_SINK "alsa.ucm.sink" + +/** For devices: Capture device name e.g CapturePCM*/ +#define PA_ALSA_PROP_UCM_SOURCE "alsa.ucm.source" + +/** For devices: Playback roles */ +#define PA_ALSA_PROP_UCM_PLAYBACK_ROLES "alsa.ucm.playback.roles" + +/** For devices: Playback control device name */ +#define PA_ALSA_PROP_UCM_PLAYBACK_CTL_DEVICE "alsa.ucm.playback.ctldev" + +/** For devices: Playback control volume ID string. e.g PlaybackVolume */ +#define PA_ALSA_PROP_UCM_PLAYBACK_VOLUME "alsa.ucm.playback.volume" + +/** For devices: Playback switch e.g PlaybackSwitch */ +#define PA_ALSA_PROP_UCM_PLAYBACK_SWITCH "alsa.ucm.playback.switch" + +/** For devices: Playback mixer device name */ +#define PA_ALSA_PROP_UCM_PLAYBACK_MIXER_DEVICE "alsa.ucm.playback.mixer.device" + +/** For devices: Playback mixer identifier */ +#define PA_ALSA_PROP_UCM_PLAYBACK_MIXER_ELEM "alsa.ucm.playback.mixer.element" + +/** For devices: Playback mixer master identifier */ +#define PA_ALSA_PROP_UCM_PLAYBACK_MASTER_ELEM "alsa.ucm.playback.master.element" + +/** For devices: Playback mixer master type */ +#define PA_ALSA_PROP_UCM_PLAYBACK_MASTER_TYPE "alsa.ucm.playback.master.type" + +/** For devices: Playback mixer master identifier */ +#define PA_ALSA_PROP_UCM_PLAYBACK_MASTER_ID "alsa.ucm.playback.master.id" + +/** For devices: Playback mixer master type */ +#define PA_ALSA_PROP_UCM_PLAYBACK_MASTER_TYPE "alsa.ucm.playback.master.type" + +/** For devices: Playback priority */ +#define PA_ALSA_PROP_UCM_PLAYBACK_PRIORITY "alsa.ucm.playback.priority" + +/** For devices: Playback rate */ +#define PA_ALSA_PROP_UCM_PLAYBACK_RATE "alsa.ucm.playback.rate" + +/** For devices: Playback channels */ +#define PA_ALSA_PROP_UCM_PLAYBACK_CHANNELS "alsa.ucm.playback.channels" + +/** For devices: Capture roles */ +#define PA_ALSA_PROP_UCM_CAPTURE_ROLES "alsa.ucm.capture.roles" + +/** For devices: Capture control device name */ +#define PA_ALSA_PROP_UCM_CAPTURE_CTL_DEVICE "alsa.ucm.capture.ctldev" + +/** For devices: Capture controls volume ID string. e.g CaptureVolume */ +#define PA_ALSA_PROP_UCM_CAPTURE_VOLUME "alsa.ucm.capture.volume" + +/** For devices: Capture switch e.g CaptureSwitch */ +#define PA_ALSA_PROP_UCM_CAPTURE_SWITCH "alsa.ucm.capture.switch" + +/** For devices: Capture mixer device name */ +#define PA_ALSA_PROP_UCM_CAPTURE_MIXER_DEVICE "alsa.ucm.capture.mixer.device" + +/** For devices: Capture mixer identifier */ +#define PA_ALSA_PROP_UCM_CAPTURE_MIXER_ELEM "alsa.ucm.capture.mixer.element" + +/** For devices: Capture mixer identifier */ +#define PA_ALSA_PROP_UCM_CAPTURE_MASTER_ELEM "alsa.ucm.capture.master.element" + +/** For devices: Capture mixer identifier */ +#define PA_ALSA_PROP_UCM_CAPTURE_MASTER_TYPE "alsa.ucm.capture.master.type" + +/** For devices: Capture mixer identifier */ +#define PA_ALSA_PROP_UCM_CAPTURE_MASTER_ID "alsa.ucm.capture.master.id" + +/** For devices: Capture mixer identifier */ +#define PA_ALSA_PROP_UCM_CAPTURE_MASTER_TYPE "alsa.ucm.capture.master.type" + +/** For devices: Capture priority */ +#define PA_ALSA_PROP_UCM_CAPTURE_PRIORITY "alsa.ucm.capture.priority" + +/** For devices: Capture rate */ +#define PA_ALSA_PROP_UCM_CAPTURE_RATE "alsa.ucm.capture.rate" + +/** For devices: Capture channels */ +#define PA_ALSA_PROP_UCM_CAPTURE_CHANNELS "alsa.ucm.capture.channels" + +/** For devices: Quality of Service */ +#define PA_ALSA_PROP_UCM_QOS "alsa.ucm.qos" + +/** For devices: The modifier (if any) that this device corresponds to */ +#define PA_ALSA_PROP_UCM_MODIFIER "alsa.ucm.modifier" + +/* Corresponds to the "JackCTL" UCM value. */ +#define PA_ALSA_PROP_UCM_JACK_DEVICE "alsa.ucm.jack_device" + +/* Corresponds to the "JackControl" UCM value. */ +#define PA_ALSA_PROP_UCM_JACK_CONTROL "alsa.ucm.jack_control" + +/* Corresponds to the "JackHWMute" UCM value. */ +#define PA_ALSA_PROP_UCM_JACK_HW_MUTE "alsa.ucm.jack_hw_mute" + +typedef struct pa_alsa_ucm_verb pa_alsa_ucm_verb; +typedef struct pa_alsa_ucm_modifier pa_alsa_ucm_modifier; +typedef struct pa_alsa_ucm_device pa_alsa_ucm_device; +typedef struct pa_alsa_ucm_config pa_alsa_ucm_config; +typedef struct pa_alsa_ucm_mapping_context pa_alsa_ucm_mapping_context; +typedef struct pa_alsa_ucm_port_data pa_alsa_ucm_port_data; +typedef struct pa_alsa_ucm_volume pa_alsa_ucm_volume; + +int pa_alsa_ucm_query_profiles(pa_alsa_ucm_config *ucm, int card_index); +pa_alsa_profile_set* pa_alsa_ucm_add_profile_set(pa_alsa_ucm_config *ucm, pa_channel_map *default_channel_map); +int pa_alsa_ucm_set_profile(pa_alsa_ucm_config *ucm, pa_card *card, const char *new_profile, const char *old_profile); + +int pa_alsa_ucm_get_verb(snd_use_case_mgr_t *uc_mgr, const char *verb_name, const char *verb_desc, pa_alsa_ucm_verb **p_verb); + +void pa_alsa_ucm_add_ports( + pa_hashmap **hash, + pa_proplist *proplist, + pa_alsa_ucm_mapping_context *context, + bool is_sink, + pa_card *card, + snd_pcm_t *pcm_handle, + bool ignore_dB); +void pa_alsa_ucm_add_ports_combination( + pa_hashmap *hash, + pa_alsa_ucm_mapping_context *context, + bool is_sink, + pa_hashmap *ports, + pa_card_profile *cp, + pa_core *core); +int pa_alsa_ucm_set_port(pa_alsa_ucm_mapping_context *context, pa_device_port *port, bool is_sink); + +void pa_alsa_ucm_free(pa_alsa_ucm_config *ucm); +void pa_alsa_ucm_mapping_context_free(pa_alsa_ucm_mapping_context *context); + +void pa_alsa_ucm_roled_stream_begin(pa_alsa_ucm_config *ucm, const char *role, pa_direction_t dir); +void pa_alsa_ucm_roled_stream_end(pa_alsa_ucm_config *ucm, const char *role, pa_direction_t dir); + +/* UCM - Use Case Manager is available on some audio cards */ + +struct pa_alsa_ucm_device { + PA_LLIST_FIELDS(pa_alsa_ucm_device); + + pa_proplist *proplist; + + pa_device_port_type_t type; + + unsigned playback_priority; + unsigned capture_priority; + + unsigned playback_rate; + unsigned capture_rate; + + unsigned playback_channels; + unsigned capture_channels; + + /* These may be different per verb, so we store this as a hashmap of verb -> volume_control. We might eventually want to + * make this a hashmap of verb -> per-verb-device-properties-struct. */ + pa_hashmap *playback_volumes; + pa_hashmap *capture_volumes; + + pa_alsa_mapping *playback_mapping; + pa_alsa_mapping *capture_mapping; + + pa_idxset *conflicting_devices; + pa_idxset *supported_devices; + + /* One device may be part of multiple ports, since each device has + * a dedicated port, and in addition to that we sometimes generate ports + * that represent combinations of devices. */ + pa_dynarray *ucm_ports; /* struct ucm_port */ + + pa_alsa_jack *jack; + pa_dynarray *hw_mute_jacks; /* pa_alsa_jack */ + pa_available_t available; + + char *eld_mixer_device_name; + int eld_device; +}; + +void pa_alsa_ucm_device_update_available(pa_alsa_ucm_device *device); + +struct pa_alsa_ucm_modifier { + PA_LLIST_FIELDS(pa_alsa_ucm_modifier); + + pa_proplist *proplist; + + int n_confdev; + int n_suppdev; + + const char **conflicting_devices; + const char **supported_devices; + + pa_direction_t action_direction; + + char *media_role; + + /* Non-NULL if the modifier has its own PlaybackPCM/CapturePCM */ + pa_alsa_mapping *playback_mapping; + pa_alsa_mapping *capture_mapping; + + /* Count how many role matched streams are running */ + int enabled_counter; +}; + +struct pa_alsa_ucm_verb { + PA_LLIST_FIELDS(pa_alsa_ucm_verb); + + pa_proplist *proplist; + unsigned priority; + + PA_LLIST_HEAD(pa_alsa_ucm_device, devices); + PA_LLIST_HEAD(pa_alsa_ucm_modifier, modifiers); +}; + +struct pa_alsa_ucm_config { + pa_core *core; + snd_use_case_mgr_t *ucm_mgr; + pa_alsa_ucm_verb *active_verb; + + pa_hashmap *mixers; + PA_LLIST_HEAD(pa_alsa_ucm_verb, verbs); + PA_LLIST_HEAD(pa_alsa_jack, jacks); +}; + +struct pa_alsa_ucm_mapping_context { + pa_alsa_ucm_config *ucm; + pa_direction_t direction; + + pa_idxset *ucm_devices; + pa_idxset *ucm_modifiers; +}; + +struct pa_alsa_ucm_port_data { + pa_alsa_ucm_config *ucm; + pa_device_port *core_port; + + /* A single port will be associated with multiple devices if it represents + * a combination of devices. */ + pa_dynarray *devices; /* pa_alsa_ucm_device */ + + /* profile name -> pa_alsa_path for volume control */ + pa_hashmap *paths; + /* Current path, set when activating profile */ + pa_alsa_path *path; + + /* ELD info */ + char *eld_mixer_device_name; + int eld_device; /* PCM device number */ +}; + +struct pa_alsa_ucm_volume { + char *mixer_elem; /* mixer element identifier */ + char *master_elem; /* master mixer element identifier */ + char *master_type; +}; + +#endif diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c new file mode 100644 index 0000000..172a7bb --- /dev/null +++ b/src/modules/alsa/alsa-util.c @@ -0,0 +1,1891 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2009 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "alsa-util.h" +#include "alsa-mixer.h" + +#ifdef HAVE_UDEV +#include +#endif + +static int set_format(snd_pcm_t *pcm_handle, snd_pcm_hw_params_t *hwparams, pa_sample_format_t *f) { + + static const snd_pcm_format_t format_trans[] = { + [PA_SAMPLE_U8] = SND_PCM_FORMAT_U8, + [PA_SAMPLE_ALAW] = SND_PCM_FORMAT_A_LAW, + [PA_SAMPLE_ULAW] = SND_PCM_FORMAT_MU_LAW, + [PA_SAMPLE_S16LE] = SND_PCM_FORMAT_S16_LE, + [PA_SAMPLE_S16BE] = SND_PCM_FORMAT_S16_BE, + [PA_SAMPLE_FLOAT32LE] = SND_PCM_FORMAT_FLOAT_LE, + [PA_SAMPLE_FLOAT32BE] = SND_PCM_FORMAT_FLOAT_BE, + [PA_SAMPLE_S32LE] = SND_PCM_FORMAT_S32_LE, + [PA_SAMPLE_S32BE] = SND_PCM_FORMAT_S32_BE, + [PA_SAMPLE_S24LE] = SND_PCM_FORMAT_S24_3LE, + [PA_SAMPLE_S24BE] = SND_PCM_FORMAT_S24_3BE, + [PA_SAMPLE_S24_32LE] = SND_PCM_FORMAT_S24_LE, + [PA_SAMPLE_S24_32BE] = SND_PCM_FORMAT_S24_BE, + }; + + static const pa_sample_format_t try_order[] = { + PA_SAMPLE_FLOAT32NE, + PA_SAMPLE_FLOAT32RE, + PA_SAMPLE_S32NE, + PA_SAMPLE_S32RE, + PA_SAMPLE_S24_32NE, + PA_SAMPLE_S24_32RE, + PA_SAMPLE_S24NE, + PA_SAMPLE_S24RE, + PA_SAMPLE_S16NE, + PA_SAMPLE_S16RE, + PA_SAMPLE_ALAW, + PA_SAMPLE_ULAW, + PA_SAMPLE_U8 + }; + + unsigned i; + int ret; + + pa_assert(pcm_handle); + pa_assert(hwparams); + pa_assert(f); + + if ((ret = snd_pcm_hw_params_set_format(pcm_handle, hwparams, format_trans[*f])) >= 0) + return ret; + + pa_log_debug("snd_pcm_hw_params_set_format(%s) failed: %s", + snd_pcm_format_description(format_trans[*f]), + pa_alsa_strerror(ret)); + + if (*f == PA_SAMPLE_FLOAT32BE) + *f = PA_SAMPLE_FLOAT32LE; + else if (*f == PA_SAMPLE_FLOAT32LE) + *f = PA_SAMPLE_FLOAT32BE; + else if (*f == PA_SAMPLE_S24BE) + *f = PA_SAMPLE_S24LE; + else if (*f == PA_SAMPLE_S24LE) + *f = PA_SAMPLE_S24BE; + else if (*f == PA_SAMPLE_S24_32BE) + *f = PA_SAMPLE_S24_32LE; + else if (*f == PA_SAMPLE_S24_32LE) + *f = PA_SAMPLE_S24_32BE; + else if (*f == PA_SAMPLE_S16BE) + *f = PA_SAMPLE_S16LE; + else if (*f == PA_SAMPLE_S16LE) + *f = PA_SAMPLE_S16BE; + else if (*f == PA_SAMPLE_S32BE) + *f = PA_SAMPLE_S32LE; + else if (*f == PA_SAMPLE_S32LE) + *f = PA_SAMPLE_S32BE; + else + goto try_auto; + + if ((ret = snd_pcm_hw_params_set_format(pcm_handle, hwparams, format_trans[*f])) >= 0) + return ret; + + pa_log_debug("snd_pcm_hw_params_set_format(%s) failed: %s", + snd_pcm_format_description(format_trans[*f]), + pa_alsa_strerror(ret)); + +try_auto: + + for (i = 0; i < PA_ELEMENTSOF(try_order); i++) { + *f = try_order[i]; + + if ((ret = snd_pcm_hw_params_set_format(pcm_handle, hwparams, format_trans[*f])) >= 0) + return ret; + + pa_log_debug("snd_pcm_hw_params_set_format(%s) failed: %s", + snd_pcm_format_description(format_trans[*f]), + pa_alsa_strerror(ret)); + } + + return -1; +} + +static int set_period_size(snd_pcm_t *pcm_handle, snd_pcm_hw_params_t *hwparams, snd_pcm_uframes_t size) { + snd_pcm_uframes_t s; + int d, ret; + + pa_assert(pcm_handle); + pa_assert(hwparams); + + s = size; + d = 0; + if (snd_pcm_hw_params_set_period_size_near(pcm_handle, hwparams, &s, &d) < 0) { + s = size; + d = -1; + if (snd_pcm_hw_params_set_period_size_near(pcm_handle, hwparams, &s, &d) < 0) { + s = size; + d = 1; + if ((ret = snd_pcm_hw_params_set_period_size_near(pcm_handle, hwparams, &s, &d)) < 0) { + pa_log_info("snd_pcm_hw_params_set_period_size_near() failed: %s", pa_alsa_strerror(ret)); + return ret; + } + } + } + + return 0; +} + +static int set_buffer_size(snd_pcm_t *pcm_handle, snd_pcm_hw_params_t *hwparams, snd_pcm_uframes_t size) { + int ret; + + pa_assert(pcm_handle); + pa_assert(hwparams); + + if ((ret = snd_pcm_hw_params_set_buffer_size_near(pcm_handle, hwparams, &size)) < 0) { + pa_log_info("snd_pcm_hw_params_set_buffer_size_near() failed: %s", pa_alsa_strerror(ret)); + return ret; + } + + return 0; +} + +static void check_access(snd_pcm_t *pcm_handle, snd_pcm_hw_params_t *hwparams, bool use_mmap) { + if ((use_mmap && !snd_pcm_hw_params_test_access(pcm_handle, hwparams, SND_PCM_ACCESS_MMAP_INTERLEAVED)) || + !snd_pcm_hw_params_test_access(pcm_handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED)) + pa_log_error("Weird, PCM claims to support interleaved access, but snd_pcm_hw_params_set_access() failed."); + + if ((use_mmap && !snd_pcm_hw_params_test_access(pcm_handle, hwparams, SND_PCM_ACCESS_MMAP_NONINTERLEAVED)) || + !snd_pcm_hw_params_test_access(pcm_handle, hwparams, SND_PCM_ACCESS_RW_NONINTERLEAVED)) + pa_log_debug("PCM seems to support non-interleaved access, but PA doesn't."); + else if (use_mmap && !snd_pcm_hw_params_test_access(pcm_handle, hwparams, SND_PCM_ACCESS_MMAP_COMPLEX)) { + pa_log_debug("PCM seems to support mmapped complex access, but PA doesn't."); + } +} + +/* Set the hardware parameters of the given ALSA device. Returns the + * selected fragment settings in *buffer_size and *period_size. Determine + * whether mmap and tsched mode can be enabled. */ +int pa_alsa_set_hw_params( + snd_pcm_t *pcm_handle, + pa_sample_spec *ss, + snd_pcm_uframes_t *period_size, + snd_pcm_uframes_t *buffer_size, + snd_pcm_uframes_t tsched_size, + bool *use_mmap, + bool *use_tsched, + bool require_exact_channel_number) { + + int ret = -1; + snd_pcm_hw_params_t *hwparams, *hwparams_copy; + int dir; + snd_pcm_uframes_t _period_size = period_size ? *period_size : 0; + snd_pcm_uframes_t _buffer_size = buffer_size ? *buffer_size : 0; + bool _use_mmap = use_mmap && *use_mmap; + bool _use_tsched = use_tsched && *use_tsched; + pa_sample_spec _ss = *ss; + + pa_assert(pcm_handle); + pa_assert(ss); + + snd_pcm_hw_params_alloca(&hwparams); + snd_pcm_hw_params_alloca(&hwparams_copy); + + if ((ret = snd_pcm_hw_params_any(pcm_handle, hwparams)) < 0) { + pa_log_debug("snd_pcm_hw_params_any() failed: %s", pa_alsa_strerror(ret)); + goto finish; + } + + if ((ret = snd_pcm_hw_params_set_rate_resample(pcm_handle, hwparams, 0)) < 0) { + pa_log_debug("snd_pcm_hw_params_set_rate_resample() failed: %s", pa_alsa_strerror(ret)); + goto finish; + } + + if (_use_mmap) { + + if (snd_pcm_hw_params_set_access(pcm_handle, hwparams, SND_PCM_ACCESS_MMAP_INTERLEAVED) < 0) { + + /* mmap() didn't work, fall back to interleaved */ + + if ((ret = snd_pcm_hw_params_set_access(pcm_handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { + pa_log_debug("snd_pcm_hw_params_set_access() failed: %s", pa_alsa_strerror(ret)); + check_access(pcm_handle, hwparams, true); + goto finish; + } + + _use_mmap = false; + } + + } else if ((ret = snd_pcm_hw_params_set_access(pcm_handle, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { + pa_log_debug("snd_pcm_hw_params_set_access() failed: %s", pa_alsa_strerror(ret)); + check_access(pcm_handle, hwparams, false); + goto finish; + } + + if (!_use_mmap) + _use_tsched = false; + + if (!pa_alsa_pcm_is_hw(pcm_handle)) + _use_tsched = false; + + /* The PCM pointer is only updated with period granularity */ + if (snd_pcm_hw_params_is_batch(hwparams)) { + bool is_usb = false; + const char *id; + snd_pcm_info_t* pcm_info; + snd_pcm_info_alloca(&pcm_info); + + if (snd_pcm_info(pcm_handle, pcm_info) == 0 && + (id = snd_pcm_info_get_id(pcm_info))) { + /* This horrible hack makes sure we don't disable tsched on USB + * devices, which have a low enough transfer size for timer-based + * scheduling to work. This can go away when the ALSA API supprots + * querying the block transfer size. */ + if (pa_streq(id, "USB Audio")) + is_usb = true; + } + + if (!is_usb) { + pa_log_info("Disabling tsched mode since BATCH flag is set"); + _use_tsched = false; + } + } + +#if (SND_LIB_VERSION >= ((1<<16)|(0<<8)|24)) /* API additions in 1.0.24 */ + if (_use_tsched) { + + /* try to disable period wakeups if hardware can do so */ + if (snd_pcm_hw_params_can_disable_period_wakeup(hwparams)) { + + if ((ret = snd_pcm_hw_params_set_period_wakeup(pcm_handle, hwparams, false)) < 0) + /* don't bail, keep going with default mode with period wakeups */ + pa_log_debug("snd_pcm_hw_params_set_period_wakeup() failed: %s", pa_alsa_strerror(ret)); + else + pa_log_info("Trying to disable ALSA period wakeups, using timers only"); + } else + pa_log_info("Cannot disable ALSA period wakeups"); + } +#endif + + if ((ret = set_format(pcm_handle, hwparams, &_ss.format)) < 0) + goto finish; + + if ((ret = snd_pcm_hw_params_set_rate_near(pcm_handle, hwparams, &_ss.rate, NULL)) < 0) { + pa_log_debug("snd_pcm_hw_params_set_rate_near() failed: %s", pa_alsa_strerror(ret)); + goto finish; + } + + /* We ignore very small sampling rate deviations */ + if (_ss.rate >= ss->rate*.95 && _ss.rate <= ss->rate*1.05) + _ss.rate = ss->rate; + + if (require_exact_channel_number) { + if ((ret = snd_pcm_hw_params_set_channels(pcm_handle, hwparams, _ss.channels)) < 0) { + pa_log_debug("snd_pcm_hw_params_set_channels(%u) failed: %s", _ss.channels, pa_alsa_strerror(ret)); + goto finish; + } + } else { + unsigned int c = _ss.channels; + + if ((ret = snd_pcm_hw_params_set_channels_near(pcm_handle, hwparams, &c)) < 0) { + pa_log_debug("snd_pcm_hw_params_set_channels_near(%u) failed: %s", _ss.channels, pa_alsa_strerror(ret)); + goto finish; + } + + _ss.channels = c; + } + + if (_use_tsched && tsched_size > 0) { + _buffer_size = (snd_pcm_uframes_t) (((uint64_t) tsched_size * _ss.rate) / ss->rate); + _period_size = _buffer_size; + } else { + _period_size = (snd_pcm_uframes_t) (((uint64_t) _period_size * _ss.rate) / ss->rate); + _buffer_size = (snd_pcm_uframes_t) (((uint64_t) _buffer_size * _ss.rate) / ss->rate); + } + + if (_buffer_size > 0 || _period_size > 0) { + snd_pcm_uframes_t max_frames = 0; + + if ((ret = snd_pcm_hw_params_get_buffer_size_max(hwparams, &max_frames)) < 0) + pa_log_warn("snd_pcm_hw_params_get_buffer_size_max() failed: %s", pa_alsa_strerror(ret)); + else + pa_log_debug("Maximum hw buffer size is %lu ms", (long unsigned) (max_frames * PA_MSEC_PER_SEC / _ss.rate)); + + /* Some ALSA drivers really don't like if we set the buffer + * size first and the number of periods second (which would + * make a lot more sense to me). So, try a few combinations + * before we give up. */ + + if (_buffer_size > 0 && _period_size > 0) { + snd_pcm_hw_params_copy(hwparams_copy, hwparams); + + /* First try: set buffer size first, followed by period size */ + if (set_buffer_size(pcm_handle, hwparams_copy, _buffer_size) >= 0 && + set_period_size(pcm_handle, hwparams_copy, _period_size) >= 0 && + snd_pcm_hw_params(pcm_handle, hwparams_copy) >= 0) { + pa_log_debug("Set buffer size first (to %lu samples), period size second (to %lu samples).", (unsigned long) _buffer_size, (unsigned long) _period_size); + goto success; + } + + snd_pcm_hw_params_copy(hwparams_copy, hwparams); + /* Second try: set period size first, followed by buffer size */ + if (set_period_size(pcm_handle, hwparams_copy, _period_size) >= 0 && + set_buffer_size(pcm_handle, hwparams_copy, _buffer_size) >= 0 && + snd_pcm_hw_params(pcm_handle, hwparams_copy) >= 0) { + pa_log_debug("Set period size first (to %lu samples), buffer size second (to %lu samples).", (unsigned long) _period_size, (unsigned long) _buffer_size); + goto success; + } + } + + if (_buffer_size > 0) { + snd_pcm_hw_params_copy(hwparams_copy, hwparams); + + /* Third try: set only buffer size */ + if (set_buffer_size(pcm_handle, hwparams_copy, _buffer_size) >= 0 && + snd_pcm_hw_params(pcm_handle, hwparams_copy) >= 0) { + pa_log_debug("Set only buffer size (to %lu samples).", (unsigned long) _buffer_size); + goto success; + } + } + + if (_period_size > 0) { + snd_pcm_hw_params_copy(hwparams_copy, hwparams); + + /* Fourth try: set only period size */ + if (set_period_size(pcm_handle, hwparams_copy, _period_size) >= 0 && + snd_pcm_hw_params(pcm_handle, hwparams_copy) >= 0) { + pa_log_debug("Set only period size (to %lu samples).", (unsigned long) _period_size); + goto success; + } + } + } + + pa_log_debug("Set neither period nor buffer size."); + + /* Last chance, set nothing */ + if ((ret = snd_pcm_hw_params(pcm_handle, hwparams)) < 0) { + pa_log_info("snd_pcm_hw_params failed: %s", pa_alsa_strerror(ret)); + goto finish; + } + +success: + + if (ss->rate != _ss.rate) + pa_log_info("Device %s doesn't support %u Hz, changed to %u Hz.", snd_pcm_name(pcm_handle), ss->rate, _ss.rate); + + if (ss->channels != _ss.channels) + pa_log_info("Device %s doesn't support %u channels, changed to %u.", snd_pcm_name(pcm_handle), ss->channels, _ss.channels); + + if (ss->format != _ss.format) + pa_log_info("Device %s doesn't support sample format %s, changed to %s.", snd_pcm_name(pcm_handle), pa_sample_format_to_string(ss->format), pa_sample_format_to_string(_ss.format)); + + if ((ret = snd_pcm_hw_params_current(pcm_handle, hwparams)) < 0) { + pa_log_info("snd_pcm_hw_params_current() failed: %s", pa_alsa_strerror(ret)); + goto finish; + } + + if ((ret = snd_pcm_hw_params_get_period_size(hwparams, &_period_size, &dir)) < 0 || + (ret = snd_pcm_hw_params_get_buffer_size(hwparams, &_buffer_size)) < 0) { + pa_log_info("snd_pcm_hw_params_get_{period|buffer}_size() failed: %s", pa_alsa_strerror(ret)); + goto finish; + } + +#if (SND_LIB_VERSION >= ((1<<16)|(0<<8)|24)) /* API additions in 1.0.24 */ + if (_use_tsched) { + unsigned int no_wakeup; + /* see if period wakeups were disabled */ + snd_pcm_hw_params_get_period_wakeup(pcm_handle, hwparams, &no_wakeup); + if (no_wakeup == 0) + pa_log_info("ALSA period wakeups disabled"); + else + pa_log_info("ALSA period wakeups were not disabled"); + } +#endif + + ss->rate = _ss.rate; + ss->channels = _ss.channels; + ss->format = _ss.format; + + pa_assert(_period_size > 0); + pa_assert(_buffer_size > 0); + + if (buffer_size) + *buffer_size = _buffer_size; + + if (period_size) + *period_size = _period_size; + + if (use_mmap) + *use_mmap = _use_mmap; + + if (use_tsched) + *use_tsched = _use_tsched; + + ret = 0; + +finish: + + return ret; +} + +int pa_alsa_set_sw_params(snd_pcm_t *pcm, snd_pcm_uframes_t avail_min, bool period_event) { + snd_pcm_sw_params_t *swparams; + snd_pcm_uframes_t boundary; + int err; + + pa_assert(pcm); + + snd_pcm_sw_params_alloca(&swparams); + + if ((err = snd_pcm_sw_params_current(pcm, swparams)) < 0) { + pa_log_warn("Unable to determine current swparams: %s", pa_alsa_strerror(err)); + return err; + } + + if ((err = snd_pcm_sw_params_set_period_event(pcm, swparams, period_event)) < 0) { + pa_log_warn("Unable to disable period event: %s", pa_alsa_strerror(err)); + return err; + } + + if ((err = snd_pcm_sw_params_set_tstamp_mode(pcm, swparams, SND_PCM_TSTAMP_ENABLE)) < 0) { + pa_log_warn("Unable to enable time stamping: %s", pa_alsa_strerror(err)); + return err; + } + + if ((err = snd_pcm_sw_params_get_boundary(swparams, &boundary)) < 0) { + pa_log_warn("Unable to get boundary: %s", pa_alsa_strerror(err)); + return err; + } + + if ((err = snd_pcm_sw_params_set_stop_threshold(pcm, swparams, boundary)) < 0) { + pa_log_warn("Unable to set stop threshold: %s", pa_alsa_strerror(err)); + return err; + } + + if ((err = snd_pcm_sw_params_set_start_threshold(pcm, swparams, (snd_pcm_uframes_t) -1)) < 0) { + pa_log_warn("Unable to set start threshold: %s", pa_alsa_strerror(err)); + return err; + } + + if ((err = snd_pcm_sw_params_set_avail_min(pcm, swparams, avail_min)) < 0) { + pa_log_error("snd_pcm_sw_params_set_avail_min() failed: %s", pa_alsa_strerror(err)); + return err; + } + + if ((err = snd_pcm_sw_params(pcm, swparams)) < 0) { + pa_log_warn("Unable to set sw params: %s", pa_alsa_strerror(err)); + return err; + } + + return 0; +} + +snd_pcm_t *pa_alsa_open_by_device_id_auto( + const char *dev_id, + char **dev, + pa_sample_spec *ss, + pa_channel_map* map, + int mode, + snd_pcm_uframes_t *period_size, + snd_pcm_uframes_t *buffer_size, + snd_pcm_uframes_t tsched_size, + bool *use_mmap, + bool *use_tsched, + pa_alsa_profile_set *ps, + pa_alsa_mapping **mapping) { + + char *d; + snd_pcm_t *pcm_handle; + void *state; + pa_alsa_mapping *m; + + pa_assert(dev_id); + pa_assert(dev); + pa_assert(ss); + pa_assert(map); + pa_assert(ps); + + /* First we try to find a device string with a superset of the + * requested channel map. We iterate through our device table from + * top to bottom and take the first that matches. If we didn't + * find a working device that way, we iterate backwards, and check + * all devices that do not provide a superset of the requested + * channel map.*/ + + PA_HASHMAP_FOREACH(m, ps->mappings, state) { + if (!pa_channel_map_superset(&m->channel_map, map)) + continue; + + pa_log_debug("Checking for superset %s (%s)", m->name, m->device_strings[0]); + + pcm_handle = pa_alsa_open_by_device_id_mapping( + dev_id, + dev, + ss, + map, + mode, + period_size, + buffer_size, + tsched_size, + use_mmap, + use_tsched, + m); + + if (pcm_handle) { + if (mapping) + *mapping = m; + + return pcm_handle; + } + } + + PA_HASHMAP_FOREACH_BACKWARDS(m, ps->mappings, state) { + if (pa_channel_map_superset(&m->channel_map, map)) + continue; + + pa_log_debug("Checking for subset %s (%s)", m->name, m->device_strings[0]); + + pcm_handle = pa_alsa_open_by_device_id_mapping( + dev_id, + dev, + ss, + map, + mode, + period_size, + buffer_size, + tsched_size, + use_mmap, + use_tsched, + m); + + if (pcm_handle) { + if (mapping) + *mapping = m; + + return pcm_handle; + } + } + + /* OK, we didn't find any good device, so let's try the raw hw: stuff */ + d = pa_sprintf_malloc("hw:%s", dev_id); + pa_log_debug("Trying %s as last resort...", d); + pcm_handle = pa_alsa_open_by_device_string( + d, + dev, + ss, + map, + mode, + period_size, + buffer_size, + tsched_size, + use_mmap, + use_tsched, + false); + pa_xfree(d); + + if (pcm_handle && mapping) + *mapping = NULL; + + return pcm_handle; +} + +snd_pcm_t *pa_alsa_open_by_device_id_mapping( + const char *dev_id, + char **dev, + pa_sample_spec *ss, + pa_channel_map* map, + int mode, + snd_pcm_uframes_t *period_size, + snd_pcm_uframes_t *buffer_size, + snd_pcm_uframes_t tsched_size, + bool *use_mmap, + bool *use_tsched, + pa_alsa_mapping *m) { + + snd_pcm_t *pcm_handle; + pa_sample_spec try_ss; + pa_channel_map try_map; + + pa_assert(dev_id); + pa_assert(dev); + pa_assert(ss); + pa_assert(map); + pa_assert(m); + + try_ss.channels = m->channel_map.channels; + try_ss.rate = ss->rate; + try_ss.format = ss->format; + try_map = m->channel_map; + + pcm_handle = pa_alsa_open_by_template( + m->device_strings, + dev_id, + dev, + &try_ss, + &try_map, + mode, + period_size, + buffer_size, + tsched_size, + use_mmap, + use_tsched, + pa_channel_map_valid(&m->channel_map) /* Query the channel count if we don't know what we want */); + + if (!pcm_handle) + return NULL; + + *ss = try_ss; + *map = try_map; + pa_assert(map->channels == ss->channels); + + return pcm_handle; +} + +snd_pcm_t *pa_alsa_open_by_device_string( + const char *device, + char **dev, + pa_sample_spec *ss, + pa_channel_map* map, + int mode, + snd_pcm_uframes_t *period_size, + snd_pcm_uframes_t *buffer_size, + snd_pcm_uframes_t tsched_size, + bool *use_mmap, + bool *use_tsched, + bool require_exact_channel_number) { + + int err; + char *d; + snd_pcm_t *pcm_handle; + bool reformat = false; + + pa_assert(device); + pa_assert(ss); + pa_assert(map); + + d = pa_xstrdup(device); + + for (;;) { + pa_log_debug("Trying %s %s SND_PCM_NO_AUTO_FORMAT ...", d, reformat ? "without" : "with"); + + if ((err = snd_pcm_open(&pcm_handle, d, mode, + SND_PCM_NONBLOCK| + SND_PCM_NO_AUTO_RESAMPLE| + SND_PCM_NO_AUTO_CHANNELS| + (reformat ? 0 : SND_PCM_NO_AUTO_FORMAT))) < 0) { + pa_log_info("Error opening PCM device %s: %s", d, pa_alsa_strerror(err)); + goto fail; + } + + pa_log_debug("Managed to open %s", d); + + if ((err = pa_alsa_set_hw_params( + pcm_handle, + ss, + period_size, + buffer_size, + tsched_size, + use_mmap, + use_tsched, + require_exact_channel_number)) < 0) { + + if (!reformat) { + reformat = true; + + snd_pcm_close(pcm_handle); + continue; + } + + /* Hmm, some hw is very exotic, so we retry with plug, if without it didn't work */ + if (!pa_startswith(d, "plug:") && !pa_startswith(d, "plughw:")) { + char *t; + + t = pa_sprintf_malloc("plug:%s", d); + pa_xfree(d); + d = t; + + reformat = false; + + snd_pcm_close(pcm_handle); + continue; + } + + pa_log_info("Failed to set hardware parameters on %s: %s", d, pa_alsa_strerror(err)); + snd_pcm_close(pcm_handle); + + goto fail; + } + + if (ss->channels > PA_CHANNELS_MAX) { + pa_log("Device %s has %u channels, but PulseAudio supports only %u channels. Unable to use the device.", + d, ss->channels, PA_CHANNELS_MAX); + snd_pcm_close(pcm_handle); + goto fail; + } + + if (dev) + *dev = d; + else + pa_xfree(d); + + if (ss->channels != map->channels) + pa_channel_map_init_extend(map, ss->channels, PA_CHANNEL_MAP_ALSA); + + return pcm_handle; + } + +fail: + pa_xfree(d); + + return NULL; +} + +snd_pcm_t *pa_alsa_open_by_template( + char **template, + const char *dev_id, + char **dev, + pa_sample_spec *ss, + pa_channel_map* map, + int mode, + snd_pcm_uframes_t *period_size, + snd_pcm_uframes_t *buffer_size, + snd_pcm_uframes_t tsched_size, + bool *use_mmap, + bool *use_tsched, + bool require_exact_channel_number) { + + snd_pcm_t *pcm_handle; + char **i; + + for (i = template; *i; i++) { + char *d; + + d = pa_replace(*i, "%f", dev_id); + + pcm_handle = pa_alsa_open_by_device_string( + d, + dev, + ss, + map, + mode, + period_size, + buffer_size, + tsched_size, + use_mmap, + use_tsched, + require_exact_channel_number); + + pa_xfree(d); + + if (pcm_handle) + return pcm_handle; + } + + return NULL; +} + +void pa_alsa_dump(pa_log_level_t level, snd_pcm_t *pcm) { + int err; + snd_output_t *out; + + pa_assert(pcm); + + pa_assert_se(snd_output_buffer_open(&out) == 0); + + if ((err = snd_pcm_dump(pcm, out)) < 0) + pa_logl(level, "snd_pcm_dump(): %s", pa_alsa_strerror(err)); + else { + char *s = NULL; + snd_output_buffer_string(out, &s); + pa_logl(level, "snd_pcm_dump():\n%s", pa_strnull(s)); + } + + pa_assert_se(snd_output_close(out) == 0); +} + +void pa_alsa_dump_status(snd_pcm_t *pcm) { + int err; + snd_output_t *out; + snd_pcm_status_t *status; + char *s = NULL; + + pa_assert(pcm); + + snd_pcm_status_alloca(&status); + + if ((err = snd_output_buffer_open(&out)) < 0) { + pa_log_debug("snd_output_buffer_open() failed: %s", pa_cstrerror(err)); + return; + } + + if ((err = snd_pcm_status(pcm, status)) < 0) { + pa_log_debug("snd_pcm_status() failed: %s", pa_cstrerror(err)); + goto finish; + } + + if ((err = snd_pcm_status_dump(status, out)) < 0) { + pa_log_debug("snd_pcm_status_dump(): %s", pa_alsa_strerror(err)); + goto finish; + } + + snd_output_buffer_string(out, &s); + pa_log_debug("snd_pcm_status_dump():\n%s", pa_strnull(s)); + +finish: + + snd_output_close(out); +} + +static void alsa_error_handler(const char *file, int line, const char *function, int err, const char *fmt,...) { + va_list ap; + char *alsa_file; + + alsa_file = pa_sprintf_malloc("(alsa-lib)%s", file); + + va_start(ap, fmt); + + pa_log_levelv_meta(PA_LOG_INFO, alsa_file, line, function, fmt, ap); + + va_end(ap); + + pa_xfree(alsa_file); +} + +static pa_atomic_t n_error_handler_installed = PA_ATOMIC_INIT(0); + +void pa_alsa_refcnt_inc(void) { + /* This is not really thread safe, but we do our best */ + + if (pa_atomic_inc(&n_error_handler_installed) == 0) + snd_lib_error_set_handler(alsa_error_handler); +} + +void pa_alsa_refcnt_dec(void) { + int r; + + pa_assert_se((r = pa_atomic_dec(&n_error_handler_installed)) >= 1); + + if (r == 1) { + snd_lib_error_set_handler(NULL); + snd_config_update_free_global(); + } +} + +bool pa_alsa_init_description(pa_proplist *p, pa_card *card) { + const char *d, *k; + pa_assert(p); + + if (pa_device_init_description(p, card)) + return true; + + if (!(d = pa_proplist_gets(p, "alsa.card_name"))) + d = pa_proplist_gets(p, "alsa.name"); + + if (!d) + return false; + + k = pa_proplist_gets(p, PA_PROP_DEVICE_PROFILE_DESCRIPTION); + + if (d && k) + pa_proplist_setf(p, PA_PROP_DEVICE_DESCRIPTION, "%s %s", d, k); + else if (d) + pa_proplist_sets(p, PA_PROP_DEVICE_DESCRIPTION, d); + + return false; +} + +void pa_alsa_init_proplist_card(pa_core *c, pa_proplist *p, int card) { + char *cn, *lcn, *dn; + + pa_assert(p); + pa_assert(card >= 0); + + pa_proplist_setf(p, "alsa.card", "%i", card); + + if (snd_card_get_name(card, &cn) >= 0) { + pa_proplist_sets(p, "alsa.card_name", pa_strip(cn)); + free(cn); + } + + if (snd_card_get_longname(card, &lcn) >= 0) { + pa_proplist_sets(p, "alsa.long_card_name", pa_strip(lcn)); + free(lcn); + } + + if ((dn = pa_alsa_get_driver_name(card))) { + pa_proplist_sets(p, "alsa.driver_name", dn); + pa_xfree(dn); + } + +#ifdef HAVE_UDEV + pa_udev_get_info(card, p); +#endif +} + +void pa_alsa_init_proplist_pcm_info(pa_core *c, pa_proplist *p, snd_pcm_info_t *pcm_info) { + + static const char * const alsa_class_table[SND_PCM_CLASS_LAST+1] = { + [SND_PCM_CLASS_GENERIC] = "generic", + [SND_PCM_CLASS_MULTI] = "multi", + [SND_PCM_CLASS_MODEM] = "modem", + [SND_PCM_CLASS_DIGITIZER] = "digitizer" + }; + static const char * const class_table[SND_PCM_CLASS_LAST+1] = { + [SND_PCM_CLASS_GENERIC] = "sound", + [SND_PCM_CLASS_MULTI] = NULL, + [SND_PCM_CLASS_MODEM] = "modem", + [SND_PCM_CLASS_DIGITIZER] = NULL + }; + static const char * const alsa_subclass_table[SND_PCM_SUBCLASS_LAST+1] = { + [SND_PCM_SUBCLASS_GENERIC_MIX] = "generic-mix", + [SND_PCM_SUBCLASS_MULTI_MIX] = "multi-mix" + }; + + snd_pcm_class_t class; + snd_pcm_subclass_t subclass; + const char *n, *id, *sdn; + int card; + + pa_assert(p); + pa_assert(pcm_info); + + pa_proplist_sets(p, PA_PROP_DEVICE_API, "alsa"); + + if ((class = snd_pcm_info_get_class(pcm_info)) <= SND_PCM_CLASS_LAST) { + if (class_table[class]) + pa_proplist_sets(p, PA_PROP_DEVICE_CLASS, class_table[class]); + if (alsa_class_table[class]) + pa_proplist_sets(p, "alsa.class", alsa_class_table[class]); + } + + if ((subclass = snd_pcm_info_get_subclass(pcm_info)) <= SND_PCM_SUBCLASS_LAST) + if (alsa_subclass_table[subclass]) + pa_proplist_sets(p, "alsa.subclass", alsa_subclass_table[subclass]); + + if ((n = snd_pcm_info_get_name(pcm_info))) { + char *t = pa_xstrdup(n); + pa_proplist_sets(p, "alsa.name", pa_strip(t)); + pa_xfree(t); + } + + if ((id = snd_pcm_info_get_id(pcm_info))) + pa_proplist_sets(p, "alsa.id", id); + + pa_proplist_setf(p, "alsa.subdevice", "%u", snd_pcm_info_get_subdevice(pcm_info)); + if ((sdn = snd_pcm_info_get_subdevice_name(pcm_info))) + pa_proplist_sets(p, "alsa.subdevice_name", sdn); + + pa_proplist_setf(p, "alsa.device", "%u", snd_pcm_info_get_device(pcm_info)); + + if ((card = snd_pcm_info_get_card(pcm_info)) >= 0) + pa_alsa_init_proplist_card(c, p, card); +} + +void pa_alsa_init_proplist_pcm(pa_core *c, pa_proplist *p, snd_pcm_t *pcm) { + snd_pcm_hw_params_t *hwparams; + snd_pcm_info_t *info; + int bits, err; + + snd_pcm_hw_params_alloca(&hwparams); + snd_pcm_info_alloca(&info); + + if ((err = snd_pcm_hw_params_current(pcm, hwparams)) < 0) + pa_log_warn("Error fetching hardware parameter info: %s", pa_alsa_strerror(err)); + else { + + if ((bits = snd_pcm_hw_params_get_sbits(hwparams)) >= 0) + pa_proplist_setf(p, "alsa.resolution_bits", "%i", bits); + } + + if ((err = snd_pcm_info(pcm, info)) < 0) + pa_log_warn("Error fetching PCM info: %s", pa_alsa_strerror(err)); + else + pa_alsa_init_proplist_pcm_info(c, p, info); +} + +void pa_alsa_init_proplist_ctl(pa_proplist *p, const char *name) { + int err; + snd_ctl_t *ctl; + snd_ctl_card_info_t *info; + const char *t; + + pa_assert(p); + + snd_ctl_card_info_alloca(&info); + + if ((err = snd_ctl_open(&ctl, name, 0)) < 0) { + pa_log_warn("Error opening low-level control device '%s': %s", name, snd_strerror(err)); + return; + } + + if ((err = snd_ctl_card_info(ctl, info)) < 0) { + pa_log_warn("Control device %s card info: %s", name, snd_strerror(err)); + snd_ctl_close(ctl); + return; + } + + if ((t = snd_ctl_card_info_get_mixername(info)) && *t) + pa_proplist_sets(p, "alsa.mixer_name", t); + + if ((t = snd_ctl_card_info_get_components(info)) && *t) + pa_proplist_sets(p, "alsa.components", t); + + snd_ctl_close(ctl); +} + +int pa_alsa_recover_from_poll(snd_pcm_t *pcm, int revents) { + snd_pcm_state_t state; + snd_pcm_hw_params_t *hwparams; + int err; + + pa_assert(pcm); + + if (revents & POLLERR) + pa_log_debug("Got POLLERR from ALSA"); + if (revents & POLLNVAL) + pa_log_warn("Got POLLNVAL from ALSA"); + if (revents & POLLHUP) + pa_log_warn("Got POLLHUP from ALSA"); + if (revents & POLLPRI) + pa_log_warn("Got POLLPRI from ALSA"); + if (revents & POLLIN) + pa_log_debug("Got POLLIN from ALSA"); + if (revents & POLLOUT) + pa_log_debug("Got POLLOUT from ALSA"); + + state = snd_pcm_state(pcm); + pa_log_debug("PCM state is %s", snd_pcm_state_name(state)); + + /* Try to recover from this error */ + + switch (state) { + + case SND_PCM_STATE_DISCONNECTED: + /* Do not try to recover */ + pa_log_info("Device disconnected."); + return -1; + + case SND_PCM_STATE_XRUN: + if ((err = snd_pcm_recover(pcm, -EPIPE, 1)) != 0) { + pa_log_warn("Could not recover from POLLERR|POLLNVAL|POLLHUP and XRUN: %s", pa_alsa_strerror(err)); + return -1; + } + break; + + case SND_PCM_STATE_SUSPENDED: + snd_pcm_hw_params_alloca(&hwparams); + + if ((err = snd_pcm_hw_params_any(pcm, hwparams)) < 0) { + pa_log_debug("snd_pcm_hw_params_any() failed: %s", pa_alsa_strerror(err)); + return -1; + } + + if (snd_pcm_hw_params_can_resume(hwparams)) { + /* Retry resume 3 times before giving up, then fallback to restarting the stream. */ + for (int i = 0; i < 3; i++) { + if ((err = snd_pcm_resume(pcm)) == 0) + return 0; + if (err != -EAGAIN) + break; + pa_msleep(25); + } + pa_log_warn("Could not recover alsa device from SUSPENDED state, trying to restart PCM"); + } + /* Fall through */ + + default: + + snd_pcm_drop(pcm); + return 1; + } + + return 0; +} + +pa_rtpoll_item* pa_alsa_build_pollfd(snd_pcm_t *pcm, pa_rtpoll *rtpoll) { + int n, err; + struct pollfd *pollfd; + pa_rtpoll_item *item; + + pa_assert(pcm); + + if ((n = snd_pcm_poll_descriptors_count(pcm)) < 0) { + pa_log("snd_pcm_poll_descriptors_count() failed: %s", pa_alsa_strerror(n)); + return NULL; + } + + item = pa_rtpoll_item_new(rtpoll, PA_RTPOLL_NEVER, (unsigned) n); + pollfd = pa_rtpoll_item_get_pollfd(item, NULL); + + if ((err = snd_pcm_poll_descriptors(pcm, pollfd, (unsigned) n)) < 0) { + pa_log("snd_pcm_poll_descriptors() failed: %s", pa_alsa_strerror(err)); + pa_rtpoll_item_free(item); + return NULL; + } + + return item; +} + +snd_pcm_sframes_t pa_alsa_safe_avail(snd_pcm_t *pcm, size_t hwbuf_size, const pa_sample_spec *ss) { + snd_pcm_sframes_t n; + size_t k; + + pa_assert(pcm); + pa_assert(hwbuf_size > 0); + pa_assert(ss); + + /* Some ALSA driver expose weird bugs, let's inform the user about + * what is going on */ + + n = snd_pcm_avail(pcm); + + if (n <= 0) + return n; + + k = (size_t) n * pa_frame_size(ss); + + if (PA_UNLIKELY(k >= hwbuf_size * 5 || + k >= pa_bytes_per_second(ss)*10)) { + + PA_ONCE_BEGIN { + char *dn = pa_alsa_get_driver_name_by_pcm(pcm); + pa_log_debug(ngettext("snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu ms).\n" + "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.", + "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n" + "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.", + (unsigned long) k), + (unsigned long) k, + (unsigned long) (pa_bytes_to_usec(k, ss) / PA_USEC_PER_MSEC), + pa_strnull(dn)); + pa_xfree(dn); + pa_alsa_dump(PA_LOG_DEBUG, pcm); + } PA_ONCE_END; + + /* Mhmm, let's try not to fail completely */ + n = (snd_pcm_sframes_t) (hwbuf_size / pa_frame_size(ss)); + } + + return n; +} + +int pa_alsa_safe_delay(snd_pcm_t *pcm, snd_pcm_status_t *status, snd_pcm_sframes_t *delay, size_t hwbuf_size, const pa_sample_spec *ss, + bool capture) { + ssize_t k; + size_t abs_k; + int err; + snd_pcm_sframes_t avail = 0; +#if (SND_LIB_VERSION >= ((1<<16)|(1<<8)|0)) /* API additions in 1.1.0 */ + snd_pcm_audio_tstamp_config_t tstamp_config; +#endif + + pa_assert(pcm); + pa_assert(delay); + pa_assert(hwbuf_size > 0); + pa_assert(ss); + + /* Some ALSA driver expose weird bugs, let's inform the user about + * what is going on. We're going to get both the avail and delay values so + * that we can compare and check them for capture. + * This is done with snd_pcm_status() which provides + * avail, delay and timestamp values in a single kernel call to improve + * timer-based scheduling */ + +#if (SND_LIB_VERSION >= ((1<<16)|(1<<8)|0)) /* API additions in 1.1.0 */ + + /* The time stamp configuration needs to be set so that the + * ALSA code will use the internal delay reported by the driver. + * The time stamp configuration was introduced in alsa version 1.1.0. */ + tstamp_config.type_requested = 1; /* ALSA default time stamp type */ + tstamp_config.report_delay = 1; + snd_pcm_status_set_audio_htstamp_config(status, &tstamp_config); +#endif + + if ((err = snd_pcm_status(pcm, status)) < 0) + return err; + + avail = snd_pcm_status_get_avail(status); + *delay = snd_pcm_status_get_delay(status); + + k = (ssize_t) *delay * (ssize_t) pa_frame_size(ss); + + abs_k = k >= 0 ? (size_t) k : (size_t) -k; + + if (PA_UNLIKELY(abs_k >= hwbuf_size * 5 || + abs_k >= pa_bytes_per_second(ss)*10)) { + + PA_ONCE_BEGIN { + char *dn = pa_alsa_get_driver_name_by_pcm(pcm); + pa_log_debug(ngettext("snd_pcm_delay() returned a value that is exceptionally large: %li byte (%s%lu ms).\n" + "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.", + "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%lu ms).\n" + "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.", + (signed long) k), + (signed long) k, + k < 0 ? "-" : "", + (unsigned long) (pa_bytes_to_usec(abs_k, ss) / PA_USEC_PER_MSEC), + pa_strnull(dn)); + pa_xfree(dn); + pa_alsa_dump(PA_LOG_DEBUG, pcm); + } PA_ONCE_END; + + /* Mhmm, let's try not to fail completely */ + if (k < 0) + *delay = -(snd_pcm_sframes_t) (hwbuf_size / pa_frame_size(ss)); + else + *delay = (snd_pcm_sframes_t) (hwbuf_size / pa_frame_size(ss)); + } + + if (capture) { + abs_k = (size_t) avail * pa_frame_size(ss); + + if (PA_UNLIKELY(abs_k >= hwbuf_size * 5 || + abs_k >= pa_bytes_per_second(ss)*10)) { + + PA_ONCE_BEGIN { + char *dn = pa_alsa_get_driver_name_by_pcm(pcm); + pa_log_debug(ngettext("snd_pcm_avail() returned a value that is exceptionally large: %lu byte (%lu ms).\n" + "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.", + "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n" + "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.", + (unsigned long) k), + (unsigned long) k, + (unsigned long) (pa_bytes_to_usec(k, ss) / PA_USEC_PER_MSEC), + pa_strnull(dn)); + pa_xfree(dn); + pa_alsa_dump(PA_LOG_DEBUG, pcm); + } PA_ONCE_END; + + /* Mhmm, let's try not to fail completely */ + avail = (snd_pcm_sframes_t) (hwbuf_size / pa_frame_size(ss)); + } + + if (PA_UNLIKELY(*delay < avail)) { + PA_ONCE_BEGIN { + char *dn = pa_alsa_get_driver_name_by_pcm(pcm); + pa_log(_("snd_pcm_avail_delay() returned strange values: delay %lu is less than avail %lu.\n" + "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."), + (unsigned long) *delay, + (unsigned long) avail, + pa_strnull(dn)); + pa_xfree(dn); + pa_alsa_dump(PA_LOG_ERROR, pcm); + } PA_ONCE_END; + + /* try to fixup */ + *delay = avail; + } + } + + return 0; +} + +int pa_alsa_safe_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas, snd_pcm_uframes_t *offset, snd_pcm_uframes_t *frames, size_t hwbuf_size, const pa_sample_spec *ss) { + int r; + snd_pcm_uframes_t before; + size_t k; + + pa_assert(pcm); + pa_assert(areas); + pa_assert(offset); + pa_assert(frames); + pa_assert(hwbuf_size > 0); + pa_assert(ss); + + before = *frames; + + r = snd_pcm_mmap_begin(pcm, areas, offset, frames); + + if (r < 0) + return r; + + k = (size_t) *frames * pa_frame_size(ss); + + if (PA_UNLIKELY(*frames > before || + k >= hwbuf_size * 3 || + k >= pa_bytes_per_second(ss)*10)) + PA_ONCE_BEGIN { + char *dn = pa_alsa_get_driver_name_by_pcm(pcm); + pa_log_debug(ngettext("snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu byte (%lu ms).\n" + "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.", + "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms).\n" + "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.", + (unsigned long) k), + (unsigned long) k, + (unsigned long) (pa_bytes_to_usec(k, ss) / PA_USEC_PER_MSEC), + pa_strnull(dn)); + pa_xfree(dn); + pa_alsa_dump(PA_LOG_DEBUG, pcm); + } PA_ONCE_END; + + return r; +} + +char *pa_alsa_get_driver_name(int card) { + char *t, *m, *n; + + pa_assert(card >= 0); + + t = pa_sprintf_malloc("/sys/class/sound/card%i/device/driver/module", card); + m = pa_readlink(t); + pa_xfree(t); + + if (!m) + return NULL; + + n = pa_xstrdup(pa_path_get_filename(m)); + pa_xfree(m); + + return n; +} + +char *pa_alsa_get_driver_name_by_pcm(snd_pcm_t *pcm) { + int card; + snd_pcm_info_t* info; + snd_pcm_info_alloca(&info); + + pa_assert(pcm); + + if (snd_pcm_info(pcm, info) < 0) + return NULL; + + if ((card = snd_pcm_info_get_card(info)) < 0) + return NULL; + + return pa_alsa_get_driver_name(card); +} + +char *pa_alsa_get_reserve_name(const char *device) { + const char *t; + int i; + + pa_assert(device); + + if ((t = strchr(device, ':'))) + device = t+1; + + if ((i = snd_card_get_index(device)) < 0) { + int32_t k; + + if (pa_atoi(device, &k) < 0) + return NULL; + + i = (int) k; + } + + return pa_sprintf_malloc("Audio%i", i); +} + +unsigned int *pa_alsa_get_supported_rates(snd_pcm_t *pcm, unsigned int fallback_rate) { + static unsigned int all_rates[] = { 8000, 11025, 12000, + 16000, 22050, 24000, + 32000, 44100, 48000, + 64000, 88200, 96000, + 128000, 176400, 192000, + 384000 }; + bool supported[PA_ELEMENTSOF(all_rates)] = { false, }; + snd_pcm_hw_params_t *hwparams; + unsigned int i, j, n, *rates = NULL; + int ret; + + snd_pcm_hw_params_alloca(&hwparams); + + if ((ret = snd_pcm_hw_params_any(pcm, hwparams)) < 0) { + pa_log_debug("snd_pcm_hw_params_any() failed: %s", pa_alsa_strerror(ret)); + return NULL; + } + + for (i = 0, n = 0; i < PA_ELEMENTSOF(all_rates); i++) { + if (snd_pcm_hw_params_test_rate(pcm, hwparams, all_rates[i], 0) == 0) { + supported[i] = true; + n++; + } + } + + if (n > 0) { + rates = pa_xnew(unsigned int, n + 1); + + for (i = 0, j = 0; i < PA_ELEMENTSOF(all_rates); i++) { + if (supported[i]) + rates[j++] = all_rates[i]; + } + + rates[j] = 0; + } else { + rates = pa_xnew(unsigned int, 2); + + rates[0] = fallback_rate; + if ((ret = snd_pcm_hw_params_set_rate_near(pcm, hwparams, &rates[0], NULL)) < 0) { + pa_log_debug("snd_pcm_hw_params_set_rate_near() failed: %s", pa_alsa_strerror(ret)); + pa_xfree(rates); + return NULL; + } + + rates[1] = 0; + } + + return rates; +} + +pa_sample_format_t *pa_alsa_get_supported_formats(snd_pcm_t *pcm, pa_sample_format_t fallback_format) { + static const snd_pcm_format_t format_trans_to_pa[] = { + [SND_PCM_FORMAT_U8] = PA_SAMPLE_U8, + [SND_PCM_FORMAT_A_LAW] = PA_SAMPLE_ALAW, + [SND_PCM_FORMAT_MU_LAW] = PA_SAMPLE_ULAW, + [SND_PCM_FORMAT_S16_LE] = PA_SAMPLE_S16LE, + [SND_PCM_FORMAT_S16_BE] = PA_SAMPLE_S16BE, + [SND_PCM_FORMAT_FLOAT_LE] = PA_SAMPLE_FLOAT32LE, + [SND_PCM_FORMAT_FLOAT_BE] = PA_SAMPLE_FLOAT32BE, + [SND_PCM_FORMAT_S32_LE] = PA_SAMPLE_S32LE, + [SND_PCM_FORMAT_S32_BE] = PA_SAMPLE_S32BE, + [SND_PCM_FORMAT_S24_3LE] = PA_SAMPLE_S24LE, + [SND_PCM_FORMAT_S24_3BE] = PA_SAMPLE_S24BE, + [SND_PCM_FORMAT_S24_LE] = PA_SAMPLE_S24_32LE, + [SND_PCM_FORMAT_S24_BE] = PA_SAMPLE_S24_32BE, + }; + static const snd_pcm_format_t all_formats[] = { + SND_PCM_FORMAT_U8, + SND_PCM_FORMAT_A_LAW, + SND_PCM_FORMAT_MU_LAW, + SND_PCM_FORMAT_S16_LE, + SND_PCM_FORMAT_S16_BE, + SND_PCM_FORMAT_FLOAT_LE, + SND_PCM_FORMAT_FLOAT_BE, + SND_PCM_FORMAT_S32_LE, + SND_PCM_FORMAT_S32_BE, + SND_PCM_FORMAT_S24_3LE, + SND_PCM_FORMAT_S24_3BE, + SND_PCM_FORMAT_S24_LE, + SND_PCM_FORMAT_S24_BE, + }; + bool supported[PA_ELEMENTSOF(all_formats)] = { + false, + }; + snd_pcm_hw_params_t *hwparams; + unsigned int i, j, n; + pa_sample_format_t *formats = NULL; + int ret; + + snd_pcm_hw_params_alloca(&hwparams); + + if ((ret = snd_pcm_hw_params_any(pcm, hwparams)) < 0) { + pa_log_debug("snd_pcm_hw_params_any() failed: %s", pa_alsa_strerror(ret)); + return NULL; + } + + for (i = 0, n = 0; i < PA_ELEMENTSOF(all_formats); i++) { + if (snd_pcm_hw_params_test_format(pcm, hwparams, all_formats[i]) == 0) { + supported[i] = true; + n++; + } + } + + if (n > 0) { + formats = pa_xnew(pa_sample_format_t, n + 1); + + for (i = 0, j = 0; i < PA_ELEMENTSOF(all_formats); i++) { + if (supported[i]) + formats[j++] = format_trans_to_pa[all_formats[i]]; + } + + formats[j] = PA_SAMPLE_MAX; + } else { + formats = pa_xnew(pa_sample_format_t, 2); + + formats[0] = fallback_format; + if ((ret = snd_pcm_hw_params_set_format(pcm, hwparams, format_trans_to_pa[formats[0]])) < 0) { + pa_log_debug("snd_pcm_hw_params_set_format() failed: %s", pa_alsa_strerror(ret)); + pa_xfree(formats); + return NULL; + } + + formats[1] = PA_SAMPLE_MAX; + } + + return formats; +} + +bool pa_alsa_pcm_is_hw(snd_pcm_t *pcm) { + snd_pcm_info_t* info; + snd_pcm_info_alloca(&info); + + pa_assert(pcm); + + if (snd_pcm_info(pcm, info) < 0) + return false; + + return snd_pcm_info_get_card(info) >= 0; +} + +bool pa_alsa_pcm_is_modem(snd_pcm_t *pcm) { + snd_pcm_info_t* info; + snd_pcm_info_alloca(&info); + + pa_assert(pcm); + + if (snd_pcm_info(pcm, info) < 0) + return false; + + return snd_pcm_info_get_class(info) == SND_PCM_CLASS_MODEM; +} + +PA_STATIC_TLS_DECLARE(cstrerror, pa_xfree); + +const char* pa_alsa_strerror(int errnum) { + const char *original = NULL; + char *translated, *t; + char errbuf[128]; + + if ((t = PA_STATIC_TLS_GET(cstrerror))) + pa_xfree(t); + + original = snd_strerror(errnum); + + if (!original) { + pa_snprintf(errbuf, sizeof(errbuf), "Unknown error %i", errnum); + original = errbuf; + } + + if (!(translated = pa_locale_to_utf8(original))) { + pa_log_warn("Unable to convert error string to locale, filtering."); + translated = pa_utf8_filter(original); + } + + PA_STATIC_TLS_SET(cstrerror, translated); + + return translated; +} + +bool pa_alsa_may_tsched(bool want) { + + if (!want) + return false; + + if (!pa_rtclock_hrtimer()) { + /* We cannot depend on being woken up in time when the timers + are inaccurate, so let's fallback to classic IO based playback + then. */ + pa_log_notice("Disabling timer-based scheduling because high-resolution timers are not available from the kernel."); + return false; } + + if (pa_running_in_vm()) { + /* We cannot depend on being woken up when we ask for in a VM, + * so let's fallback to classic IO based playback then. */ + pa_log_notice("Disabling timer-based scheduling because running inside a VM."); + return false; + } + + return true; +} + +#define SND_MIXER_ELEM_PULSEAUDIO (SND_MIXER_ELEM_LAST + 10) + +static snd_mixer_elem_t *pa_alsa_mixer_find(snd_mixer_t *mixer, + snd_ctl_elem_iface_t iface, + const char *name, + unsigned int index, + unsigned int device) { + snd_mixer_elem_t *elem; + + for (elem = snd_mixer_first_elem(mixer); elem; elem = snd_mixer_elem_next(elem)) { + snd_hctl_elem_t *helem; + if (snd_mixer_elem_get_type(elem) != SND_MIXER_ELEM_PULSEAUDIO) + continue; + helem = snd_mixer_elem_get_private(elem); + if (snd_hctl_elem_get_interface(helem) != iface) + continue; + if (!pa_streq(snd_hctl_elem_get_name(helem), name)) + continue; + if (snd_hctl_elem_get_index(helem) != index) + continue; + if (snd_hctl_elem_get_device(helem) != device) + continue; + return elem; + } + return NULL; +} + +snd_mixer_elem_t *pa_alsa_mixer_find_card(snd_mixer_t *mixer, struct pa_alsa_mixer_id *alsa_id, unsigned int device) { + return pa_alsa_mixer_find(mixer, SND_CTL_ELEM_IFACE_CARD, alsa_id->name, alsa_id->index, device); +} + +snd_mixer_elem_t *pa_alsa_mixer_find_pcm(snd_mixer_t *mixer, const char *name, unsigned int device) { + return pa_alsa_mixer_find(mixer, SND_CTL_ELEM_IFACE_PCM, name, 0, device); +} + +static int mixer_class_compare(const snd_mixer_elem_t *c1, const snd_mixer_elem_t *c2) +{ + /* Dummy compare function */ + return c1 == c2 ? 0 : (c1 > c2 ? 1 : -1); +} + +static int mixer_class_event(snd_mixer_class_t *class, unsigned int mask, + snd_hctl_elem_t *helem, snd_mixer_elem_t *melem) +{ + int err; + const char *name = snd_hctl_elem_get_name(helem); + if (mask & SND_CTL_EVENT_MASK_ADD) { + snd_ctl_elem_iface_t iface = snd_hctl_elem_get_interface(helem); + if (iface == SND_CTL_ELEM_IFACE_CARD || iface == SND_CTL_ELEM_IFACE_PCM) { + snd_mixer_elem_t *new_melem; + + /* Put the hctl pointer as our private data - it will be useful for callbacks */ + if ((err = snd_mixer_elem_new(&new_melem, SND_MIXER_ELEM_PULSEAUDIO, 0, helem, NULL)) < 0) { + pa_log_warn("snd_mixer_elem_new failed: %s", pa_alsa_strerror(err)); + return 0; + } + + if ((err = snd_mixer_elem_attach(new_melem, helem)) < 0) { + pa_log_warn("snd_mixer_elem_attach failed: %s", pa_alsa_strerror(err)); + snd_mixer_elem_free(melem); + return 0; + } + + if ((err = snd_mixer_elem_add(new_melem, class)) < 0) { + pa_log_warn("snd_mixer_elem_add failed: %s", pa_alsa_strerror(err)); + return 0; + } + } + } + else if (mask & SND_CTL_EVENT_MASK_VALUE) { + snd_mixer_elem_value(melem); /* Calls the element callback */ + return 0; + } + else + pa_log_info("Got an unknown mixer class event for %s: mask 0x%x", name, mask); + + return 0; +} + +static int prepare_mixer(snd_mixer_t *mixer, const char *dev) { + int err; + snd_mixer_class_t *class; + + pa_assert(mixer); + pa_assert(dev); + + if ((err = snd_mixer_attach(mixer, dev)) < 0) { + pa_log_info("Unable to attach to mixer %s: %s", dev, pa_alsa_strerror(err)); + return -1; + } + + if (snd_mixer_class_malloc(&class)) { + pa_log_info("Failed to allocate mixer class for %s", dev); + return -1; + } + snd_mixer_class_set_event(class, mixer_class_event); + snd_mixer_class_set_compare(class, mixer_class_compare); + if ((err = snd_mixer_class_register(class, mixer)) < 0) { + pa_log_info("Unable register mixer class for %s: %s", dev, pa_alsa_strerror(err)); + snd_mixer_class_free(class); + return -1; + } + /* From here on, the mixer class is deallocated by alsa on snd_mixer_close/free. */ + + if ((err = snd_mixer_selem_register(mixer, NULL, NULL)) < 0) { + pa_log_warn("Unable to register mixer: %s", pa_alsa_strerror(err)); + return -1; + } + + if ((err = snd_mixer_load(mixer)) < 0) { + pa_log_warn("Unable to load mixer: %s", pa_alsa_strerror(err)); + return -1; + } + + pa_log_info("Successfully attached to mixer '%s'", dev); + return 0; +} + +snd_mixer_t *pa_alsa_open_mixer(pa_hashmap *mixers, int alsa_card_index, bool probe) { + char *md = pa_sprintf_malloc("hw:%i", alsa_card_index); + snd_mixer_t *m = pa_alsa_open_mixer_by_name(mixers, md, probe); + pa_xfree(md); + return m; +} + +snd_mixer_t *pa_alsa_open_mixer_by_name(pa_hashmap *mixers, const char *dev, bool probe) { + int err; + snd_mixer_t *m; + pa_alsa_mixer *pm; + char *dev2; + void *state; + + pa_assert(mixers); + pa_assert(dev); + + pm = pa_hashmap_get(mixers, dev); + + /* The quick card number/index lookup (hw:#) + * We already know the card number/index, thus use the mixer + * from the cache at first. + */ + if (!pm && pa_strneq(dev, "hw:", 3)) { + const char *s = dev + 3; + int card_index; + while (*s && *s >= '0' && *s <= '9') s++; + if (*s == '\0' && pa_atoi(dev + 3, &card_index) >= 0) { + PA_HASHMAP_FOREACH_KV(dev2, pm, mixers, state) { + if (pm->card_index == card_index) { + dev = dev2; + pm = pa_hashmap_get(mixers, dev); + break; + } + } + } + } + + if (pm) { + if (!probe) + pm->used_for_probe_only = false; + return pm->mixer_handle; + } + + if ((err = snd_mixer_open(&m, 0)) < 0) { + pa_log("Error opening mixer: %s", pa_alsa_strerror(err)); + return NULL; + } + + if (prepare_mixer(m, dev) >= 0) { + pm = pa_xnew0(pa_alsa_mixer, 1); + if (pm) { + snd_hctl_t *hctl; + pm->card_index = -1; + /* determine the ALSA card number (index) and store it to card_index */ + err = snd_mixer_get_hctl(m, dev, &hctl); + if (err >= 0) { + snd_ctl_card_info_t *info; + snd_ctl_card_info_alloca(&info); + err = snd_ctl_card_info(snd_hctl_ctl(hctl), info); + if (err >= 0) + pm->card_index = snd_ctl_card_info_get_card(info); + } + pm->used_for_probe_only = probe; + pm->mixer_handle = m; + pa_hashmap_put(mixers, pa_xstrdup(dev), pm); + return m; + } + } + + snd_mixer_close(m); + return NULL; +} + +snd_mixer_t *pa_alsa_open_mixer_for_pcm(pa_hashmap *mixers, snd_pcm_t *pcm, bool probe) { + snd_pcm_info_t* info; + snd_pcm_info_alloca(&info); + + pa_assert(pcm); + + if (snd_pcm_info(pcm, info) >= 0) { + int card_idx; + + if ((card_idx = snd_pcm_info_get_card(info)) >= 0) + return pa_alsa_open_mixer(mixers, card_idx, probe); + } + + return NULL; +} + +void pa_alsa_mixer_set_fdlist(pa_hashmap *mixers, snd_mixer_t *mixer_handle, pa_mainloop_api *ml) +{ + pa_alsa_mixer *pm; + void *state; + + PA_HASHMAP_FOREACH(pm, mixers, state) + if (pm->mixer_handle == mixer_handle) { + pm->used_for_probe_only = false; + if (!pm->fdl) { + pm->fdl = pa_alsa_fdlist_new(); + if (pm->fdl) + pa_alsa_fdlist_set_handle(pm->fdl, pm->mixer_handle, NULL, ml); + } + } +} + +void pa_alsa_mixer_free(pa_alsa_mixer *mixer) +{ + if (mixer->fdl) + pa_alsa_fdlist_free(mixer->fdl); + if (mixer->mixer_handle) + snd_mixer_close(mixer->mixer_handle); + pa_xfree(mixer); +} + +int pa_alsa_get_hdmi_eld(snd_hctl_elem_t *elem, pa_hdmi_eld *eld) { + + /* The ELD format is specific to HDA Intel sound cards and defined in the + HDA specification: http://www.intel.com/content/www/us/en/standards/high-definition-audio-specification.html */ + int err; + snd_ctl_elem_info_t *info; + snd_ctl_elem_value_t *value; + uint8_t *elddata; + unsigned int eldsize, mnl; + unsigned int device; + + pa_assert(eld != NULL); + pa_assert(elem != NULL); + + /* Does it have any contents? */ + snd_ctl_elem_info_alloca(&info); + snd_ctl_elem_value_alloca(&value); + if ((err = snd_hctl_elem_info(elem, info)) < 0 || + (err = snd_hctl_elem_read(elem, value)) < 0) { + pa_log_warn("Accessing ELD control failed with error %s", snd_strerror(err)); + return -1; + } + + device = snd_hctl_elem_get_device(elem); + eldsize = snd_ctl_elem_info_get_count(info); + elddata = (unsigned char *) snd_ctl_elem_value_get_bytes(value); + if (elddata == NULL || eldsize == 0) { + pa_log_debug("ELD info empty (for device=%d)", device); + return -1; + } + if (eldsize < 20 || eldsize > 256) { + pa_log_debug("ELD info has wrong size (for device=%d)", device); + return -1; + } + + /* Try to fetch monitor name */ + mnl = elddata[4] & 0x1f; + if (mnl == 0 || mnl > 16 || 20 + mnl > eldsize) { + pa_log_debug("No monitor name in ELD info (for device=%d)", device); + mnl = 0; + } + memcpy(eld->monitor_name, &elddata[20], mnl); + eld->monitor_name[mnl] = '\0'; + if (mnl) + pa_log_debug("Monitor name in ELD info is '%s' (for device=%d)", eld->monitor_name, device); + + return 0; +} diff --git a/src/modules/alsa/alsa-util.h b/src/modules/alsa/alsa-util.h new file mode 100644 index 0000000..2eed3ea --- /dev/null +++ b/src/modules/alsa/alsa-util.h @@ -0,0 +1,167 @@ +#ifndef fooalsautilhfoo +#define fooalsautilhfoo + +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#include + +#include +#include +#include + +#include +#include +#include + +#include "alsa-mixer.h" + +enum { + PA_ALSA_ERR_UNSPECIFIED = 1, + PA_ALSA_ERR_UCM_OPEN = 1000, + PA_ALSA_ERR_UCM_NO_VERB = 1001, + PA_ALSA_ERR_UCM_LINKED = 1002 +}; + +int pa_alsa_set_hw_params( + snd_pcm_t *pcm_handle, + pa_sample_spec *ss, /* modified at return */ + snd_pcm_uframes_t *period_size, /* modified at return */ + snd_pcm_uframes_t *buffer_size, /* modified at return */ + snd_pcm_uframes_t tsched_size, + bool *use_mmap, /* modified at return */ + bool *use_tsched, /* modified at return */ + bool require_exact_channel_number); + +int pa_alsa_set_sw_params( + snd_pcm_t *pcm, + snd_pcm_uframes_t avail_min, + bool period_event); + +/* Picks a working mapping from the profile set based on the specified ss/map */ +snd_pcm_t *pa_alsa_open_by_device_id_auto( + const char *dev_id, + char **dev, /* modified at return */ + pa_sample_spec *ss, /* modified at return */ + pa_channel_map* map, /* modified at return */ + int mode, + snd_pcm_uframes_t *period_size, /* modified at return */ + snd_pcm_uframes_t *buffer_size, /* modified at return */ + snd_pcm_uframes_t tsched_size, + bool *use_mmap, /* modified at return */ + bool *use_tsched, /* modified at return */ + pa_alsa_profile_set *ps, + pa_alsa_mapping **mapping); /* modified at return */ + +/* Uses the specified mapping */ +snd_pcm_t *pa_alsa_open_by_device_id_mapping( + const char *dev_id, + char **dev, /* modified at return */ + pa_sample_spec *ss, /* modified at return */ + pa_channel_map* map, /* modified at return */ + int mode, + snd_pcm_uframes_t *period_size, /* modified at return */ + snd_pcm_uframes_t *buffer_size, /* modified at return */ + snd_pcm_uframes_t tsched_size, + bool *use_mmap, /* modified at return */ + bool *use_tsched, /* modified at return */ + pa_alsa_mapping *mapping); + +/* Opens the explicit ALSA device */ +snd_pcm_t *pa_alsa_open_by_device_string( + const char *dir, + char **dev, /* modified at return */ + pa_sample_spec *ss, /* modified at return */ + pa_channel_map* map, /* modified at return */ + int mode, + snd_pcm_uframes_t *period_size, /* modified at return */ + snd_pcm_uframes_t *buffer_size, /* modified at return */ + snd_pcm_uframes_t tsched_size, + bool *use_mmap, /* modified at return */ + bool *use_tsched, /* modified at return */ + bool require_exact_channel_number); + +/* Opens the explicit ALSA device with a fallback list */ +snd_pcm_t *pa_alsa_open_by_template( + char **template, + const char *dev_id, + char **dev, /* modified at return */ + pa_sample_spec *ss, /* modified at return */ + pa_channel_map* map, /* modified at return */ + int mode, + snd_pcm_uframes_t *period_size, /* modified at return */ + snd_pcm_uframes_t *buffer_size, /* modified at return */ + snd_pcm_uframes_t tsched_size, + bool *use_mmap, /* modified at return */ + bool *use_tsched, /* modified at return */ + bool require_exact_channel_number); + +void pa_alsa_dump(pa_log_level_t level, snd_pcm_t *pcm); +void pa_alsa_dump_status(snd_pcm_t *pcm); + +void pa_alsa_refcnt_inc(void); +void pa_alsa_refcnt_dec(void); + +void pa_alsa_init_proplist_pcm_info(pa_core *c, pa_proplist *p, snd_pcm_info_t *pcm_info); +void pa_alsa_init_proplist_card(pa_core *c, pa_proplist *p, int card); +void pa_alsa_init_proplist_pcm(pa_core *c, pa_proplist *p, snd_pcm_t *pcm); +void pa_alsa_init_proplist_ctl(pa_proplist *p, const char *name); +bool pa_alsa_init_description(pa_proplist *p, pa_card *card); + +int pa_alsa_recover_from_poll(snd_pcm_t *pcm, int revents); + +pa_rtpoll_item* pa_alsa_build_pollfd(snd_pcm_t *pcm, pa_rtpoll *rtpoll); + +snd_pcm_sframes_t pa_alsa_safe_avail(snd_pcm_t *pcm, size_t hwbuf_size, const pa_sample_spec *ss); +int pa_alsa_safe_delay(snd_pcm_t *pcm, snd_pcm_status_t *status, snd_pcm_sframes_t *delay, size_t hwbuf_size, const pa_sample_spec *ss, bool capture); +int pa_alsa_safe_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas, snd_pcm_uframes_t *offset, snd_pcm_uframes_t *frames, size_t hwbuf_size, const pa_sample_spec *ss); + +char *pa_alsa_get_driver_name(int card); +char *pa_alsa_get_driver_name_by_pcm(snd_pcm_t *pcm); + +char *pa_alsa_get_reserve_name(const char *device); + +unsigned int *pa_alsa_get_supported_rates(snd_pcm_t *pcm, unsigned int fallback_rate); +pa_sample_format_t *pa_alsa_get_supported_formats(snd_pcm_t *pcm, pa_sample_format_t fallback_format); + +bool pa_alsa_pcm_is_hw(snd_pcm_t *pcm); +bool pa_alsa_pcm_is_modem(snd_pcm_t *pcm); + +const char* pa_alsa_strerror(int errnum); + +bool pa_alsa_may_tsched(bool want); + +snd_mixer_elem_t *pa_alsa_mixer_find_card(snd_mixer_t *mixer, struct pa_alsa_mixer_id *alsa_id, unsigned int device); +snd_mixer_elem_t *pa_alsa_mixer_find_pcm(snd_mixer_t *mixer, const char *name, unsigned int device); + +snd_mixer_t *pa_alsa_open_mixer(pa_hashmap *mixers, int alsa_card_index, bool probe); +snd_mixer_t *pa_alsa_open_mixer_by_name(pa_hashmap *mixers, const char *dev, bool probe); +snd_mixer_t *pa_alsa_open_mixer_for_pcm(pa_hashmap *mixers, snd_pcm_t *pcm, bool probe); +void pa_alsa_mixer_set_fdlist(pa_hashmap *mixers, snd_mixer_t *mixer, pa_mainloop_api *ml); +void pa_alsa_mixer_free(pa_alsa_mixer *mixer); + +typedef struct pa_hdmi_eld pa_hdmi_eld; +struct pa_hdmi_eld { + char monitor_name[17]; +}; + +int pa_alsa_get_hdmi_eld(snd_hctl_elem_t *elem, pa_hdmi_eld *eld); + +#endif diff --git a/src/modules/alsa/meson.build b/src/modules/alsa/meson.build new file mode 100644 index 0000000..f31eeb5 --- /dev/null +++ b/src/modules/alsa/meson.build @@ -0,0 +1,51 @@ +libalsa_util_sources = [ + 'alsa-util.c', + 'alsa-ucm.c', + 'alsa-mixer.c', + 'alsa-sink.c', + 'alsa-source.c', + '../reserve-wrap.c', +] + +libalsa_util_headers = [ + 'alsa-util.h', + 'alsa-ucm.h', + 'alsa-mixer.h', + 'alsa-sink.h', + 'alsa-source.h', + '../reserve-wrap.h', +] + +if dbus_dep.found() + libalsa_util_sources += [ '../reserve.c', '../reserve-monitor.c' ] + libalsa_util_headers += [ '../reserve.h', '../reserve-monitor.h' ] +endif + +if udev_dep.found() + libalsa_util_sources += [ '../udev-util.c' ] + libalsa_util_headers += [ '../udev-util.h' ] +endif + +libalsa_util = shared_library('alsa-util', + libalsa_util_sources, + libalsa_util_headers, + c_args : [pa_c_args, server_c_args], + link_args : [nodelete_link_args], + include_directories : [configinc, topinc], + dependencies : [libpulse_dep, libpulsecommon_dep, libpulsecore_dep, alsa_dep, dbus_dep, libatomic_ops_dep, libm_dep, udev_dep, libintl_dep], + install : true, + install_rpath : privlibdir, + install_dir : modlibexecdir, +) + +alsa_udevrules = [ + '90-pulseaudio.rules', +] + +if udev_dep.found() + install_data(alsa_udevrules, + install_dir : udevrulesdir, + ) +endif + +subdir('mixer') diff --git a/src/modules/alsa/mixer/meson.build b/src/modules/alsa/mixer/meson.build new file mode 100644 index 0000000..d4327b8 --- /dev/null +++ b/src/modules/alsa/mixer/meson.build @@ -0,0 +1,7 @@ +install_subdir('paths', + install_dir : alsadatadir +) + +install_subdir('profile-sets', + install_dir : alsadatadir +) diff --git a/src/modules/alsa/mixer/paths/analog-input-aux.conf b/src/modules/alsa/mixer/paths/analog-input-aux.conf new file mode 100644 index 0000000..47e22c5 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input-aux.conf @@ -0,0 +1,65 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; For devices where an 'Aux' element exists +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 80 +description-key = analog-input + +[Element Capture] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Mic] +switch = off +volume = off + +[Element Internal Mic] +switch = off +volume = off + +[Element Line] +switch = off +volume = off + +[Element Aux] +required = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Video] +switch = off +volume = off + +[Element Mic/Line] +switch = off +volume = off + +[Element TV Tuner] +switch = off +volume = off + +[Element FM] +switch = off +volume = off + +.include analog-input.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-input-dock-mic.conf b/src/modules/alsa/mixer/paths/analog-input-dock-mic.conf new file mode 100644 index 0000000..96861e7 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input-dock-mic.conf @@ -0,0 +1,104 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; For devices where a 'Dock Mic' or 'Dock Mic Boost' element exists +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 78 +description-key = analog-input-microphone-dock + +[Jack Dock Mic] +required-any = any + +[Jack Dock Mic Phantom] +state.plugged = unknown +state.unplugged = unknown +required-any = any + +[Element Capture] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Dock Mic Boost] +required-any = any +switch = select +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Option Dock Mic Boost:on] +name = input-boost-on + +[Option Dock Mic Boost:off] +name = input-boost-off + +[Element Dock Mic] +required-any = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Input Source] +enumeration = select + +[Option Input Source:Dock Mic] +name = analog-input-microphone-dock +required-any = any + +[Element Capture Source] +enumeration = select + +[Option Capture Source:Dock Mic] +name = analog-input-microphone-dock +required-any = any + +[Element Mic] +switch = off +volume = off + +[Element Internal Mic] +switch = off +volume = off + +[Element Front Mic] +switch = off +volume = off + +[Element Rear Mic] +switch = off +volume = off + +[Element Mic Boost] +switch = off +volume = off + +[Element Internal Mic Boost] +switch = off +volume = off + +[Element Front Mic Boost] +switch = off +volume = off + +[Element Rear Mic Boost] +switch = off +volume = off + +.include analog-input-mic.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-input-fm.conf b/src/modules/alsa/mixer/paths/analog-input-fm.conf new file mode 100644 index 0000000..d3501a8 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input-fm.conf @@ -0,0 +1,65 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; For devices where an 'FM' element exists +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 70 +description-key = analog-input-radio + +[Element Capture] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Mic] +switch = off +volume = off + +[Element Internal Mic] +switch = off +volume = off + +[Element Line] +switch = off +volume = off + +[Element Aux] +switch = off +volume = off + +[Element Video] +switch = off +volume = off + +[Element Mic/Line] +switch = off +volume = off + +[Element TV Tuner] +switch = off +volume = off + +[Element FM] +required = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +.include analog-input.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-input-front-mic.conf b/src/modules/alsa/mixer/paths/analog-input-front-mic.conf new file mode 100644 index 0000000..6e7775c --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input-front-mic.conf @@ -0,0 +1,104 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; For devices where a 'Front Mic' or 'Front Mic Boost' element exists +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 85 +description-key = analog-input-microphone-front + +[Jack Front Mic] +required-any = any + +[Jack Front Mic Phantom] +required-any = any +state.plugged = unknown +state.unplugged = unknown + +[Element Capture] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Front Mic Boost] +required-any = any +switch = select +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Option Front Mic Boost:on] +name = input-boost-on + +[Option Front Mic Boost:off] +name = input-boost-off + +[Element Front Mic] +required-any = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Input Source] +enumeration = select + +[Option Input Source:Front Mic] +name = analog-input-microphone-front +required-any = any + +[Element Capture Source] +enumeration = select + +[Option Capture Source:Front Mic] +name = analog-input-microphone-front +required-any = any + +[Element Mic] +switch = off +volume = off + +[Element Internal Mic] +switch = off +volume = off + +[Element Rear Mic] +switch = off +volume = off + +[Element Dock Mic] +switch = off +volume = off + +[Element Mic Boost] +switch = off +volume = off + +[Element Dock Mic Boost] +switch = off +volume = off + +[Element Internal Mic Boost] +switch = off +volume = off + +[Element Rear Mic Boost] +switch = off +volume = off + +.include analog-input-mic.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-input-headphone-mic.conf b/src/modules/alsa/mixer/paths/analog-input-headphone-mic.conf new file mode 100644 index 0000000..eb5740a --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input-headphone-mic.conf @@ -0,0 +1,102 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; For some ASUS netbooks that have one jack that can be either a Headphone +; *or* a mic. This path will be active only when it is used as a mic. +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 87 +description-key = analog-input-microphone + +[Jack Headphone Mic] +required-any = any +state.plugged = unknown + +[Element Capture] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Headphone Mic Boost] +required-any = any +switch = select +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Headphone Mic] +required-any = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Input Source] +enumeration = select + +[Option Input Source:Headphone Mic] +name = analog-input-microphone +required-any = any + +[Element Capture Source] +enumeration = select + +[Option Capture Source:Headphone Mic] +name = analog-input-microphone +required-any = any + +; Make sure the internal speakers are not auto-muted when you plug a mic in +[Element Auto-Mute Mode] +enumeration = select + +[Option Auto-Mute Mode:Disabled] +name = analog-input-microphone + +[Element Front Mic] +switch = off +volume = off + +[Element Internal Mic] +switch = off +volume = off + +[Element Rear Mic] +switch = off +volume = off + +[Element Dock Mic] +switch = off +volume = off + +[Element Dock Mic Boost] +switch = off +volume = off + +[Element Internal Mic Boost] +switch = off +volume = off + +[Element Front Mic Boost] +switch = off +volume = off + +[Element Rear Mic Boost] +switch = off +volume = off + +.include analog-input-mic.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-input-headset-mic.conf b/src/modules/alsa/mixer/paths/analog-input-headset-mic.conf new file mode 100644 index 0000000..579db6b --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input-headset-mic.conf @@ -0,0 +1,114 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; For devices where a 'Headset Mic' or 'Headset Mic Boost' element exists +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 88 +description-key = analog-input-microphone-headset + +[Jack Headset Mic] +required-any = any + +[Jack Headset Mic Phantom] +state.plugged = unknown +state.unplugged = unknown +required-any = any + +[Jack Headphone] +state.plugged = unknown + +[Jack Front Headphone] +state.plugged = unknown + +[Jack Headphone Mic] +state.plugged = unknown + +[Element Capture] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Headset Mic Boost] +required-any = any +switch = select +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Headset Mic] +required-any = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Headset] +required-any = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Input Source] +enumeration = select + +[Option Input Source:Headset Mic] +name = Headset Microphone +required-any = any + +[Element Capture Source] +enumeration = select + +[Option Capture Source:Headset Mic] +name = Headset Microphone +required-any = any + +[Element Front Mic] +switch = off +volume = off + +[Element Internal Mic] +switch = off +volume = off + +[Element Rear Mic] +switch = off +volume = off + +[Element Dock Mic] +switch = off +volume = off + +[Element Dock Mic Boost] +switch = off +volume = off + +[Element Internal Mic Boost] +switch = off +volume = off + +[Element Front Mic Boost] +switch = off +volume = off + +[Element Rear Mic Boost] +switch = off +volume = off + +.include analog-input-mic.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-input-internal-mic-always.conf b/src/modules/alsa/mixer/paths/analog-input-internal-mic-always.conf new file mode 100644 index 0000000..9e22008 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input-internal-mic-always.conf @@ -0,0 +1,133 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; For devices where a 'Internal Mic' or 'Internal Mic Boost' element exists +; 'Int Mic' and 'Int Mic Boost' are for compatibility with kernels < 2.6.38 +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 89 +description-key = analog-input-microphone-internal + +[Jack Mic] +state.plugged = no +state.unplugged = unknown + +[Jack Dock Mic] +state.plugged = no +state.unplugged = unknown + +[Jack Front Mic] +state.plugged = no +state.unplugged = unknown + +[Jack Rear Mic] +state.plugged = no +state.unplugged = unknown + +[Element Capture] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Internal Mic Boost] +switch = select +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Option Internal Mic Boost:on] +name = input-boost-on + +[Option Internal Mic Boost:off] +name = input-boost-off + +[Element Int Mic Boost] +switch = select +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Option Int Mic Boost:on] +name = input-boost-on + +[Option Int Mic Boost:off] +name = input-boost-off + +[Element Internal Mic] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Int Mic] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Input Source] +enumeration = select + +[Option Input Source:Internal Mic] +name = analog-input-microphone-internal + +[Option Input Source:Int Mic] +name = analog-input-microphone-internal + +[Element Capture Source] +enumeration = select + +[Option Capture Source:Internal Mic] +name = analog-input-microphone-internal + +[Option Capture Source:Int Mic] +name = analog-input-microphone-internal + +[Element Mic] +switch = off +volume = off + +[Element Dock Mic] +switch = off +volume = off + +[Element Front Mic] +switch = off +volume = off + +[Element Rear Mic] +switch = off +volume = off + +[Element Mic Boost] +switch = off +volume = off + +[Element Dock Mic Boost] +switch = off +volume = off + +[Element Front Mic Boost] +switch = off +volume = off + +[Element Rear Mic Boost] +switch = off +volume = off + +.include analog-input-mic.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-input-internal-mic.conf b/src/modules/alsa/mixer/paths/analog-input-internal-mic.conf new file mode 100644 index 0000000..898410a --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input-internal-mic.conf @@ -0,0 +1,154 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; For devices where a 'Internal Mic' or 'Internal Mic Boost' element exists +; 'Int Mic' and 'Int Mic Boost' are for compatibility with kernels < 2.6.38 +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 89 +description-key = analog-input-microphone-internal + +[Jack Mic] +state.plugged = no +state.unplugged = unknown + +[Jack Dock Mic] +state.plugged = no +state.unplugged = unknown + +[Jack Front Mic] +state.plugged = no +state.unplugged = unknown + +[Jack Rear Mic] +state.plugged = no +state.unplugged = unknown + +[Jack Internal Mic Phantom] +state.plugged = unknown +state.unplugged = unknown +required-any = any + +[Element Capture] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Internal Mic Boost] +required-any = any +switch = select +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Option Internal Mic Boost:on] +name = input-boost-on + +[Option Internal Mic Boost:off] +name = input-boost-off + +[Element Int Mic Boost] +required-any = any +switch = select +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Option Int Mic Boost:on] +name = input-boost-on + +[Option Int Mic Boost:off] +name = input-boost-off + +[Element Internal Mic] +required-any = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Int Mic] +required-any = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Input Source] +enumeration = select + +[Option Input Source:Internal Mic] +name = analog-input-microphone-internal +required-any = any + +[Option Input Source:Int Mic] +name = analog-input-microphone-internal +required-any = any + +[Element Capture Source] +enumeration = select + +[Option Capture Source:Internal Mic] +name = analog-input-microphone-internal +required-any = any + +[Option Capture Source:Int Mic] +name = analog-input-microphone-internal +required-any = any + +[Element Mic] +switch = off +volume = off + +[Element Dock Mic] +switch = off +volume = off + +[Element Front Mic] +switch = off +volume = off + +[Element Rear Mic] +switch = off +volume = off + +[Element Headphone Mic] +switch = off +volume = off + +[Element Headphone Mic Boost] +switch = off +volume = off + +[Element Mic Boost] +switch = off +volume = off + +[Element Dock Mic Boost] +switch = off +volume = off + +[Element Front Mic Boost] +switch = off +volume = off + +[Element Rear Mic Boost] +switch = off +volume = off + +.include analog-input-mic.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-input-linein.conf b/src/modules/alsa/mixer/paths/analog-input-linein.conf new file mode 100644 index 0000000..cf20790 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input-linein.conf @@ -0,0 +1,144 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; For devices where a 'Line' element exists +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 81 + +[Jack Line] +required-any = any + +[Jack Line Phantom] +required-any = any +state.plugged = unknown +state.unplugged = unknown + +[Jack Line - Input] +required-any = any + +[Element Capture] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Line Boost] +required-any = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Line] +required-any = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Input Source] +enumeration = select + +[Option Input Source:Line] +name = analog-input-linein +required-any = any + +[Element Capture Source] +enumeration = select + +[Option Capture Source:Line] +name = analog-input-linein +required-any = any + +[Element PCM Capture Source] +enumeration = select + +[Option PCM Capture Source:Line] +name = analog-input-linein +required-any = any + +[Option PCM Capture Source:Line In] +name = analog-input-linein +required-any = any + +[Element Mic] +switch = off +volume = off + +[Element Dock Mic] +switch = off +volume = off + +[Element Internal Mic] +switch = off +volume = off + +[Element Front Mic] +switch = off +volume = off + +[Element Rear Mic] +switch = off +volume = off + +[Element Mic Boost] +switch = off +volume = off + +[Element Dock Mic Boost] +switch = off +volume = off + +[Element Internal Mic Boost] +switch = off +volume = off + +[Element Front Mic Boost] +switch = off +volume = off + +[Element Rear Mic Boost] +switch = off +volume = off + +[Element Aux] +switch = off +volume = off + +[Element Video] +switch = off +volume = off + +[Element Mic/Line] +switch = off +volume = off + +[Element TV Tuner] +switch = off +volume = off + +[Element FM] +switch = off +volume = off + +[Element Mic Jack Mode] +enumeration = select + +[Option Mic Jack Mode:Line In] +priority = 19 +name = input-linein diff --git a/src/modules/alsa/mixer/paths/analog-input-mic-line.conf b/src/modules/alsa/mixer/paths/analog-input-mic-line.conf new file mode 100644 index 0000000..7147d20 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input-mic-line.conf @@ -0,0 +1,66 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; For devices where a 'Mic/Line' element exists +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 85 +description-key = analog-input + +[Element Capture] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Mic] +switch = off +volume = off + +[Element Internal Mic] +switch = off +volume = off + +[Element Line] +switch = off +volume = off + +[Element Aux] +switch = off +volume = off + +[Element Video] +switch = off +volume = off + +[Element Mic/Line] +required = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element TV Tuner] +switch = off +volume = off + +[Element FM] +switch = off +volume = off + +.include analog-input.conf.common +.include analog-input-mic.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-input-mic.conf b/src/modules/alsa/mixer/paths/analog-input-mic.conf new file mode 100644 index 0000000..53c03c8 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input-mic.conf @@ -0,0 +1,141 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; For devices where a 'Mic' or 'Mic Boost' element exists +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 87 +description-key = analog-input-microphone + +[Jack Mic] +required-any = any + +[Jack Mic Phantom] +required-any = any +state.plugged = unknown +state.unplugged = unknown + +[Jack Mic - Input] +required-any = any + +[Element Capture] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Mic Boost] +required-any = any +switch = select +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Option Mic Boost:on] +name = input-boost-on + +[Option Mic Boost:off] +name = input-boost-off + +[Element Mic] +required-any = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Input Source] +enumeration = select + +[Option Input Source:Mic] +name = analog-input-microphone +required-any = any + +[Element Capture Source] +enumeration = select + +[Option Capture Source:Mic] +name = analog-input-microphone +required-any = any + +[Element PCM Capture Source] +enumeration = select + +[Option PCM Capture Source:Mic] +name = analog-input-microphone +required-any = any + +[Option PCM Capture Source:Mic-In/Mic Array] +name = analog-input-microphone +required-any = any + +;;; Some AC'97s have "Mic Select" and "Mic Boost (+20dB)" + +[Element Mic Select] +enumeration = select + +[Option Mic Select:Mic1] +name = input-microphone +priority = 20 + +[Option Mic Select:Mic2] +name = input-microphone +priority = 19 + +[Element Mic Boost (+20dB)] +switch = select +volume = merge + +[Option Mic Boost (+20dB):on] +name = input-boost-on + +[Option Mic Boost (+20dB):off] +name = input-boost-off + +[Element Front Mic] +switch = off +volume = off + +[Element Internal Mic] +switch = off +volume = off + +[Element Rear Mic] +switch = off +volume = off + +[Element Dock Mic] +switch = off +volume = off + +[Element Dock Mic Boost] +switch = off +volume = off + +[Element Internal Mic Boost] +switch = off +volume = off + +[Element Front Mic Boost] +switch = off +volume = off + +[Element Rear Mic Boost] +switch = off +volume = off + +.include analog-input-mic.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-input-mic.conf.common b/src/modules/alsa/mixer/paths/analog-input-mic.conf.common new file mode 100644 index 0000000..e5ced21 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input-mic.conf.common @@ -0,0 +1,60 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; Common element for all microphone inputs +; +; See analog-output.conf.common for an explanation on the directives + +[Properties] +device.icon_name = audio-input-microphone + +[Element Line] +switch = off +volume = off + +[Element Line Boost] +switch = off +volume = off + +[Element Aux] +switch = off +volume = off + +[Element Video] +switch = off +volume = off + +[Element Mic/Line] +switch = off +volume = off + +[Element TV Tuner] +switch = off +volume = off + +[Element FM] +switch = off +volume = off + +[Element Inverted Internal Mic] +switch = off +volume = off + +[Element Mic Jack Mode] +enumeration = select + +[Option Mic Jack Mode:Mic In] +priority = 19 +name = input-microphone diff --git a/src/modules/alsa/mixer/paths/analog-input-rear-mic.conf b/src/modules/alsa/mixer/paths/analog-input-rear-mic.conf new file mode 100644 index 0000000..7136193 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input-rear-mic.conf @@ -0,0 +1,104 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; For devices where a 'Rear Mic' or 'Rear Mic Boost' element exists +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 82 +description-key = analog-input-microphone-rear + +[Jack Rear Mic] +required-any = any + +[Jack Rear Mic Phantom] +required-any = any +state.plugged = unknown +state.unplugged = unknown + +[Element Capture] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Rear Mic Boost] +required-any = any +switch = select +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Option Rear Mic Boost:on] +name = input-boost-on + +[Option Rear Mic Boost:off] +name = input-boost-off + +[Element Rear Mic] +required-any = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Input Source] +enumeration = select + +[Option Input Source:Rear Mic] +name = analog-input-microphone-rear +required-any = any + +[Element Capture Source] +enumeration = select + +[Option Capture Source:Rear Mic] +name = analog-input-microphone-rear +required-any = any + +[Element Mic] +switch = off +volume = off + +[Element Internal Mic] +switch = off +volume = off + +[Element Front Mic] +switch = off +volume = off + +[Element Dock Mic] +switch = off +volume = off + +[Element Mic Boost] +switch = off +volume = off + +[Element Dock Mic Boost] +switch = off +volume = off + +[Element Internal Mic Boost] +switch = off +volume = off + +[Element Front Mic Boost] +switch = off +volume = off + +.include analog-input-mic.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-input-tvtuner.conf b/src/modules/alsa/mixer/paths/analog-input-tvtuner.conf new file mode 100644 index 0000000..99d1d79 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input-tvtuner.conf @@ -0,0 +1,65 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; For devices where a 'TV Tuner' element exists +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 70 +description-key = analog-input-video + +[Element Capture] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Mic] +switch = off +volume = off + +[Element Internal Mic] +switch = off +volume = off + +[Element Line] +switch = off +volume = off + +[Element Aux] +switch = off +volume = off + +[Element Video] +switch = off +volume = off + +[Element Mic/Line] +switch = off +volume = off + +[Element TV Tuner] +required = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element FM] +switch = off +volume = off + +.include analog-input.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-input-video.conf b/src/modules/alsa/mixer/paths/analog-input-video.conf new file mode 100644 index 0000000..50c999e --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input-video.conf @@ -0,0 +1,64 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; For devices where a 'Video' element exists +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 70 + +[Element Capture] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Mic] +switch = off +volume = off + +[Element Internal Mic] +switch = off +volume = off + +[Element Line] +switch = off +volume = off + +[Element Aux] +switch = off +volume = off + +[Element Video] +required = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Mic/Line] +switch = off +volume = off + +[Element TV Tuner] +switch = off +volume = off + +[Element FM] +switch = off +volume = off + +.include analog-input.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-input.conf b/src/modules/alsa/mixer/paths/analog-input.conf new file mode 100644 index 0000000..c9db677 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input.conf @@ -0,0 +1,102 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; A fallback for devices that lack separate Mic/Line/Aux/Video/TV +; Tuner/FM elements +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 100 + +[Element Capture] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Mic] +required-absent = any + +[Element Mic Boost] +required-absent = any + +[Element Dock Mic] +required-absent = any + +[Element Dock Mic Boost] +required-absent = any + +[Element Front Mic] +required-absent = any + +[Element Front Mic Boost] +required-absent = any + +[Element Int Mic] +required-absent = any + +[Element Int Mic Boost] +required-absent = any + +[Element Internal Mic] +required-absent = any + +[Element Internal Mic Boost] +required-absent = any + +[Element Rear Mic] +required-absent = any + +[Element Rear Mic Boost] +required-absent = any + +[Element Headset] +required-absent = any + +[Element Headset Mic] +required-absent = any + +[Element Headset Mic Boost] +required-absent = any + +[Element Headphone Mic] +required-absent = any + +[Element Headphone Mic Boost] +required-absent = any + +[Element Line] +required-absent = any + +[Element Line Boost] +required-absent = any + +[Element Aux] +required-absent = any + +[Element Video] +required-absent = any + +[Element Mic/Line] +required-absent = any + +[Element TV Tuner] +required-absent = any + +[Element FM] +required-absent = any + +.include analog-input.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-input.conf.common b/src/modules/alsa/mixer/paths/analog-input.conf.common new file mode 100644 index 0000000..201087e --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-input.conf.common @@ -0,0 +1,289 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; Mixer path for PulseAudio's ALSA backend, common elements for all +; input paths. If multiple options by the same id are discovered they +; will be suffixed with a number to distinguish them, in the same +; order they appear here. +; +; Source selection should use the following names: +; +; input -- If we don't know the exact kind of input +; input-microphone +; input-microphone-internal +; input-microphone-external +; input-linein +; input-video +; input-radio +; input-docking-microphone +; input-docking-linein +; input-docking +; +; We explicitly don't want to wrap the following sources: +; +; CD +; Synth/MIDI +; Phone +; Mix +; Digital/SPDIF +; Master +; PC Speaker +; +; See analog-output.conf.common for an explanation on the directives + +;;; 'Input Source Select' + +[Element Input Source Select] +enumeration = select + +[Option Input Source Select:Input1] +name = input +priority = 10 + +[Option Input Source Select:Input2] +name = input +priority = 5 + +;;; 'Input Source' + +[Element Input Source] +enumeration = select + +[Option Input Source:Digital Mic] +name = input-microphone +priority = 20 + +[Option Input Source:Microphone] +name = input-microphone +priority = 20 + +[Option Input Source:Front Microphone] +name = input-microphone +priority = 19 + +[Option Input Source:Internal Mic 1] +name = input-microphone +priority = 19 + +[Option Input Source:Line-In] +name = input-linein +priority = 18 + +[Option Input Source:Line In] +name = input-linein +priority = 18 + +[Option Input Source:Docking-Station] +name = input-docking +priority = 17 + +[Option Input Source:AUX IN] +name = input +priority = 10 + +;;; 'Capture Source' + +[Element Capture Source] +enumeration = select + +[Option Capture Source:TV Tuner] +name = input-video + +[Option Capture Source:FM] +name = input-radio + +[Option Capture Source:Mic/Line] +name = input + +[Option Capture Source:Line/Mic] +name = input + +[Option Capture Source:Microphone] +name = input-microphone + +[Option Capture Source:Int DMic] +name = input-microphone-internal + +[Option Capture Source:iMic] +name = input-microphone-internal + +[Option Capture Source:i-Mic] +name = input-microphone-internal + +[Option Capture Source:Internal Microphone] +name = input-microphone-internal + +[Option Capture Source:Front Microphone] +name = input-microphone + +[Option Capture Source:Mic1] +name = input-microphone + +[Option Capture Source:Mic2] +name = input-microphone + +[Option Capture Source:D-Mic] +name = input-microphone + +[Option Capture Source:IntMic] +name = input-microphone-internal + +[Option Capture Source:ExtMic] +name = input-microphone-external + +[Option Capture Source:Ext Mic] +name = input-microphone-external + +[Option Capture Source:E-Mic] +name = input-microphone-external + +[Option Capture Source:e-Mic] +name = input-microphone-external + +[Option Capture Source:LineIn] +name = input-linein + +[Option Capture Source:Analog] +name = input + +[Option Capture Source:Line-In] +name = input-linein + +[Option Capture Source:Line In] +name = input-linein + +[Option Capture Source:Video] +name = input-video + +[Option Capture Source:Aux] +name = input + +[Option Capture Source:Aux0] +name = input + +[Option Capture Source:Aux1] +name = input + +[Option Capture Source:Aux2] +name = input + +[Option Capture Source:Aux3] +name = input + +[Option Capture Source:AUX IN] +name = input + +[Option Capture Source:Aux In] +name = input + +[Option Capture Source:AOUT] +name = input + +[Option Capture Source:AUX] +name = input + +[Option Capture Source:Cam Mic] +name = input-microphone + +[Option Capture Source:Digital Mic] +name = input-microphone + +[Option Capture Source:Digital Mic 1] +name = input-microphone + +[Option Capture Source:Digital Mic 2] +name = input-microphone + +[Option Capture Source:Analog Inputs] +name = input + +[Option Capture Source:Unknown1] +name = input + +[Option Capture Source:Unknown2] +name = input + +[Option Capture Source:Docking-Station] +name = input-docking + +;;; 'Mic Jack Mode' + +[Element Mic Jack Mode] +enumeration = select + +[Option Mic Jack Mode:Mic In] +name = input-microphone + +[Option Mic Jack Mode:Line In] +name = input-linein + +;;; 'Digital Input Source' + +[Element Digital Input Source] +enumeration = select + +[Option Digital Input Source:Digital Mic 1] +name = input-microphone + +[Option Digital Input Source:Analog Inputs] +name = input + +[Option Digital Input Source:Digital Mic 2] +name = input-microphone + +;;; 'Analog Source' + +[Element Analog Source] +enumeration = select + +[Option Analog Source:Mic] +name = input-microphone + +[Option Analog Source:Line in] +name = input-linein + +[Option Analog Source:Aux] +name = input + +;;; 'Shared Mic/Line in' + +[Element Shared Mic/Line in] +enumeration = select + +[Option Shared Mic/Line in:Mic in] +name = input-microphone + +[Option Shared Mic/Line in:Line in] +name = input-linein + +;;; Various Boosts + +[Element Capture Boost] +switch = select + +[Option Capture Boost:on] +name = input-boost-on + +[Option Capture Boost:off] +name = input-boost-off + +[Element Auto Gain Control] +switch = select + +[Option Auto Gain Control:on] +name = input-agc-on + +[Option Auto Gain Control:off] +name = input-agc-off diff --git a/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf b/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf new file mode 100644 index 0000000..1789990 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf @@ -0,0 +1,116 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; Path for the second headphone output on dual-headphone machines. +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 98 + +[Properties] +device.icon_name = audio-headphones + +; HP EliteDesk 800 SFF Headphone +[Jack Front Headphone,1] +required-any = any + +; HP EliteDesk 800 DM Headphone +[Jack Front Headphone Surround] +required-any = any + +[Element Hardware Master] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Master] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Master Mono] +switch = off +volume = off + +; This profile path is intended to control the second headphones, not +; the first headphones. But it should not hurt if we leave the +; headphone jack enabled nonetheless. +[Element Headphone] +switch = mute +volume = zero + +[Element Headphone,1] +required-any = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Headphone+LO] +switch = mute +volume = zero + +[Element Speaker+LO] +switch = off +volume = off + +[Element Headphone2] +required-any = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Speaker] +switch = off +volume = off + +[Element Desktop Speaker] +switch = off +volume = off + +; On some machines Front is actually a part of the Headphone path +[Element Front] +switch = mute +volume = zero + +[Element Rear] +switch = off +volume = off + +[Element Surround] +switch = off +volume = off + +[Element Side] +switch = off +volume = off + +[Element Center] +switch = off +volume = off + +[Element LFE] +switch = off +volume = off + +[Element Bass Speaker] +switch = off +volume = off + +.include analog-output.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-output-headphones.conf b/src/modules/alsa/mixer/paths/analog-output-headphones.conf new file mode 100644 index 0000000..88907f0 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-output-headphones.conf @@ -0,0 +1,174 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; Path for mixers that have a 'Headphone' control +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 99 +description-key = analog-output-headphones + +[Properties] +device.icon_name = audio-headphones + +[Jack Dock Headphone] +required-any = any + +[Jack Dock Headphone Phantom] +required-any = any +state.plugged = unknown +state.unplugged = unknown + +[Jack Front Headphone] +required-any = any + +; HP EliteDesk 800 DM Headset +[Jack Front Headphone Front] +required-any = any + +[Jack Front Headphone Phantom] +required-any = any +state.plugged = unknown +state.unplugged = unknown + +[Jack Headphone] +required-any = any + +[Jack Headphone Phantom] +required-any = any +state.plugged = unknown +state.unplugged = unknown + +# This jack can be either a headphone *or* a mic. Used on some ASUS netbooks. +[Jack Headphone Mic] +required-any = any + +[Jack Headphone - Output] +required-any = any + +[Element Hardware Master] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Master] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Master Mono] +switch = off +volume = off + +[Element Speaker+LO] +switch = off +volume = off + +[Element Headphone+LO] +required-any = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Headphone] +required-any = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +; This path is intended to control the first headphones, not +; the second headphones. But it should not hurt if we leave the second +; headphone jack enabled nonetheless. +[Element Headphone,1] +switch = mute +volume = zero + +[Element Headset] +required-any = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Line HP Swap] +switch = on +required-any = any + +; This profile path is intended to control the first headphones, not +; the second headphones. But it should not hurt if we leave the second +; headphone jack enabled nonetheless. +[Element Headphone2] +switch = mute +volume = zero + +[Element Speaker] +switch = off +volume = off + +[Element Desktop Speaker] +switch = off +volume = off + +; On some machines Front is actually a part of the Headphone path +[Element Front] +switch = mute +volume = zero + +[Element Rear] +switch = off +volume = off + +[Element Surround] +switch = off +volume = off + +[Element Side] +switch = off +volume = off + +[Element Center] +switch = off +volume = off + +[Element LFE] +switch = off +volume = off + +[Element Bass Speaker] +switch = off +volume = off + +[Element Speaker Front] +switch = off +volume = off + +[Element Speaker Surround] +switch = off +volume = off + +[Element Speaker Side] +switch = off +volume = off + +[Element Speaker CLFE] +switch = off +volume = off + +.include analog-output.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-output-lineout.conf b/src/modules/alsa/mixer/paths/analog-output-lineout.conf new file mode 100644 index 0000000..2dde159 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-output-lineout.conf @@ -0,0 +1,208 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +[General] +priority = 90 +description-key = analog-output-lineout + +[Jack Line Out] +required-any = any + +[Jack Line Out Phantom] +state.plugged = unknown +state.unplugged = unknown +required-any = any + +[Jack Front Line Out] +required-any = any + +[Jack Front Line Out Phantom] +state.plugged = unknown +state.unplugged = unknown +required-any = any + +[Jack Rear Line Out] +required-any = any + +[Jack Rear Line Out Phantom] +state.plugged = unknown +state.unplugged = unknown +required-any = any + +[Jack Line Out Front] +required-any = any + +[Jack Line Out Front Phantom] +state.plugged = unknown +state.unplugged = unknown +required-any = any + +[Jack Line Out CLFE] +state.plugged = unknown +state.unplugged = unknown +required-any = any + +[Jack Line Out CLFE Phantom] +state.plugged = unknown +state.unplugged = unknown +required-any = any + +[Jack Line Out Surround] +state.plugged = unknown +state.unplugged = unknown +required-any = any + +[Jack Line Out Surround Phantom] +state.plugged = unknown +state.unplugged = unknown +required-any = any + +[Jack Line Out Side] +state.plugged = unknown +state.unplugged = unknown +required-any = any + +[Jack Line Out Side Phantom] +state.plugged = unknown +state.unplugged = unknown +required-any = any + +[Jack Dock Line Out] +required-any = any + +[Jack Dock Line Out Phantom] +state.plugged = unknown +state.unplugged = unknown +required-any = any + +[Element Hardware Master] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Master] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Speaker+LO] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right +required-any = any + +[Element Headphone+LO] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right +required-any = any + +[Element Master Mono] +switch = off +volume = off + +[Element Line HP Swap] +switch = off +required-any = any + +; This profile path is intended to control line out, let's mute headphones +; else there will be a spike when plugging in headphones +[Element Headphone] +switch = off +volume = off + +[Element Headphone,1] +switch = off +volume = off + +[Element Headphone2] +switch = off +volume = off + +[Element Speaker] +switch = off +volume = off + +[Element Desktop Speaker] +switch = off +volume = off + +[Element Front] +switch = mute +volume = merge +override-map.1 = all-front +override-map.2 = front-left,front-right + +[Element Rear] +switch = mute +volume = merge +override-map.1 = all-rear +override-map.2 = rear-left,rear-right + +[Element Surround] +switch = mute +volume = merge +override-map.1 = all-rear +override-map.2 = rear-left,rear-right + +[Element Side] +switch = mute +volume = merge +override-map.1 = all-side +override-map.2 = side-left,side-right + +[Element Center] +switch = mute +volume = merge +override-map.1 = all-center +override-map.2 = all-center,all-center + +[Element LFE] +switch = mute +volume = merge +override-map.1 = lfe +override-map.2 = lfe,lfe + +[Element CLFE] +switch = mute +volume = merge +override-map.1 = all-center +override-map.2 = all-center,lfe + +[Element Bass Speaker] +switch = off +volume = off + +[Element Speaker Front] +switch = off +volume = off + +[Element Speaker Surround] +switch = off +volume = off + +[Element Speaker Side] +switch = off +volume = off + +[Element Speaker CLFE] +switch = off +volume = off + +.include analog-output.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-output-mono.conf b/src/modules/alsa/mixer/paths/analog-output-mono.conf new file mode 100644 index 0000000..5e49405 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-output-mono.conf @@ -0,0 +1,99 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; Intended for usage on boards that have a separate Mono output plug. +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 50 + +[Element Hardware Master] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Master] +switch = off +volume = off + +[Element Master Mono] +required = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +; This profile path is intended to control the speaker, not the +; headphones. But it should not hurt if we leave the headphone jack +; enabled nonetheless. +[Element Headphone] +switch = mute +volume = zero + +[Element Headphone,1] +switch = mute +volume = zero + +[Element Headphone+LO] +switch = mute +volume = zero + +[Element Headphone2] +switch = mute +volume = zero + +[Element Speaker] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Speaker+LO] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Desktop Speaker] +switch = off +volume = off + +[Element Front] +switch = off +volume = off + +[Element Rear] +switch = off +volume = off + +[Element Surround] +switch = off +volume = off + +[Element Side] +switch = off +volume = off + +[Element Center] +switch = off +volume = off + +[Element LFE] +switch = off +volume = off + +.include analog-output.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-output-speaker-always.conf b/src/modules/alsa/mixer/paths/analog-output-speaker-always.conf new file mode 100644 index 0000000..4ee72f5 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-output-speaker-always.conf @@ -0,0 +1,181 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; Path for mixers that don't have a 'Speaker' control, but where we +; force enable the speaker paths nonetheless. +; Needed for some older Dell laptops. +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 100 +description-key = analog-output-speaker + +[Properties] +device.icon_name = audio-speakers + +[Jack Headphone] +state.plugged = no +state.unplugged = unknown + +[Jack Front Headphone] +state.plugged = no +state.unplugged = unknown + +[Jack Line Out] +state.plugged = no +state.unplugged = unknown + +[Jack Line Out Front] +state.plugged = no +state.unplugged = unknown + +[Jack Front Line Out] +state.plugged = no +state.unplugged = unknown + +[Jack Rear Line Out] +state.plugged = no +state.unplugged = unknown + +[Jack Dock Line Out] +state.plugged = no +state.unplugged = unknown + +[Element Hardware Master] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Master] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Master Mono] +switch = off +volume = off + +; This profile path is intended to control the speaker, not the +; headphones. But it should not hurt if we leave the headphone jack +; enabled nonetheless. +[Element Headphone] +switch = mute +volume = zero + +[Element Headphone,1] +switch = mute +volume = zero + +[Element Headphone2] +switch = mute +volume = zero + +[Element Headphone+LO] +switch = off +volume = off + +[Element Speaker+LO] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Speaker] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Desktop Speaker] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Front] +switch = mute +volume = merge +override-map.1 = all-front +override-map.2 = front-left,front-right + +[Element Front Speaker] +switch = mute +volume = merge +override-map.1 = all-front +override-map.2 = front-left,front-right + +[Element Rear] +switch = mute +volume = merge +override-map.1 = all-rear +override-map.2 = rear-left,rear-right + +[Element Surround] +switch = mute +volume = merge +override-map.1 = all-rear +override-map.2 = rear-left,rear-right + +[Element Surround Speaker] +switch = mute +volume = merge +override-map.1 = all-rear +override-map.2 = rear-left,rear-right + +[Element Side] +switch = mute +volume = merge +override-map.1 = all-side +override-map.2 = side-left,side-right + +[Element Center] +switch = mute +volume = merge +override-map.1 = all-center +override-map.2 = all-center,all-center + +[Element Center Speaker] +switch = mute +volume = merge +override-map.1 = all-center +override-map.2 = all-center,all-center + +[Element LFE] +switch = mute +volume = merge +override-map.1 = lfe +override-map.2 = lfe,lfe + +[Element LFE Speaker] +switch = mute +volume = merge +override-map.1 = lfe +override-map.2 = lfe,lfe + +[Element Bass Speaker] +switch = mute +volume = merge +override-map.1 = lfe +override-map.2 = lfe,lfe + +[Element CLFE] +switch = mute +volume = merge +override-map.1 = all-center +override-map.2 = all-center,lfe + +.include analog-output.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-output-speaker.conf b/src/modules/alsa/mixer/paths/analog-output-speaker.conf new file mode 100644 index 0000000..fcf2f5c --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-output-speaker.conf @@ -0,0 +1,233 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; Path for mixers that have a 'Speaker' control +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 100 +description-key = analog-output-speaker + +[Properties] +device.icon_name = audio-speakers + +[Jack Headphone] +state.plugged = no +state.unplugged = unknown + +[Jack Dock Headphone] +state.plugged = no +state.unplugged = unknown + +[Jack Front Headphone] +state.plugged = no +state.unplugged = unknown + +[Jack Line Out] +state.plugged = no +state.unplugged = unknown + +[Jack Line Out Front] +state.plugged = no +state.unplugged = unknown + +[Jack Front Line Out] +state.plugged = no +state.unplugged = unknown + +[Jack Rear Line Out] +state.plugged = no +state.unplugged = unknown + +[Jack Dock Line Out] +state.plugged = no +state.unplugged = unknown + +[Jack Speaker] +required-any = any + +[Jack Speaker Phantom] +required-any = any +state.plugged = unknown +state.unplugged = unknown + +[Jack Speaker Front Phantom] +required-any = any +state.plugged = unknown +state.unplugged = unknown + +[Jack Speaker - Output] +required-any = any + +[Element Hardware Master] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Master] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Master Mono] +switch = off +volume = off + +; This profile path is intended to control the speaker, let's mute headphones +; else there will be a spike when plugging in headphones +[Element Headphone] +switch = off +volume = off + +[Element Headphone,1] +switch = off +volume = off + +[Element Headphone2] +switch = off +volume = off + +[Element Headphone+LO] +switch = off +volume = off + +[Element Speaker+LO] +required-any = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Speaker] +required-any = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Desktop Speaker] +required-any = any +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Front] +switch = mute +volume = merge +override-map.1 = all-front +override-map.2 = front-left,front-right + +[Element Front Speaker] +switch = mute +volume = merge +override-map.1 = all-front +override-map.2 = front-left,front-right +required-any = any + +[Element Speaker Front] +switch = mute +volume = merge +override-map.1 = all-front +override-map.2 = front-left,front-right +required-any = any + +[Element Rear] +switch = mute +volume = merge +override-map.1 = all-rear +override-map.2 = rear-left,rear-right + +[Element Surround] +switch = mute +volume = merge +override-map.1 = all-rear +override-map.2 = rear-left,rear-right + +[Element Surround Speaker] +switch = mute +volume = merge +override-map.1 = all-rear +override-map.2 = rear-left,rear-right +required-any = any + +[Element Speaker Surround] +switch = mute +volume = merge +override-map.1 = all-rear +override-map.2 = rear-left,rear-right +required-any = any + +[Element Side] +switch = mute +volume = merge +override-map.1 = all-side +override-map.2 = side-left,side-right + +[Element Speaker Side] +switch = mute +volume = merge +override-map.1 = all-side +override-map.2 = side-left,side-right + +[Element Center] +switch = mute +volume = merge +override-map.1 = all-center +override-map.2 = all-center,all-center + +[Element Center Speaker] +switch = mute +volume = merge +override-map.1 = all-center +override-map.2 = all-center,all-center +required-any = any + +[Element LFE] +switch = mute +volume = merge +override-map.1 = lfe +override-map.2 = lfe,lfe + +[Element LFE Speaker] +switch = mute +volume = merge +override-map.1 = lfe +override-map.2 = lfe,lfe +required-any = any + +[Element Bass Speaker] +switch = mute +volume = merge +override-map.1 = lfe +override-map.2 = lfe,lfe +required-any = any + +[Element CLFE] +switch = mute +volume = merge +override-map.1 = all-center +override-map.2 = all-center,lfe + +[Element Speaker CLFE] +switch = mute +volume = merge +override-map.1 = all-center +override-map.2 = all-center,lfe + +.include analog-output.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-output.conf b/src/modules/alsa/mixer/paths/analog-output.conf new file mode 100644 index 0000000..e6ba983 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-output.conf @@ -0,0 +1,82 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; Intended for the 'default' output. Note that a-o-speaker.conf has a +; higher priority than this +; +; See analog-output.conf.common for an explanation on the directives + +[General] +priority = 99 + +[Element Hardware Master] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Master] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element Master Mono] +switch = off +volume = off + +[Element Front] +switch = mute +volume = merge +override-map.1 = all-front +override-map.2 = front-left,front-right + +[Element Rear] +switch = mute +volume = merge +override-map.1 = all-rear +override-map.2 = rear-left,rear-right + +[Element Surround] +switch = mute +volume = merge +override-map.1 = all-rear +override-map.2 = rear-left,rear-right + +[Element Side] +switch = mute +volume = merge +override-map.1 = all-side +override-map.2 = side-left,side-right + +[Element Center] +switch = mute +volume = merge +override-map.1 = all-center +override-map.2 = all-center,all-center + +[Element LFE] +switch = mute +volume = merge +override-map.1 = lfe +override-map.2 = lfe,lfe + +[Element CLFE] +switch = mute +volume = merge +override-map.1 = all-center +override-map.2 = all-center,lfe + +.include analog-output.conf.common diff --git a/src/modules/alsa/mixer/paths/analog-output.conf.common b/src/modules/alsa/mixer/paths/analog-output.conf.common new file mode 100644 index 0000000..31d4b44 --- /dev/null +++ b/src/modules/alsa/mixer/paths/analog-output.conf.common @@ -0,0 +1,186 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; Common part of all paths + +; So here's generally how mixer paths are used by PA: PA goes through +; a mixer path file from top to bottom and checks if a mixer element +; described therein exists. If so it is added to the list of mixer +; elements PA will control, keeping the order it read them in. If a +; mixer element described here has set the required= or +; required-absent= directives a path might not be accepted as valid +; and is ignored in its entirety (see below). However usually if a +; element listed here is missing this one element is ignored but not +; the entire path. +; +; When a device shall be muted/unmuted *all* elements listed in a path +; file with "switch = mute" will be toggled. +; +; When a device shall change its volume, PA will got through the list +; of all elements with "volume = merge" and set the volume on the +; first element. If that element does not support dB volumes, this is +; where the story ends. If it does support dB volumes, PA divides the +; requested volume by the volume that was set on this element, and +; then go on to the next element with "volume = merge" and then set +; that there, and so on. That way the first volume element in the +; path will be the one that does the 'biggest' part of the overall +; volume adjustment, with the remaining elements usually being set to +; some value next to 0dB. This logic makes sure we get the full range +; over all volume sliders and a very high granularity of volumes +; already in hardware. +; +; All switches and enumerations set to "select" are exposed via the +; "port" functionality of sinks/sources. Basically every possible +; switch setting and every possible enumeration setting will be +; combined and made into a "port". So make sure you don't list too +; many switches/enums for exposing, because the number of ports might +; rise exponentially. +; +; Only one path can be selected at a time. All paths that are valid +; for an audio device will be exposed as "port" for the sink/source. + + +; [General] +; type = ... # The device type. It's highly recommended to set a type for every path. +; # See parse_type() in alsa-mixer.c for supported values. +; priority = ... # Priority for this path +; description-key = ... # The path description is looked up from a table in path_verify() in +; # src/modules/alsa/alsa-mixer.c. By default the path name (i.e. the file name +; # minus the ".conf" suffix) is used as the lookup key, but if this option is +; # set, then the given string is used as the key instead. In any case the +; # "description" option can be used to override the path description. +; description = ... # Description for this path. Overrides the normal description lookup logic, as +; # described in the "description-key" documentation above. +; mute-during-activation = yes | no # If this path supports hardware mute, should the hw mute be used while activating this +; # path? In some cases this can reduce extra noises during port switching, while in other +; # cases this can increase such noises. Default: no. +; eld-device = ... # If this is an HDMI port, set to "auto" so that PulseAudio will try to read +; # the monitor ELD information from the ALSA mixer. By default the ELD information +; # is not read, because it's only applicable with HDMI. Earlier the "auto" option +; # didn't exist, and the hw device index had to be manually configured. For +; # backwards compatibility, it's still possible to manually configure the device +; # index using this option. +; +; [Properties] # Property list for this path. The list is merged into the port property list. +; = # Each property is defined on its own line. +; ... +; +; [Option ...:...] # For each option of an enumeration or switch element +; # that shall be exposed as a sink/source port. Needs to +; # be named after the Element, followed by a colon, followed +; # by the option name, resp. on/off if the element is a switch. +; name = ... # Logical name to use in the path identifier +; priority = ... # Priority if this is made into a device port +; required = ignore | enumeration | any # In this element, this option must exist or the path will be invalid. ("any" is an alias for "enumeration".) +; required-any = ignore | enumeration | any # In this element, either this or another option must exist (or an element) +; required-absent = ignore | enumeration | any # In this element, this option must not exist or the path will be invalid +; +; [Element ...] # For each element that we shall control. The "..." here is the element name, +; # or name and index separated by a comma. +; required = ignore | switch | volume | enumeration | any # If set, require this element to be of this kind and available, +; # otherwise don't consider this path valid for the card +; required-any = ignore | switch | volume | enumeration | any # If set, at least one of the elements or jacks with required-any in this +; # path must be present, otherwise this path is invalid for the card +; required-absent = ignore | switch | volume # If set, require this element to not be of this kind and not +; # available, otherwise don't consider this path valid for the card +; +; switch = ignore | mute | off | on | select # What to do with this switch: ignore it, make it follow mute status, +; # always set it to off, always to on, or make it selectable as port. +; # If set to 'select' you need to define an Option section for on +; # and off +; volume = ignore | merge | off | zero | # What to do with this volume: ignore it, merge it into the device +; # volume slider, always set it to the lowest value possible, or always +; # set it to 0 dB (for whatever that means), or always set it to +; # (this only makes sense in path configurations where +; # the exact hardware and driver are known beforehand). +; volume-limit = # Limit the maximum volume by disabling the volume steps above . +; enumeration = ignore | select # What to do with this enumeration, ignore it or make it selectable +; # via device ports. If set to 'select' you need to define an Option section +; # for each of the items you want to expose +; direction = playback | capture # Is this relevant only for playback or capture? If not set this will implicitly be +; # set the direction of the PCM device is opened as. Generally this doesn't need to be set +; # unless you have a broken driver that has playback controls marked for capture or vice +; # versa +; direction-try-other = no | yes # If the element does not supported what is requested, try the other direction, too? +; +; override-map.1 = ... # Override the channel mask of the mixer control if the control only exposes a single channel +; override-map.2 = ... # Override the channel masks of the mixer control if the control only exposes two channels +; # Override maps should list for each element channel which high-level channels it controls via a +; # channel mask. A channel mask may either be the name of a single channel, or the words "all-left", +; # "all-right", "all-center", "all-front", "all-rear", and "all" to encode a specific subset of +; # channels in a mask +; [Jack ...] # For each jack that we will use for jack detection +; # The name 'Jack Foo' must match ALSA's 'Foo Jack' control. +; required = ignore | any # If not set to ignore, make the path invalid if this jack control is not present. +; required-absent = ignore | any # If not set to ignore, make the path invalid if this jack control is present. +; required-any = ignore | any # If not set to ignore, make the path invalid if no jack controls and no elements with +; # the required-any are present. +; state.plugged = yes | no | unknown # Normally a plugged jack would mean the port becomes available, and an unplugged means it's +; state.unplugged = yes | no | unknown # unavailable, but the port status can be overridden by specifying state.plugged and/or state.unplugged. +; append-pcm-to-name = no | yes # Add ",pcm=N" to the jack name? N is the hw PCM device index. HDMI jacks have +; # the PCM device index in their name, but different drivers use different +; # numbering schemes, so we can't hardcode the full jack name in our configuration +; # files. + +[Element PCM] +switch = mute +volume = merge +override-map.1 = all +override-map.2 = all-left,all-right + +[Element External Amplifier] +switch = select + +[Option External Amplifier:on] +name = output-amplifier-on +priority = 10 + +[Option External Amplifier:off] +name = output-amplifier-off +priority = 0 + +[Element Bass Boost] +switch = select + +[Option Bass Boost:on] +name = output-bass-boost-on +priority = 0 + +[Option Bass Boost:off] +name = output-bass-boost-off +priority = 10 + +[Element IEC958] +switch = off + +[Element IEC958 Optical Raw] +switch = off + +;;; 'Analog Output' + +[Element Analog Output] +enumeration = select + +[Option Analog Output:Speakers] +name = output-speaker +priority = 10 + +[Option Analog Output:Headphones] +name = output-headphones +priority = 9 + +[Option Analog Output:FP Headphones] +name = output-headphones +priority = 8 diff --git a/src/modules/alsa/mixer/paths/hdmi-output-0.conf b/src/modules/alsa/mixer/paths/hdmi-output-0.conf new file mode 100644 index 0000000..bb3cec1 --- /dev/null +++ b/src/modules/alsa/mixer/paths/hdmi-output-0.conf @@ -0,0 +1,12 @@ +[General] +description = HDMI / DisplayPort +type = hdmi +priority = 59 +eld-device = auto + +[Properties] +device.icon_name = video-display + +[Jack HDMI/DP] +append-pcm-to-name = yes +required = ignore diff --git a/src/modules/alsa/mixer/paths/hdmi-output-1.conf b/src/modules/alsa/mixer/paths/hdmi-output-1.conf new file mode 100644 index 0000000..3389a72 --- /dev/null +++ b/src/modules/alsa/mixer/paths/hdmi-output-1.conf @@ -0,0 +1,12 @@ +[General] +description = HDMI / DisplayPort 2 +type = hdmi +priority = 58 +eld-device = auto + +[Properties] +device.icon_name = video-display + +[Jack HDMI/DP] +append-pcm-to-name = yes +required = ignore diff --git a/src/modules/alsa/mixer/paths/hdmi-output-2.conf b/src/modules/alsa/mixer/paths/hdmi-output-2.conf new file mode 100644 index 0000000..316d810 --- /dev/null +++ b/src/modules/alsa/mixer/paths/hdmi-output-2.conf @@ -0,0 +1,12 @@ +[General] +description = HDMI / DisplayPort 3 +type = hdmi +priority = 57 +eld-device = auto + +[Properties] +device.icon_name = video-display + +[Jack HDMI/DP] +append-pcm-to-name = yes +required = ignore diff --git a/src/modules/alsa/mixer/paths/hdmi-output-3.conf b/src/modules/alsa/mixer/paths/hdmi-output-3.conf new file mode 100644 index 0000000..0601ef7 --- /dev/null +++ b/src/modules/alsa/mixer/paths/hdmi-output-3.conf @@ -0,0 +1,12 @@ +[General] +description = HDMI / DisplayPort 4 +type = hdmi +priority = 56 +eld-device = auto + +[Properties] +device.icon_name = video-display + +[Jack HDMI/DP] +append-pcm-to-name = yes +required = ignore diff --git a/src/modules/alsa/mixer/paths/hdmi-output-4.conf b/src/modules/alsa/mixer/paths/hdmi-output-4.conf new file mode 100644 index 0000000..ded155b --- /dev/null +++ b/src/modules/alsa/mixer/paths/hdmi-output-4.conf @@ -0,0 +1,12 @@ +[General] +description = HDMI / DisplayPort 5 +type = hdmi +priority = 55 +eld-device = auto + +[Properties] +device.icon_name = video-display + +[Jack HDMI/DP] +append-pcm-to-name = yes +required = ignore diff --git a/src/modules/alsa/mixer/paths/hdmi-output-5.conf b/src/modules/alsa/mixer/paths/hdmi-output-5.conf new file mode 100644 index 0000000..de31791 --- /dev/null +++ b/src/modules/alsa/mixer/paths/hdmi-output-5.conf @@ -0,0 +1,12 @@ +[General] +description = HDMI / DisplayPort 6 +type = hdmi +priority = 54 +eld-device = auto + +[Properties] +device.icon_name = video-display + +[Jack HDMI/DP] +append-pcm-to-name = yes +required = ignore diff --git a/src/modules/alsa/mixer/paths/hdmi-output-6.conf b/src/modules/alsa/mixer/paths/hdmi-output-6.conf new file mode 100644 index 0000000..6d72176 --- /dev/null +++ b/src/modules/alsa/mixer/paths/hdmi-output-6.conf @@ -0,0 +1,12 @@ +[General] +description = HDMI / DisplayPort 7 +type = hdmi +priority = 53 +eld-device = auto + +[Properties] +device.icon_name = video-display + +[Jack HDMI/DP] +append-pcm-to-name = yes +required = ignore diff --git a/src/modules/alsa/mixer/paths/hdmi-output-7.conf b/src/modules/alsa/mixer/paths/hdmi-output-7.conf new file mode 100644 index 0000000..d5d0771 --- /dev/null +++ b/src/modules/alsa/mixer/paths/hdmi-output-7.conf @@ -0,0 +1,12 @@ +[General] +description = HDMI / DisplayPort 8 +type = hdmi +priority = 52 +eld-device = auto + +[Properties] +device.icon_name = video-display + +[Jack HDMI/DP] +append-pcm-to-name = yes +required = ignore diff --git a/src/modules/alsa/mixer/paths/iec958-stereo-input.conf b/src/modules/alsa/mixer/paths/iec958-stereo-input.conf new file mode 100644 index 0000000..babc839 --- /dev/null +++ b/src/modules/alsa/mixer/paths/iec958-stereo-input.conf @@ -0,0 +1,20 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +[Element PCM Capture Source] +enumeration = select + +[Option PCM Capture Source:IEC958 In] +name = iec958-input diff --git a/src/modules/alsa/mixer/paths/iec958-stereo-output.conf b/src/modules/alsa/mixer/paths/iec958-stereo-output.conf new file mode 100644 index 0000000..d47e5eb --- /dev/null +++ b/src/modules/alsa/mixer/paths/iec958-stereo-output.conf @@ -0,0 +1,18 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + + +[Element IEC958] +switch = mute diff --git a/src/modules/alsa/mixer/paths/steelseries-arctis-output-chat-common.conf b/src/modules/alsa/mixer/paths/steelseries-arctis-output-chat-common.conf new file mode 100644 index 0000000..5842bfe --- /dev/null +++ b/src/modules/alsa/mixer/paths/steelseries-arctis-output-chat-common.conf @@ -0,0 +1,27 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; Steelseries Arctis 5 USB headset stereo chat path. The headset has two +; output devices. The first one is meant for voice audio, and the second +; one meant for everything else. The purpose of this unusual design is to +; provide separate volume controls for voice and other audio, which can be +; useful in gaming. + +[General] +priority = 50 + +[Element Com Speaker] +switch = mute +volume = merge diff --git a/src/modules/alsa/mixer/paths/steelseries-arctis-output-game-common.conf b/src/modules/alsa/mixer/paths/steelseries-arctis-output-game-common.conf new file mode 100644 index 0000000..b758a6f --- /dev/null +++ b/src/modules/alsa/mixer/paths/steelseries-arctis-output-game-common.conf @@ -0,0 +1,27 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; Steelseries Arctis 5 USB headset stereo game path. The headset has two +; output devices. The first one is meant for voice audio, and the second +; one meant for everything else. The purpose of this unusual design is to +; provide separate volume controls for voice and other audio, which can be +; useful in gaming. + +[General] +priority = 99 + +[Element PCM] +switch = mute +volume = merge diff --git a/src/modules/alsa/mixer/paths/usb-gaming-headset-input.conf b/src/modules/alsa/mixer/paths/usb-gaming-headset-input.conf new file mode 100644 index 0000000..9fa7fe9 --- /dev/null +++ b/src/modules/alsa/mixer/paths/usb-gaming-headset-input.conf @@ -0,0 +1,34 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; USB gaming headset microphone input path. These headsets usually have two +; output devices. The first one is mono, meant for voice audio, and the second +; one is stereo, meant for everything else. The purpose of this unusual design +; is to provide separate volume controls for voice and other audio, which can +; be useful in gaming. +; +; Works with: +; Steelseries Arctis 7 +; Steelseries Arctis Pro Wireless. +; Lucidsound LS31 + +[General] +description-key = analog-input-microphone-headset + +[Element Headset] +volume = merge +switch = mute +override-map.1 = all +override-map.2 = all-left,all-right diff --git a/src/modules/alsa/mixer/paths/usb-gaming-headset-output-mono.conf b/src/modules/alsa/mixer/paths/usb-gaming-headset-output-mono.conf new file mode 100644 index 0000000..6df662f --- /dev/null +++ b/src/modules/alsa/mixer/paths/usb-gaming-headset-output-mono.conf @@ -0,0 +1,34 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; USB gaming headset mono output path. These headsets usually have two +; output devices. The first one is mono, meant for voice audio, and the second +; one is stereo, meant for everything else. The purpose of this unusual design +; is to provide separate volume controls for voice and other audio, which can +; be useful in gaming. +; +; Works with: +; Steelseries Arctis 7 +; Steelseries Arctis Pro Wireless. +; Lucidsound LS31 + +[General] +description-key = analog-output-headphones-mono + +[Element PCM] +volume = merge +switch = mute +override-map.1 = all +override-map.2 = all-left,all-right diff --git a/src/modules/alsa/mixer/paths/usb-gaming-headset-output-stereo.conf b/src/modules/alsa/mixer/paths/usb-gaming-headset-output-stereo.conf new file mode 100644 index 0000000..e3f91cd --- /dev/null +++ b/src/modules/alsa/mixer/paths/usb-gaming-headset-output-stereo.conf @@ -0,0 +1,32 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; USB gaming headset mono output path. These headsets usually have two +; output devices. The first one is mono, meant for voice audio, and the second +; one is stereo, meant for everything else. The purpose of this unusual design +; is to provide separate volume controls for voice and other audio, which can +; be useful in gaming. +; +; Works with: +; Steelseries Arctis 7 +; Steelseries Arctis Pro Wireless. +; Lucidsound LS31 +; +; This path doesn't provide hardware volume control, because the stereo +; output is controlled by the PCM element with index 1, and currently +; PulseAudio only supports elements with index 0. + +[General] +description-key = analog-output-headphones diff --git a/src/modules/alsa/mixer/profile-sets/audigy.conf b/src/modules/alsa/mixer/profile-sets/audigy.conf new file mode 100644 index 0000000..043596e --- /dev/null +++ b/src/modules/alsa/mixer/profile-sets/audigy.conf @@ -0,0 +1,94 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; Creative Sound Blaster Audigy product line +; +; These are just copies of the mappings we find in default.conf, with the +; small change of making analog-stereo and analog-mono non-fallback mappings. +; This is needed because these cards only support duplex profiles with mono +; inputs, and in the default configuration, with stereo being a fallback +; mapping, the mono mapping is never tried. +; +; See default.conf for an explanation on the directives used here. + +[General] +auto-profiles = yes + +# Based on stereo-fallback +[Mapping analog-stereo] +device-strings = hw:%f +channel-map = front-left,front-right +paths-output = analog-output analog-output-lineout analog-output-speaker analog-output-headphones analog-output-headphones-2 +paths-input = analog-input-front-mic analog-input-rear-mic analog-input-internal-mic analog-input-dock-mic analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line analog-input-headphone-mic analog-input-headset-mic +priority = 1 + +# Based on mono-fallback +[Mapping analog-mono] +device-strings = hw:%f +channel-map = mono +paths-output = analog-output analog-output-lineout analog-output-speaker analog-output-headphones analog-output-headphones-2 analog-output-mono +paths-input = analog-input-front-mic analog-input-rear-mic analog-input-internal-mic analog-input-dock-mic analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line analog-input-headset-mic +priority = 1 + +# The rest of these are identical to what's in default.conf +[Mapping analog-surround-21] +device-strings = surround21:%f +channel-map = front-left,front-right,lfe +paths-output = analog-output analog-output-lineout analog-output-speaker +priority = 13 +direction = output + +[Mapping analog-surround-40] +device-strings = surround40:%f +channel-map = front-left,front-right,rear-left,rear-right +paths-output = analog-output analog-output-lineout analog-output-speaker +priority = 12 +direction = output + +[Mapping analog-surround-41] +device-strings = surround41:%f +channel-map = front-left,front-right,rear-left,rear-right,lfe +paths-output = analog-output analog-output-lineout analog-output-speaker +priority = 13 +direction = output + +[Mapping analog-surround-50] +device-strings = surround50:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center +paths-output = analog-output analog-output-lineout analog-output-speaker +priority = 12 +direction = output + +[Mapping analog-surround-51] +device-strings = surround51:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +paths-output = analog-output analog-output-lineout analog-output-speaker +priority = 13 +direction = output + +[Mapping analog-surround-71] +device-strings = surround71:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right +description = Analog Surround 7.1 +paths-output = analog-output analog-output-lineout analog-output-speaker +priority = 12 +direction = output + +[Mapping iec958-stereo] +device-strings = iec958:%f +channel-map = left,right +paths-input = iec958-stereo-input +paths-output = iec958-stereo-output +priority = 5 diff --git a/src/modules/alsa/mixer/profile-sets/cmedia-high-speed-true-hdaudio.conf b/src/modules/alsa/mixer/profile-sets/cmedia-high-speed-true-hdaudio.conf new file mode 100644 index 0000000..1b6f61c --- /dev/null +++ b/src/modules/alsa/mixer/profile-sets/cmedia-high-speed-true-hdaudio.conf @@ -0,0 +1,66 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +# Config for CMEDIA USB2.0 High-Speed True HD Audio 147a:e055 +# Added by Jean-Philippe Guillemin + + +[General] +auto-profiles = yes + +[Mapping analog-stereo] +device-strings = front:%f +channel-map = left,right +paths-output = analog-output analog-output-lineout analog-output-speaker analog-output-headphones analog-output-headphones-2 +paths-input = analog-input-front-mic analog-input-rear-mic analog-input-internal-mic analog-input-dock-mic analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line analog-input-headphone-mic analog-input-headset-mic +priority = 10 + +# If everything else fails, try to use hw:0 as a stereo device. +[Mapping stereo-fallback] +device-strings = hw:%f +fallback = yes +channel-map = front-left,front-right +paths-output = analog-output analog-output-lineout analog-output-speaker analog-output-headphones analog-output-headphones-2 +paths-input = analog-input-front-mic analog-input-rear-mic analog-input-internal-mic analog-input-dock-mic analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line analog-input-headphone-mic analog-input-headset-mic +priority = 1 + +[Mapping analog-surround-21] +device-strings = surround21:%f +channel-map = front-left,front-right,lfe +paths-output = analog-output analog-output-lineout analog-output-speaker +priority = 8 +direction = output + +[Mapping analog-surround-51] +device-strings = surround51:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +paths-output = analog-output analog-output-lineout analog-output-speaker +priority = 8 +direction = output + +[Mapping analog-surround-71] +device-strings = surround71:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right +description = Analog Surround 7.1 +paths-output = analog-output analog-output-lineout analog-output-speaker +priority = 7 +direction = output + +[Mapping iec958-stereo] +device-strings = hw:%f,2 hw:%f,0 +channel-map = left,right +paths-output = iec958-stereo-output +paths-input = iec958-stereo-input +priority = 5 diff --git a/src/modules/alsa/mixer/profile-sets/default.conf b/src/modules/alsa/mixer/profile-sets/default.conf new file mode 100644 index 0000000..9b691fe --- /dev/null +++ b/src/modules/alsa/mixer/profile-sets/default.conf @@ -0,0 +1,484 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; Default profile definitions for the ALSA backend of PulseAudio. This +; is used as fallback for all cards that have no special mapping +; assigned (and should be good enough for the vast majority of +; cards). If you want to assign a different profile set than this one +; to a device, either set the udev property PULSE_PROFILE_SET for the +; card, or use the "profile_set" module argument when loading +; module-alsa-card. +; +; So what is this about? Simply, what we do here is map ALSA devices +; to how they are exposed in PA. We say which ALSA device string to +; use to open a device, which channel mapping to use then, and which +; mixer path to use. This is encoded in a 'mapping'. Multiple of these +; mappings can be bound together in a 'profile' which is then directly +; exposed in the UI as a card profile. Each mapping assigned to a +; profile will result in one sink/source to be created if the profile +; is selected for the card. +; +; Additionally, the path set configuration files can describe the +; decibel values assigned to the steps of the volume elements. This +; can be used to work around situations when the alsa driver doesn't +; provide any decibel information, or when the information is +; incorrect. + + +; [General] +; auto-profiles = no | yes # Instead of defining all profiles manually, autogenerate +; # them by combining every input mapping with every output mapping. +; +; [Mapping id] +; device-strings = ... # ALSA device string. %f will be replaced by the card identifier. +; channel-map = ... # Channel mapping to use for this device +; description = ... # Description for the mapping. Note that it's better to set the description +; # in the well_known_descriptions table in alsa-mixer.c than with this +; # option, because the descriptions in alsa-mixer.c are translatable. +; description-key = ... # A custom key for the well_known_descriptions table (by default the mapping +; # name is used). +; paths-input = ... # A list of mixer paths to use. Every path in this list will be probed. +; # If multiple are found to be working they will be available as device ports +; paths-output = ... +; element-input = ... # Instead of configuring a full mixer path simply configure a single +; # mixer element for volume/mute handling. The value can be an element +; # name, or name and index separated by a comma. +; element-output = ... +; priority = ... +; direction = any | input | output # Only useful for? +; +; exact-channels = yes | no # If no, and the exact number of channels is not supported, +; # allow device to be opened with another channel count +; fallback = no | yes # This mapping will only be considered if all non-fallback mappings fail +; intended-roles = ... # Set the device.intended_roles property for the sink/source. +; +; [Profile id] +; input-mappings = ... # Lists mappings for sources on this profile, those mapping must be +; # defined in this file too +; output-mappings = ... # Lists mappings for sinks on this profile, those mappings must be +; # defined in this file too +; description = ... +; priority = ... # Numeric value to deduce priority for this profile +; skip-probe = no | yes # Skip probing for availability? If this is yes then this profile +; # will be assumed as working without probing. Makes initialization +; # a bit faster but only works if the card is really known well. +; +; fallback = no | yes # This profile will only be considered if all non-fallback profiles fail +; [DecibelFix element] # Decibel fixes can be used to work around missing or incorrect dB +; # information from alsa. A decibel fix is a table that maps volume steps +; # to decibel values for one volume element. The "element" part in the +; # section title is the name of the volume element (or name and index +; # separated by a comma). +; # +; # NOTE: This feature is meant just as a help for figuring out the correct +; # decibel values. PulseAudio is not the correct place to maintain the +; # decibel mappings! +; # +; # If you need this feature, then you should make sure that when you have +; # the correct values figured out, the alsa driver developers get informed +; # too, so that they can fix the driver. +; +; db-values = ... # The option value consists of pairs of step numbers and decibel values. +; # The pairs are separated with whitespace, and steps are separated from +; # the corresponding decibel values with a colon. The values must be in an +; # increasing order. Here's an example of a valid string: +; # +; # "0:-40.50 1:-38.70 3:-33.00 11:0" +; # +; # The lowest step imposes a lower limit for hardware volume and the +; # highest step correspondingly imposes a higher limit. That means that +; # that the mixer will never be set outside those values - the rest of the +; # volume scale is done using software volume. +; # +; # As can be seen in the example, you don't need to specify a dB value for +; # each step. The dB values for skipped steps will be linearly interpolated +; # using the nearest steps that are given. + +[General] +auto-profiles = yes + +[Mapping analog-stereo] +device-strings = front:%f +channel-map = left,right +paths-output = analog-output analog-output-lineout analog-output-speaker analog-output-headphones analog-output-headphones-2 +paths-input = analog-input-front-mic analog-input-rear-mic analog-input-internal-mic analog-input-dock-mic analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line analog-input-headphone-mic analog-input-headset-mic +priority = 15 + +# If everything else fails, try to use hw:0 as a stereo device... +[Mapping stereo-fallback] +device-strings = hw:%f +fallback = yes +channel-map = front-left,front-right +paths-output = analog-output analog-output-lineout analog-output-speaker analog-output-headphones analog-output-headphones-2 +paths-input = analog-input-front-mic analog-input-rear-mic analog-input-internal-mic analog-input-dock-mic analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line analog-input-headphone-mic analog-input-headset-mic +priority = 1 + +# ...and if even that fails, try to use hw:0 as a mono device. +[Mapping mono-fallback] +device-strings = hw:%f +fallback = yes +channel-map = mono +paths-output = analog-output analog-output-lineout analog-output-speaker analog-output-headphones analog-output-headphones-2 analog-output-mono +paths-input = analog-input-front-mic analog-input-rear-mic analog-input-internal-mic analog-input-dock-mic analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line analog-input-headset-mic +priority = 1 + +[Mapping analog-surround-21] +device-strings = surround21:%f +channel-map = front-left,front-right,lfe +paths-output = analog-output analog-output-lineout analog-output-speaker +priority = 13 +direction = output + +[Mapping analog-surround-40] +device-strings = surround40:%f +channel-map = front-left,front-right,rear-left,rear-right +paths-output = analog-output analog-output-lineout analog-output-speaker +priority = 12 +direction = output + +[Mapping analog-surround-41] +device-strings = surround41:%f +channel-map = front-left,front-right,rear-left,rear-right,lfe +paths-output = analog-output analog-output-lineout analog-output-speaker +priority = 13 +direction = output + +[Mapping analog-surround-50] +device-strings = surround50:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center +paths-output = analog-output analog-output-lineout analog-output-speaker +priority = 12 +direction = output + +[Mapping analog-surround-51] +device-strings = surround51:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +paths-output = analog-output analog-output-lineout analog-output-speaker +priority = 13 +direction = output + +[Mapping analog-surround-71] +device-strings = surround71:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right +description = Analog Surround 7.1 +paths-output = analog-output analog-output-lineout analog-output-speaker +priority = 12 +direction = output + +[Mapping iec958-stereo] +device-strings = iec958:%f +channel-map = left,right +paths-input = iec958-stereo-input +paths-output = iec958-stereo-output +priority = 5 + +[Mapping iec958-ac3-surround-40] +device-strings = a52:%f +channel-map = front-left,front-right,rear-left,rear-right +paths-output = iec958-stereo-output +priority = 2 +direction = output + +[Mapping iec958-ac3-surround-51] +device-strings = a52:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +paths-output = iec958-stereo-output +priority = 3 +direction = output + +[Mapping iec958-dts-surround-51] +device-strings = dca:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +paths-output = iec958-stereo-output +priority = 3 +direction = output + +[Mapping hdmi-stereo] +description = Digital Stereo (HDMI) +device-strings = hdmi:%f +paths-output = hdmi-output-0 +channel-map = left,right +priority = 9 +direction = output + +[Mapping hdmi-surround] +description = Digital Surround 5.1 (HDMI) +device-strings = hdmi:%f +paths-output = hdmi-output-0 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +priority = 8 +direction = output + +[Mapping hdmi-surround71] +description = Digital Surround 7.1 (HDMI) +device-strings = hdmi:%f +paths-output = hdmi-output-0 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right +priority = 8 +direction = output + +[Mapping hdmi-dts-surround] +description = Digital Surround 5.1 (HDMI/DTS) +device-strings = dcahdmi:%f +paths-output = hdmi-output-0 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +priority = 6 +direction = output + +[Mapping hdmi-stereo-extra1] +description = Digital Stereo (HDMI 2) +device-strings = hdmi:%f,1 +paths-output = hdmi-output-1 +channel-map = left,right +priority = 7 +direction = output + +[Mapping hdmi-surround-extra1] +description = Digital Surround 5.1 (HDMI 2) +device-strings = hdmi:%f,1 +paths-output = hdmi-output-1 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +priority = 6 +direction = output + +[Mapping hdmi-surround71-extra1] +description = Digital Surround 7.1 (HDMI 2) +device-strings = hdmi:%f,1 +paths-output = hdmi-output-1 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right +priority = 6 +direction = output + +[Mapping hdmi-dts-surround-extra1] +description = Digital Surround 5.1 (HDMI 2/DTS) +device-strings = dcahdmi:%f,1 +paths-output = hdmi-output-1 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +priority = 6 +direction = output + +[Mapping hdmi-stereo-extra2] +description = Digital Stereo (HDMI 3) +device-strings = hdmi:%f,2 +paths-output = hdmi-output-2 +channel-map = left,right +priority = 7 +direction = output + +[Mapping hdmi-surround-extra2] +description = Digital Surround 5.1 (HDMI 3) +device-strings = hdmi:%f,2 +paths-output = hdmi-output-2 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +priority = 6 +direction = output + +[Mapping hdmi-surround71-extra2] +description = Digital Surround 7.1 (HDMI 3) +device-strings = hdmi:%f,2 +paths-output = hdmi-output-2 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right +priority = 6 +direction = output + +[Mapping hdmi-dts-surround-extra2] +description = Digital Surround 5.1 (HDMI 3/DTS) +device-strings = dcahdmi:%f,2 +paths-output = hdmi-output-2 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +priority = 6 +direction = output + +[Mapping hdmi-stereo-extra3] +description = Digital Stereo (HDMI 4) +device-strings = hdmi:%f,3 +paths-output = hdmi-output-3 +channel-map = left,right +priority = 7 +direction = output + +[Mapping hdmi-surround-extra3] +description = Digital Surround 5.1 (HDMI 4) +device-strings = hdmi:%f,3 +paths-output = hdmi-output-3 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +priority = 6 +direction = output + +[Mapping hdmi-surround71-extra3] +description = Digital Surround 7.1 (HDMI 4) +device-strings = hdmi:%f,3 +paths-output = hdmi-output-3 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right +priority = 6 +direction = output + +[Mapping hdmi-dts-surround-extra3] +description = Digital Surround 5.1 (HDMI 4/DTS) +device-strings = dcahdmi:%f,3 +paths-output = hdmi-output-3 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +priority = 6 +direction = output + +[Mapping hdmi-stereo-extra4] +description = Digital Stereo (HDMI 5) +device-strings = hdmi:%f,4 +paths-output = hdmi-output-4 +channel-map = left,right +priority = 7 +direction = output + +[Mapping hdmi-surround-extra4] +description = Digital Surround 5.1 (HDMI 5) +device-strings = hdmi:%f,4 +paths-output = hdmi-output-4 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +priority = 6 +direction = output + +[Mapping hdmi-surround71-extra4] +description = Digital Surround 7.1 (HDMI 5) +device-strings = hdmi:%f,4 +paths-output = hdmi-output-4 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right +priority = 6 +direction = output + +[Mapping hdmi-dts-surround-extra4] +description = Digital Surround 5.1 (HDMI 5/DTS) +device-strings = dcahdmi:%f,4 +paths-output = hdmi-output-4 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +priority = 6 +direction = output + +[Mapping hdmi-stereo-extra5] +description = Digital Stereo (HDMI 6) +device-strings = hdmi:%f,5 +paths-output = hdmi-output-5 +channel-map = left,right +priority = 7 +direction = output + +[Mapping hdmi-surround-extra5] +description = Digital Surround 5.1 (HDMI 6) +device-strings = hdmi:%f,5 +paths-output = hdmi-output-5 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +priority = 6 +direction = output + +[Mapping hdmi-surround71-extra5] +description = Digital Surround 7.1 (HDMI 6) +device-strings = hdmi:%f,5 +paths-output = hdmi-output-5 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right +priority = 6 +direction = output + +[Mapping hdmi-dts-surround-extra5] +description = Digital Surround 5.1 (HDMI 6/DTS) +device-strings = dcahdmi:%f,5 +paths-output = hdmi-output-5 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +priority = 6 +direction = output + +[Mapping hdmi-stereo-extra6] +description = Digital Stereo (HDMI 7) +device-strings = hdmi:%f,6 +paths-output = hdmi-output-6 +channel-map = left,right +priority = 7 +direction = output + +[Mapping hdmi-surround-extra6] +description = Digital Surround 5.1 (HDMI 7) +device-strings = hdmi:%f,6 +paths-output = hdmi-output-6 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +priority = 6 +direction = output + +[Mapping hdmi-surround71-extra6] +description = Digital Surround 7.1 (HDMI 7) +device-strings = hdmi:%f,6 +paths-output = hdmi-output-6 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right +priority = 6 +direction = output + +[Mapping hdmi-dts-surround-extra6] +description = Digital Surround 5.1 (HDMI 7/DTS) +device-strings = dcahdmi:%f,6 +paths-output = hdmi-output-6 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +priority = 6 +direction = output + +[Mapping hdmi-stereo-extra7] +description = Digital Stereo (HDMI 8) +device-strings = hdmi:%f,7 +paths-output = hdmi-output-7 +channel-map = left,right +priority = 7 +direction = output + +[Mapping hdmi-surround-extra7] +description = Digital Surround 5.1 (HDMI 8) +device-strings = hdmi:%f,7 +paths-output = hdmi-output-7 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +priority = 6 +direction = output + +[Mapping hdmi-surround71-extra7] +description = Digital Surround 7.1 (HDMI 8) +device-strings = hdmi:%f,7 +paths-output = hdmi-output-7 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right +priority = 6 +direction = output + +[Mapping hdmi-dts-surround-extra7] +description = Digital Surround 5.1 (HDMI 8/DTS) +device-strings = dcahdmi:%f,7 +paths-output = hdmi-output-7 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +priority = 6 +direction = output + +[Mapping multichannel-output] +device-strings = hw:%f +channel-map = left,right,rear-left,rear-right +exact-channels = false +fallback = yes +priority = 1 +direction = output + +[Mapping multichannel-input] +device-strings = hw:%f +channel-map = left,right,rear-left,rear-right +exact-channels = false +fallback = yes +priority = 1 +direction = input + +; An example for defining multiple-sink profiles +#[Profile output:analog-stereo+output:iec958-stereo+input:analog-stereo] +#description = Foobar +#output-mappings = analog-stereo iec958-stereo +#input-mappings = analog-stereo diff --git a/src/modules/alsa/mixer/profile-sets/dell-dock-tb16-usb-audio.conf b/src/modules/alsa/mixer/profile-sets/dell-dock-tb16-usb-audio.conf new file mode 100644 index 0000000..1186552 --- /dev/null +++ b/src/modules/alsa/mixer/profile-sets/dell-dock-tb16-usb-audio.conf @@ -0,0 +1,55 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; Dell Dock TB16 USB audio +; +; This card has two stereo pairs of output, One Mono input. +; +; See default.conf for an explanation on the directives used here. + +[General] +auto-profiles = no + +[Mapping analog-stereo-headphone] +description = Headphone +device-strings = hw:%f,0,0 +channel-map = left,right +direction = output + +[Mapping analog-stereo-speaker] +description = Speaker +device-strings = hw:%f,1,0 +channel-map = left,right +direction = output + +[Mapping analog-stereo-mic] +description = Headset-Mic +device-strings = hw:%f,0,0 +channel-map = left,right +direction = input + + +[Profile output:analog-stereo-speaker] +description = Speaker +output-mappings = analog-stereo-speaker +priority = 60 +skip-probe = yes + +[Profile output:analog-stereo-headphone+input:analog-stereo-mic] +description = Headset +output-mappings = analog-stereo-headphone +input-mappings = analog-stereo-mic +priority = 80 +skip-probe = yes diff --git a/src/modules/alsa/mixer/profile-sets/force-speaker-and-int-mic.conf b/src/modules/alsa/mixer/profile-sets/force-speaker-and-int-mic.conf new file mode 100644 index 0000000..41924f4 --- /dev/null +++ b/src/modules/alsa/mixer/profile-sets/force-speaker-and-int-mic.conf @@ -0,0 +1,153 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; This profile forces speaker and internal mic ports even if we have no way +; of identifying those. +; See default.conf for explanations. + +[General] +auto-profiles = yes + +[Mapping analog-mono] +device-strings = hw:%f +channel-map = mono +paths-output = analog-output analog-output-lineout analog-output-speaker-always analog-output-headphones analog-output-headphones-2 analog-output-mono +paths-input = analog-input-front-mic analog-input-rear-mic analog-input-internal-mic-always analog-input-dock-mic analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line +priority = 1 + +[Mapping analog-stereo] +device-strings = front:%f hw:%f +channel-map = left,right +paths-output = analog-output analog-output-lineout analog-output-speaker-always analog-output-headphones analog-output-headphones-2 analog-output-mono +paths-input = analog-input-front-mic analog-input-rear-mic analog-input-internal-mic-always analog-input-dock-mic analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line +priority = 10 + +[Mapping analog-surround-21] +device-strings = surround21:%f +channel-map = front-left,front-right,lfe +paths-output = analog-output analog-output-lineout analog-output-speaker-always +priority = 8 +direction = output + +[Mapping analog-surround-40] +device-strings = surround40:%f +channel-map = front-left,front-right,rear-left,rear-right +paths-output = analog-output analog-output-lineout analog-output-speaker-always +priority = 7 +direction = output + +[Mapping analog-surround-41] +device-strings = surround41:%f +channel-map = front-left,front-right,rear-left,rear-right,lfe +paths-output = analog-output analog-output-lineout analog-output-speaker-always +priority = 8 +direction = output + +[Mapping analog-surround-50] +device-strings = surround50:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center +paths-output = analog-output analog-output-lineout analog-output-speaker-always +priority = 7 +direction = output + +[Mapping analog-surround-51] +device-strings = surround51:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +paths-output = analog-output analog-output-lineout analog-output-speaker-always +priority = 8 +direction = output + +[Mapping analog-surround-71] +device-strings = surround71:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right +description = Analog Surround 7.1 +paths-output = analog-output analog-output-lineout analog-output-speaker-always +priority = 7 +direction = output + +[Mapping analog-4-channel-input] +# Alsa doesn't currently provide any better device name than "hw" for 4-channel +# input. If this causes trouble at some point, then we will need to get a new +# device name standardized in alsa. +device-strings = hw:%f +channel-map = aux0,aux1,aux2,aux3 +priority = 1 +direction = input + +[Mapping iec958-stereo] +device-strings = iec958:%f +channel-map = left,right +paths-input = iec958-stereo-input +paths-output = iec958-stereo-output +priority = 5 + +[Mapping iec958-ac3-surround-40] +device-strings = a52:%f +channel-map = front-left,front-right,rear-left,rear-right +paths-output = iec958-stereo-output +priority = 2 +direction = output + +[Mapping iec958-ac3-surround-51] +device-strings = a52:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +paths-output = iec958-stereo-output +priority = 3 +direction = output + +[Mapping iec958-dts-surround-51] +device-strings = dca:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +paths-output = iec958-stereo-output +priority = 3 +direction = output + +[Mapping hdmi-stereo] +description = Digital Stereo (HDMI) +device-strings = hdmi:%f +paths-output = hdmi-output-0 +channel-map = left,right +priority = 4 +direction = output + +[Mapping hdmi-surround] +description = Digital Surround 5.1 (HDMI) +device-strings = hdmi:%f +paths-output = hdmi-output-0 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +priority = 3 +direction = output + +[Mapping hdmi-surround71] +description = Digital Surround 7.1 (HDMI) +device-strings = hdmi:%f +paths-output = hdmi-output-0 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right +priority = 3 +direction = output + +[Mapping hdmi-dts-surround] +description = Digital Surround 5.1 (HDMI/DTS) +device-strings = dcahdmi:%f +paths-output = hdmi-output-0 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +priority = 1 +direction = output + +; An example for defining multiple-sink profiles +#[Profile output:analog-stereo+output:iec958-stereo+input:analog-stereo] +#description = Foobar +#output-mappings = analog-stereo iec958-stereo +#input-mappings = analog-stereo diff --git a/src/modules/alsa/mixer/profile-sets/force-speaker.conf b/src/modules/alsa/mixer/profile-sets/force-speaker.conf new file mode 100644 index 0000000..dec57d5 --- /dev/null +++ b/src/modules/alsa/mixer/profile-sets/force-speaker.conf @@ -0,0 +1,152 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; This profile forces a speaker port even if we have no way of identifying it. +; See default.conf for explanations. + +[General] +auto-profiles = yes + +[Mapping analog-mono] +device-strings = hw:%f +channel-map = mono +paths-output = analog-output analog-output-lineout analog-output-speaker-always analog-output-headphones analog-output-headphones-2 analog-output-mono +paths-input = analog-input-front-mic analog-input-rear-mic analog-input-internal-mic analog-input-dock-mic analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line +priority = 1 + +[Mapping analog-stereo] +device-strings = front:%f hw:%f +channel-map = left,right +paths-output = analog-output analog-output-lineout analog-output-speaker-always analog-output-headphones analog-output-headphones-2 analog-output-mono +paths-input = analog-input-front-mic analog-input-rear-mic analog-input-internal-mic analog-input-dock-mic analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line +priority = 10 + +[Mapping analog-surround-21] +device-strings = surround21:%f +channel-map = front-left,front-right,lfe +paths-output = analog-output analog-output-lineout analog-output-speaker-always +priority = 8 +direction = output + +[Mapping analog-surround-40] +device-strings = surround40:%f +channel-map = front-left,front-right,rear-left,rear-right +paths-output = analog-output analog-output-lineout analog-output-speaker-always +priority = 7 +direction = output + +[Mapping analog-surround-41] +device-strings = surround41:%f +channel-map = front-left,front-right,rear-left,rear-right,lfe +paths-output = analog-output analog-output-lineout analog-output-speaker-always +priority = 8 +direction = output + +[Mapping analog-surround-50] +device-strings = surround50:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center +paths-output = analog-output analog-output-lineout analog-output-speaker-always +priority = 7 +direction = output + +[Mapping analog-surround-51] +device-strings = surround51:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +paths-output = analog-output analog-output-lineout analog-output-speaker-always +priority = 8 +direction = output + +[Mapping analog-surround-71] +device-strings = surround71:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right +description = Analog Surround 7.1 +paths-output = analog-output analog-output-lineout analog-output-speaker-always +priority = 7 +direction = output + +[Mapping analog-4-channel-input] +# Alsa doesn't currently provide any better device name than "hw" for 4-channel +# input. If this causes trouble at some point, then we will need to get a new +# device name standardized in alsa. +device-strings = hw:%f +channel-map = aux0,aux1,aux2,aux3 +priority = 1 +direction = input + +[Mapping iec958-stereo] +device-strings = iec958:%f +channel-map = left,right +paths-input = iec958-stereo-input +paths-output = iec958-stereo-output +priority = 5 + +[Mapping iec958-ac3-surround-40] +device-strings = a52:%f +channel-map = front-left,front-right,rear-left,rear-right +paths-output = iec958-stereo-output +priority = 2 +direction = output + +[Mapping iec958-ac3-surround-51] +device-strings = a52:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +paths-output = iec958-stereo-output +priority = 3 +direction = output + +[Mapping iec958-dts-surround-51] +device-strings = dca:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +paths-output = iec958-stereo-output +priority = 3 +direction = output + +[Mapping hdmi-stereo] +description = Digital Stereo (HDMI) +device-strings = hdmi:%f +paths-output = hdmi-output-0 +channel-map = left,right +priority = 4 +direction = output + +[Mapping hdmi-surround] +description = Digital Surround 5.1 (HDMI) +device-strings = hdmi:%f +paths-output = hdmi-output-0 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +priority = 3 +direction = output + +[Mapping hdmi-surround71] +description = Digital Surround 7.1 (HDMI) +device-strings = hdmi:%f +paths-output = hdmi-output-0 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right +priority = 3 +direction = output + +[Mapping hdmi-dts-surround] +description = Digital Surround 5.1 (HDMI/DTS) +device-strings = dcahdmi:%f +paths-output = hdmi-output-0 +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +priority = 1 +direction = output + +; An example for defining multiple-sink profiles +#[Profile output:analog-stereo+output:iec958-stereo+input:analog-stereo] +#description = Foobar +#output-mappings = analog-stereo iec958-stereo +#input-mappings = analog-stereo diff --git a/src/modules/alsa/mixer/profile-sets/kinect-audio.conf b/src/modules/alsa/mixer/profile-sets/kinect-audio.conf new file mode 100644 index 0000000..d51fd17 --- /dev/null +++ b/src/modules/alsa/mixer/profile-sets/kinect-audio.conf @@ -0,0 +1,38 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; Audio profile for the Microsoft Kinect Sensor device in UAC mode. +; +; Copyright (C) 2011 Antonio Ospite +; +; This device has an array of four microphones, and no playback capability. +; +; See default.conf for an explanation on the directives used here. + +[General] +auto-profiles = no + +[Mapping input-4-channels] +device-strings = hw:%f +channel-map = front-left,front-right,rear-left,rear-right +description = 4 Channels Input +direction = input +priority = 5 + +[Profile input:mic-array] +description = Microphone Array +input-mappings = input-4-channels +priority = 2 +skip-probe = yes diff --git a/src/modules/alsa/mixer/profile-sets/maudio-fasttrack-pro.conf b/src/modules/alsa/mixer/profile-sets/maudio-fasttrack-pro.conf new file mode 100644 index 0000000..5122907 --- /dev/null +++ b/src/modules/alsa/mixer/profile-sets/maudio-fasttrack-pro.conf @@ -0,0 +1,86 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; M-Audio FastTrack Pro +; +; This card has one duplex stereo channel called A and an additional +; stereo output channel called B. +; +; We knowingly only define a subset of the theoretically possible +; mapping combinations as profiles here. +; +; See default.conf for an explanation on the directives used here. + +[General] +auto-profiles = no + +[Mapping analog-stereo-a-output] +description = Analog Stereo Channel A +device-strings = hw:%f,0,0 +channel-map = left,right +direction = output + +; Try both device 0 and device 1 for input, see +; http://mailman.alsa-project.org/pipermail/alsa-devel/2012-March/050701.html +[Mapping analog-stereo-a-input] +description = Analog Stereo Channel A +device-strings = hw:%f,0,0 hw:%f,1,0 +channel-map = left,right +direction = input + +[Mapping analog-stereo-b-output] +description = Analog Stereo Channel B +device-strings = hw:%f,1,0 +channel-map = left,right +direction = output + +[Profile output:analog-stereo-all+input:analog-stereo-all] +description = Analog Stereo Duplex Channel A, Analog Stereo output Channel B +output-mappings = analog-stereo-a-output analog-stereo-b-output +input-mappings = analog-stereo-a-input +priority = 100 +skip-probe = yes + +[Profile output:analog-stereo-a-output+input:analog-stereo-a-input] +description = Analog Stereo Duplex Channel A +output-mappings = analog-stereo-a-output +input-mappings = analog-stereo-a-input +priority = 40 +skip-probe = yes + +[Profile output:analog-stereo-b+input:analog-stereo-b] +description = Analog Stereo Output Channel B +output-mappings = analog-stereo-b-output +input-mappings = +priority = 50 +skip-probe = yes + +[Profile output:analog-stereo-a] +description = Analog Stereo Output Channel A +output-mappings = analog-stereo-a-output +priority = 5 +skip-probe = yes + +[Profile output:analog-stereo-b] +description = Analog Stereo Output Channel B +output-mappings = analog-stereo-b-output +priority = 6 +skip-probe = yes + +[Profile input:analog-stereo-a] +description = Analog Stereo Input Channel A +input-mappings = analog-stereo-a-input +priority = 2 +skip-probe = yes diff --git a/src/modules/alsa/mixer/profile-sets/native-instruments-audio4dj.conf b/src/modules/alsa/mixer/profile-sets/native-instruments-audio4dj.conf new file mode 100644 index 0000000..f7cbc15 --- /dev/null +++ b/src/modules/alsa/mixer/profile-sets/native-instruments-audio4dj.conf @@ -0,0 +1,90 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; Native Instruments Audio 4 DJ +; +; This card has two stereo pairs of input and two stereo pairs of +; output, named channels A and B. Channel B has an additional +; Headphone connector. +; +; We knowingly only define a subset of the theoretically possible +; mapping combinations as profiles here. +; +; See default.conf for an explanation on the directives used here. + +[General] +auto-profiles = no + +[Mapping analog-stereo-a] +description = Analog Stereo Channel A +device-strings = hw:%f,0,0 +channel-map = left,right + +[Mapping analog-stereo-b-output] +description = Analog Stereo Channel B (Headphones) +device-strings = hw:%f,0,1 +channel-map = left,right +direction = output + +[Mapping analog-stereo-b-input] +description = Analog Stereo Channel B +device-strings = hw:%f,0,1 +channel-map = left,right +direction = input + +[Profile output:analog-stereo-all+input:analog-stereo-all] +description = Analog Stereo Duplex Channels A, B (Headphones) +output-mappings = analog-stereo-a analog-stereo-b-output +input-mappings = analog-stereo-a analog-stereo-b-input +priority = 100 +skip-probe = yes + +[Profile output:analog-stereo-a+input:analog-stereo-a] +description = Analog Stereo Duplex Channel A +output-mappings = analog-stereo-a +input-mappings = analog-stereo-a +priority = 40 +skip-probe = yes + +[Profile output:analog-stereo-b+input:analog-stereo-b] +description = Analog Stereo Duplex Channel B (Headphones) +output-mappings = analog-stereo-b-output +input-mappings = analog-stereo-b-input +priority = 50 +skip-probe = yes + +[Profile output:analog-stereo-a] +description = Analog Stereo Output Channel A +output-mappings = analog-stereo-a +priority = 5 +skip-probe = yes + +[Profile output:analog-stereo-b] +description = Analog Stereo Output Channel B (Headphones) +output-mappings = analog-stereo-b-output +priority = 6 +skip-probe = yes + +[Profile input:analog-stereo-a] +description = Analog Stereo Input Channel A +input-mappings = analog-stereo-a +priority = 2 +skip-probe = yes + +[Profile input:analog-stereo-b] +description = Analog Stereo Input Channel B +input-mappings = analog-stereo-b-input +priority = 1 +skip-probe = yes diff --git a/src/modules/alsa/mixer/profile-sets/native-instruments-audio8dj.conf b/src/modules/alsa/mixer/profile-sets/native-instruments-audio8dj.conf new file mode 100644 index 0000000..dc1b780 --- /dev/null +++ b/src/modules/alsa/mixer/profile-sets/native-instruments-audio8dj.conf @@ -0,0 +1,161 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; Native Instruments Audio 8 DJ +; +; This card has four stereo pairs of input and four stereo pairs of +; output, named channels A to D. Channel C has an additional Mic/Line +; connector, channel D an additional Headphone connector. +; +; We knowingly only define a subset of the theoretically possible +; mapping combinations as profiles here. +; +; See default.conf for an explanation on the directives used here. + +[General] +auto-profiles = no + +[Mapping analog-stereo-a] +description = Analog Stereo Channel A +device-strings = hw:%f,0,0 +channel-map = left,right + +[Mapping analog-stereo-b] +description = Analog Stereo Channel B +device-strings = hw:%f,0,1 +channel-map = left,right + +# Since we want to set a different description for channel C's/D's input +# and output we define two separate mappings for them +[Mapping analog-stereo-c-output] +description = Analog Stereo Channel C +device-strings = hw:%f,0,2 +channel-map = left,right +direction = output + +[Mapping analog-stereo-c-input] +description = Analog Stereo Channel C (Line/Mic) +device-strings = hw:%f,0,2 +channel-map = left,right +direction = input + +[Mapping analog-stereo-d-output] +description = Analog Stereo Channel D (Headphones) +device-strings = hw:%f,0,3 +channel-map = left,right +direction = output + +[Mapping analog-stereo-d-input] +description = Analog Stereo Channel D +device-strings = hw:%f,0,3 +channel-map = left,right +direction = input + +[Profile output:analog-stereo-all+input:analog-stereo-all] +description = Analog Stereo Duplex Channels A, B, C (Line/Mic), D (Headphones) +output-mappings = analog-stereo-a analog-stereo-b analog-stereo-c-output analog-stereo-d-output +input-mappings = analog-stereo-a analog-stereo-b analog-stereo-c-input analog-stereo-d-input +priority = 100 +skip-probe = yes + +[Profile output:analog-stereo-d+input:analog-stereo-c] +description = Analog Stereo Channel D (Headphones) Output, Channel C (Line/Mic) Input +output-mappings = analog-stereo-d-output +input-mappings = analog-stereo-c-input +priority = 90 +skip-probe = yes + +[Profile output:analog-stereo-c-d+input:analog-stereo-c-d] +description = Analog Stereo Duplex Channels C (Line/Mic), D (Line/Mic) +output-mappings = analog-stereo-c-output analog-stereo-d-output +input-mappings = analog-stereo-c-input analog-stereo-d-input +priority = 80 +skip-probe = yes + +[Profile output:analog-stereo-a+input:analog-stereo-a] +description = Analog Stereo Duplex Channel A +output-mappings = analog-stereo-a +input-mappings = analog-stereo-a +priority = 50 +skip-probe = yes + +[Profile output:analog-stereo-b+input:analog-stereo-b] +description = Analog Stereo Duplex Channel B +output-mappings = analog-stereo-b +input-mappings = analog-stereo-b +priority = 40 +skip-probe = yes + +[Profile output:analog-stereo-c+input:analog-stereo-c] +description = Analog Stereo Duplex Channel C (Line/Mic) +output-mappings = analog-stereo-c-output +input-mappings = analog-stereo-c-input +priority = 60 +skip-probe = yes + +[Profile output:analog-stereo-d+input:analog-stereo-d] +description = Analog Stereo Duplex Channel D (Headphones) +output-mappings = analog-stereo-d-output +input-mappings = analog-stereo-d-input +priority = 70 +skip-probe = yes + +[Profile output:analog-stereo-a] +description = Analog Stereo Output Channel A +output-mappings = analog-stereo-a +priority = 6 +skip-probe = yes + +[Profile output:analog-stereo-b] +description = Analog Stereo Output Channel B +output-mappings = analog-stereo-b +priority = 5 +skip-probe = yes + +[Profile output:analog-stereo-c] +description = Analog Stereo Output Channel C +output-mappings = analog-stereo-c-output +priority = 7 +skip-probe = yes + +[Profile output:analog-stereo-d] +description = Analog Stereo Output Channel D (Headphones) +output-mappings = analog-stereo-d-output +priority = 8 +skip-probe = yes + +[Profile input:analog-stereo-a] +description = Analog Stereo Input Channel A +input-mappings = analog-stereo-a +priority = 2 +skip-probe = yes + +[Profile input:analog-stereo-b] +description = Analog Stereo Input Channel B +input-mappings = analog-stereo-b +priority = 1 +skip-probe = yes + +[Profile input:analog-stereo-c] +description = Analog Stereo Input Channel C (Line/Mic) +input-mappings = analog-stereo-c-input +priority = 4 +skip-probe = yes + +[Profile input:analog-stereo-d] +description = Analog Stereo Input Channel D +input-mappings = analog-stereo-d-input +priority = 3 +skip-probe = yes diff --git a/src/modules/alsa/mixer/profile-sets/native-instruments-korecontroller.conf b/src/modules/alsa/mixer/profile-sets/native-instruments-korecontroller.conf new file mode 100644 index 0000000..35b3d06 --- /dev/null +++ b/src/modules/alsa/mixer/profile-sets/native-instruments-korecontroller.conf @@ -0,0 +1,84 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; Native Instruments Kore Controller +; +; This card has one stereo pairs of input and two stereo pairs of +; output, named "Master" and "Headphone". The master channel has +; an additional Coax S/PDIF connector which is always on. +; +; We knowingly only define a subset of the theoretically possible +; mapping combinations as profiles here. +; +; See default.conf for an explanation on the directives used here. + +[General] +auto-profiles = no + +[Mapping analog-stereo-master-out] +description = Analog Stereo Master Channel +device-strings = hw:%f,0,0 +channel-map = left,right + +[Mapping analog-stereo-headphone-out] +description = Analog Stereo Headphone Channel +device-strings = hw:%f,0,1 +channel-map = left,right +direction = output + +[Mapping analog-stereo-input] +description = Analog Stereo +device-strings = hw:%f,0,0 +channel-map = left,right +direction = input + +[Profile output:analog-stereo-all+input:analog-stereo-all] +description = Analog Stereo Duplex Master Output, Headphones Output +output-mappings = analog-stereo-master-out analog-stereo-headphone-out +input-mappings = analog-stereo-input +priority = 100 +skip-probe = yes + +[Profile output:analog-stereo-master+input:analog-stereo-input] +description = Analog Stereo Duplex Master Output +output-mappings = analog-stereo-master-out +input-mappings = analog-stereo-input +priority = 40 +skip-probe = yes + +[Profile output:analog-stereo-headphone-out+input:analog-stereo-input] +description = Analog Stereo Headphones Output +output-mappings = analog-stereo-headphone-out +input-mappings = analog-stereo-input +priority = 30 +skip-probe = yes + +[Profile output:analog-stereo-master] +description = Analog Stereo Master Output +output-mappings = analog-stereo-master-out +priority = 3 +skip-probe = yes + +[Profile output:analog-stereo-headphone] +description = Analog Stereo Headphones Output +output-mappings = analog-stereo-headphone-out +priority = 2 +skip-probe = yes + +[Profile input:analog-stereo-input] +description = Analog Stereo Input +input-mappings = analog-stereo-input +priority = 1 +skip-probe = yes diff --git a/src/modules/alsa/mixer/profile-sets/native-instruments-traktor-audio10.conf b/src/modules/alsa/mixer/profile-sets/native-instruments-traktor-audio10.conf new file mode 100644 index 0000000..c210297 --- /dev/null +++ b/src/modules/alsa/mixer/profile-sets/native-instruments-traktor-audio10.conf @@ -0,0 +1,130 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; Native Instruments Audio 10 DJ +; +; This card has five stereo pairs of input and five stereo pairs of +; output +; +; We knowingly only define a subset of the theoretically possible +; mapping combinations as profiles here. +; +; See default.conf for an explanation on the directives used here. + +[General] +auto-profiles = no + +[Mapping analog-stereo-out-main] +description = Analog Stereo Main +device-strings = hw:%f,0,0 +channel-map = left,right + +[Mapping analog-stereo-out-a] +description = Analog Stereo Channel A +device-strings = hw:%f,0,1 +channel-map = left,right +direction = output + +[Mapping analog-stereo-out-b] +description = Analog Stereo Channel B +device-strings = hw:%f,0,1 +channel-map = left,right +direction = output + +[Mapping analog-stereo-out-c] +description = Analog Stereo Channel C +device-strings = hw:%f,0,2 +channel-map = left,right +direction = output + +[Mapping analog-stereo-out-d] +description = Analog Stereo Channel D +device-strings = hw:%f,0,3 +channel-map = left,right +direction = output + +[Mapping analog-stereo-in-main] +description = Analog Stereo Main +device-strings = hw:%f,0,0 +channel-map = left,right + +[Mapping analog-stereo-in-a] +description = Analog Stereo Channel A +device-strings = hw:%f,0,1 +channel-map = left,right +direction = input + +[Mapping analog-stereo-in-b] +description = Analog Stereo Channel B +device-strings = hw:%f,0,1 +channel-map = left,right +direction = input + +[Mapping analog-stereo-in-c] +description = Analog Stereo Channel C +device-strings = hw:%f,0,2 +channel-map = left,right +direction = input + +[Mapping analog-stereo-in-d] +description = Analog Stereo Channel D +device-strings = hw:%f,0,3 +channel-map = left,right +direction = input + + + + +[Profile output:analog-stereo-all+input:analog-stereo-all] +description = Analog Stereo Duplex Channels Main, A, B, C, D +output-mappings = analog-stereo-out-main analog-stereo-out-a analog-stereo-out-b analog-stereo-out-c analog-stereo-out-d +input-mappings = analog-stereo-in-main analog-stereo-in-a analog-stereo-in-b analog-stereo-in-c analog-stereo-in-d +priority = 100 +skip-probe = yes + +[Profile output:analog-stereo-main+input:analog-stereo-main] +description = Analog Stereo Duplex Main +output-mappings = analog-stereo-out-main +input-mappings = analog-stereo-in-main +priority = 50 +skip-probe = yes + +[Profile output:analog-stereo-a+input:analog-stereo-a] +description = Analog Stereo Duplex Channel A +output-mappings = analog-stereo-out-a +input-mappings = analog-stereo-in-a +priority = 40 +skip-probe = yes + +[Profile output:analog-stereo-b+input:analog-stereo-b] +description = Analog Stereo Duplex Channel B +output-mappings = analog-stereo-out-b +input-mappings = analog-stereo-in-b +priority = 30 +skip-probe = yes + +[Profile output:analog-stereo-a+input:analog-stereo-c] +description = Analog Stereo Duplex Channel C +output-mappings = analog-stereo-out-c +input-mappings = analog-stereo-in-c +priority = 20 +skip-probe = yes + +[Profile output:analog-stereo-a+input:analog-stereo-d] +description = Analog Stereo Duplex Channel D +output-mappings = analog-stereo-out-d +input-mappings = analog-stereo-in-d +priority = 10 +skip-probe = yes diff --git a/src/modules/alsa/mixer/profile-sets/native-instruments-traktor-audio2.conf b/src/modules/alsa/mixer/profile-sets/native-instruments-traktor-audio2.conf new file mode 100644 index 0000000..145dace --- /dev/null +++ b/src/modules/alsa/mixer/profile-sets/native-instruments-traktor-audio2.conf @@ -0,0 +1,53 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; Native Instruments Traktor Audio 2 +; +; This card has two stereo pairs of output. +; +; See default.conf for an explanation on the directives used here. + +[General] +auto-profiles = no + +[Mapping analog-stereo-a] +description = Analog Stereo Channel A +device-strings = hw:%f,0,0 +channel-map = left,right +direction = output + +[Mapping analog-stereo-b] +description = Analog Stereo Channel B +device-strings = hw:%f,0,1 +channel-map = left,right +direction = output + +[Profile output:analog-stereo-a] +description = Analog Stereo Output Channel A +output-mappings = analog-stereo-a +priority = 60 +skip-probe = yes + +[Profile output:analog-stereo-b] +description = Analog Stereo Output Channel B +output-mappings = analog-stereo-b +priority = 50 +skip-probe = yes + +[Profile analog-stereo-all] +description = Analog Stereo Output Channels A & B +output-mappings = analog-stereo-a analog-stereo-b +priority = 100 +skip-probe = yes diff --git a/src/modules/alsa/mixer/profile-sets/native-instruments-traktor-audio6.conf b/src/modules/alsa/mixer/profile-sets/native-instruments-traktor-audio6.conf new file mode 100644 index 0000000..a08e9fc --- /dev/null +++ b/src/modules/alsa/mixer/profile-sets/native-instruments-traktor-audio6.conf @@ -0,0 +1,91 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; Native Instruments Audio 6 DJ +; +; This card has three stereo pairs of input and three stereo pairs of +; output +; +; We knowingly only define a subset of the theoretically possible +; mapping combinations as profiles here. +; +; See default.conf for an explanation on the directives used here. + +[General] +auto-profiles = no + +[Mapping analog-stereo-out-main] +description = Analog Stereo Main +device-strings = hw:%f,0,0 +channel-map = left,right + +[Mapping analog-stereo-out-a] +description = Analog Stereo Channel A +device-strings = hw:%f,0,1 +channel-map = left,right +direction = output + +[Mapping analog-stereo-out-b] +description = Analog Stereo Channel B +device-strings = hw:%f,0,1 +channel-map = left,right +direction = output + +[Mapping analog-stereo-in-main] +description = Analog Stereo Main +device-strings = hw:%f,0,0 +channel-map = left,right + +[Mapping analog-stereo-in-a] +description = Analog Stereo Channel A +device-strings = hw:%f,0,1 +channel-map = left,right +direction = input + +[Mapping analog-stereo-in-b] +description = Analog Stereo Channel B +device-strings = hw:%f,0,1 +channel-map = left,right +direction = input + + + +[Profile output:analog-stereo-all+input:analog-stereo-all] +description = Analog Stereo Duplex Channels A, B (Headphones) +output-mappings = analog-stereo-out-main analog-stereo-out-a analog-stereo-out-b +input-mappings = analog-stereo-in-main analog-stereo-in-a analog-stereo-in-b +priority = 100 +skip-probe = yes + +[Profile output:analog-stereo-main+input:analog-stereo-main] +description = Analog Stereo Duplex Channel Main +output-mappings = analog-stereo-out-main +input-mappings = analog-stereo-in-main +priority = 50 +skip-probe = yes + +[Profile output:analog-stereo-a+input:analog-stereo-a] +description = Analog Stereo Duplex Channel A +output-mappings = analog-stereo-out-a +input-mappings = analog-stereo-in-a +priority = 40 +skip-probe = yes + +[Profile output:analog-stereo-b+input:analog-stereo-b] +description = Analog Stereo Duplex Channel B +output-mappings = analog-stereo-out-b +input-mappings = analog-stereo-in-b +priority = 30 +skip-probe = yes diff --git a/src/modules/alsa/mixer/profile-sets/native-instruments-traktorkontrol-s4.conf b/src/modules/alsa/mixer/profile-sets/native-instruments-traktorkontrol-s4.conf new file mode 100644 index 0000000..934965f --- /dev/null +++ b/src/modules/alsa/mixer/profile-sets/native-instruments-traktorkontrol-s4.conf @@ -0,0 +1,80 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; Native Instruments Traktor Kontrol S4 +; +; This controller has two stereo pairs of input (named "Channel C" and +; "Channel D") and two stereo pairs of output, one "Main Out" and +; "Headphone Out". +; +; See default.conf for an explanation on the directives used here. + +[General] +auto-profiles = no + +[Mapping analog-stereo-output-main] +description = Analog Stereo Main Out +device-strings = hw:%f,0,0 +channel-map = left,right + +[Mapping analog-stereo-output-headphone] +description = Analog Stereo Headphones Out +device-strings = hw:%f,0,1 +channel-map = left,right +direction = output + +[Mapping analog-stereo-c-input] +description = Analog Stereo Channel C +device-strings = hw:%f,0,1 +channel-map = left,right +direction = input + +[Mapping analog-stereo-d-input] +description = Analog Stereo Channel D +device-strings = hw:%f,0,1 +channel-map = left,right +direction = input + +[Profile output:analog-stereo-all+input:analog-stereo-all] +description = Analog Stereo Duplex +output-mappings = analog-stereo-output-main analog-stereo-output-headphone +input-mappings = analog-stereo-c-input analog-stereo-d-input +priority = 100 +skip-probe = yes + +[Profile output:analog-stereo-main] +description = Analog Stereo Main Output +output-mappings = analog-stereo-output-main +priority = 4 +skip-probe = yes + +[Profile output:analog-stereo-headphone] +description = Analog Stereo Output Headphones Out +output-mappings = analog-stereo-output-headphone +priority = 3 +skip-probe = yes + +[Profile input:analog-stereo-c] +description = Analog Stereo Input Channel C +input-mappings = analog-stereo-c-input +priority = 2 +skip-probe = yes + +[Profile input:analog-stereo-d] +description = Analog Stereo Input Channel D +input-mappings = analog-stereo-d-input +priority = 1 +skip-probe = yes + diff --git a/src/modules/alsa/mixer/profile-sets/sb-omni-surround-5.1.conf b/src/modules/alsa/mixer/profile-sets/sb-omni-surround-5.1.conf new file mode 100644 index 0000000..d5d1d65 --- /dev/null +++ b/src/modules/alsa/mixer/profile-sets/sb-omni-surround-5.1.conf @@ -0,0 +1,112 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; Creative Sound Blaster Omni Surround 5.1 +; +; This config supports Linux 4.3-rc1+. +; By default there are some non-existing (physically) inputs and outputs that +; are not present in this config. +; Also in addition to natively supported modes (such as stereo, 5.1 and stereo +; S/PDIF) following useful output modes are added: 2.1, 4.0, 4.1 and 5.0. +; +; NOTE: in 2.1 and 4.1 physical LFE output will be different than in 5.1 mode. +; +; See default.conf for an explanation on the directives used here. + +[General] +auto-profiles = no + +[Mapping analog-stereo-input] +device-strings = hw:%f +channel-map = left,right +paths-input = analog-input-mic analog-input-linein +direction = input + +[Mapping analog-stereo-output] +device-strings = front:%f +channel-map = left,right +paths-output = analog-output +direction = output + +[Mapping analog-surround-21] +device-strings = surround51:%f +channel-map = front-left,front-right,aux1,aux2,aux3,lfe +paths-output = analog-output +direction = output + +[Mapping analog-surround-40] +device-strings = surround51:%f +channel-map = front-left,front-right,rear-left,rear-right +paths-output = analog-output +direction = output + +[Mapping analog-surround-41] +device-strings = surround51:%f +channel-map = front-left,front-right,rear-left,rear-right,aux1,lfe +paths-output = analog-output +direction = output + +[Mapping analog-surround-50] +device-strings = surround51:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center +paths-output = analog-output +direction = output + +[Mapping analog-surround-51] +device-strings = surround51:%f +channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe +paths-output = analog-output +direction = output + +[Mapping iec958-stereo] +device-strings = iec958:%f +channel-map = left,right +paths-output = iec958-stereo-output +direction = output + +[Profile output:analog-stereo-output+input:analog-stereo-input] +output-mappings = analog-stereo-output +input-mappings = analog-stereo-input +priority = 7 + +[Profile output:analog-surround-21+input:analog-stereo-input] +output-mappings = analog-surround-21 +input-mappings = analog-stereo-input +priority = 6 + +[Profile output:analog-surround-40+input:analog-stereo-input] +output-mappings = analog-surround-40 +input-mappings = analog-stereo-input +priority = 5 + +[Profile output:analog-surround-41+input:analog-stereo-input] +output-mappings = analog-surround-41 +input-mappings = analog-stereo-input +priority = 4 + +[Profile output:analog-surround-50+input:analog-stereo-input] +output-mappings = analog-surround-50 +input-mappings = analog-stereo-input +priority = 3 + +[Profile output:analog-surround-51+input:analog-stereo-input] +output-mappings = analog-surround-51 +input-mappings = analog-stereo-input +priority = 2 + +[Profile output:iec958-stereo+input:analog-stereo-input] +output-mappings = iec958-stereo +input-mappings = analog-stereo-input +priority = 1 diff --git a/src/modules/alsa/mixer/profile-sets/steelseries-arctis-common-usb-audio.conf b/src/modules/alsa/mixer/profile-sets/steelseries-arctis-common-usb-audio.conf new file mode 100644 index 0000000..0c58917 --- /dev/null +++ b/src/modules/alsa/mixer/profile-sets/steelseries-arctis-common-usb-audio.conf @@ -0,0 +1,23 @@ +[General] +auto-profiles = yes + +[Mapping analog-chat] +description-key = gaming-headset-chat +device-strings = hw:%f,0,0 +channel-map = left,right +paths-input = analog-input-mic +paths-output = steelseries-arctis-output-chat-common +intended-roles = phone + +[Mapping analog-game] +description-key = gaming-headset-game +device-strings = hw:%f,1,0 +channel-map = left,right +paths-output = steelseries-arctis-output-game-common +direction = output + +[Profile output:analog-chat+output:analog-game+input:analog-chat] +output-mappings = analog-chat analog-game +input-mappings = analog-chat +priority = 5100 +skip-probe = yes diff --git a/src/modules/alsa/mixer/profile-sets/usb-gaming-headset.conf b/src/modules/alsa/mixer/profile-sets/usb-gaming-headset.conf new file mode 100644 index 0000000..adda54d --- /dev/null +++ b/src/modules/alsa/mixer/profile-sets/usb-gaming-headset.conf @@ -0,0 +1,64 @@ +# This file is part of PulseAudio. +# +# PulseAudio 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 2.1 of the +# License, or (at your option) any later version. +# +# PulseAudio 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 Lesser General Public License +# along with PulseAudio; if not, see . + +; USB gaming headset. +; These headsets usually have two output devices. The first one is meant +; for voice audio, and the second one is meant for everything else. +; The purpose of this unusual design is to provide separate volume +; controls for voice and other audio, which can be useful in gaming. +; +; Works with: +; Steelseries Arctis 7 +; Steelseries Arctis Pro Wireless. +; Lucidsound LS31 +; Astro A50 +; +; See default.conf for an explanation on the directives used here. + +[General] +auto-profiles = yes + +[Mapping mono-chat] +description-key = gaming-headset-chat +device-strings = hw:%f,0,0 +channel-map = mono +paths-output = usb-gaming-headset-output-mono +paths-input = usb-gaming-headset-input +intended-roles = phone + +[Mapping stereo-chat] +description-key = gaming-headset-chat +device-strings = hw:%f,0,0 +channel-map = left,right +paths-output = usb-gaming-headset-output-stereo +paths-input = usb-gaming-headset-input +intended-roles = phone + +[Mapping stereo-game] +description-key = gaming-headset-game +device-strings = hw:%f,1,0 +channel-map = left,right +paths-output = usb-gaming-headset-output-stereo +direction = output + +[Profile output:mono-chat+output:stereo-game+input:mono-chat] +output-mappings = mono-chat stereo-game +input-mappings = mono-chat +priority = 5100 + +[Profile output:stereo-game+output:stereo-chat+input:mono-chat] +output-mappings = stereo-game stereo-chat +input-mappings = mono-chat +priority = 5100 diff --git a/src/modules/alsa/module-alsa-card.c b/src/modules/alsa/module-alsa-card.c new file mode 100644 index 0000000..08e655e --- /dev/null +++ b/src/modules/alsa/module-alsa-card.c @@ -0,0 +1,1115 @@ +/*** + This file is part of PulseAudio. + + Copyright 2009 Lennart Poettering + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include +#include +#include + +#include + +#ifdef HAVE_UDEV +#include +#endif + +#include "alsa-util.h" +#include "alsa-ucm.h" +#include "alsa-sink.h" +#include "alsa-source.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("ALSA Card"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(false); +PA_MODULE_USAGE( + "name= " + "card_name= " + "card_properties= " + "sink_name= " + "sink_properties= " + "source_name= " + "source_properties= " + "namereg_fail= " + "device_id= " + "format= " + "rate= " + "fragments= " + "fragment_size= " + "mmap= " + "tsched= " + "tsched_buffer_size= " + "tsched_buffer_watermark= " + "profile= " + "fixed_latency_range= " + "ignore_dB= " + "deferred_volume= " + "profile_set= " + "paths_dir= " + "use_ucm= " + "avoid_resampling= " + "control= " +); + +static const char* const valid_modargs[] = { + "name", + "card_name", + "card_properties", + "sink_name", + "sink_properties", + "source_name", + "source_properties", + "namereg_fail", + "device_id", + "format", + "rate", + "fragments", + "fragment_size", + "mmap", + "tsched", + "tsched_buffer_size", + "tsched_buffer_watermark", + "fixed_latency_range", + "profile", + "ignore_dB", + "deferred_volume", + "profile_set", + "paths_dir", + "use_ucm", + "avoid_resampling", + "control", + NULL +}; + +#define DEFAULT_DEVICE_ID "0" + +struct userdata { + pa_core *core; + pa_module *module; + + char *device_id; + int alsa_card_index; + + pa_hashmap *mixers; + pa_hashmap *jacks; + + pa_card *card; + + pa_modargs *modargs; + + pa_alsa_profile_set *profile_set; + + /* ucm stuffs */ + bool use_ucm; + pa_alsa_ucm_config ucm; + +}; + +struct profile_data { + pa_alsa_profile *profile; +}; + +static void add_profiles(struct userdata *u, pa_hashmap *h, pa_hashmap *ports) { + pa_alsa_profile *ap; + void *state; + + pa_assert(u); + pa_assert(h); + + PA_HASHMAP_FOREACH(ap, u->profile_set->profiles, state) { + struct profile_data *d; + pa_card_profile *cp; + pa_alsa_mapping *m; + uint32_t idx; + + cp = pa_card_profile_new(ap->name, ap->description, sizeof(struct profile_data)); + cp->priority = ap->priority ? ap->priority : 1; + cp->input_name = pa_xstrdup(ap->input_name); + cp->output_name = pa_xstrdup(ap->output_name); + + if (ap->output_mappings) { + cp->n_sinks = pa_idxset_size(ap->output_mappings); + + PA_IDXSET_FOREACH(m, ap->output_mappings, idx) { + if (u->use_ucm) + pa_alsa_ucm_add_ports_combination(NULL, &m->ucm_context, true, ports, cp, u->core); + else + pa_alsa_path_set_add_ports(m->output_path_set, cp, ports, NULL, u->core); + if (m->channel_map.channels > cp->max_sink_channels) + cp->max_sink_channels = m->channel_map.channels; + } + } + + if (ap->input_mappings) { + cp->n_sources = pa_idxset_size(ap->input_mappings); + + PA_IDXSET_FOREACH(m, ap->input_mappings, idx) { + if (u->use_ucm) + pa_alsa_ucm_add_ports_combination(NULL, &m->ucm_context, false, ports, cp, u->core); + else + pa_alsa_path_set_add_ports(m->input_path_set, cp, ports, NULL, u->core); + if (m->channel_map.channels > cp->max_source_channels) + cp->max_source_channels = m->channel_map.channels; + } + } + + d = PA_CARD_PROFILE_DATA(cp); + d->profile = ap; + + pa_hashmap_put(h, cp->name, cp); + } +} + +static void add_disabled_profile(pa_hashmap *profiles) { + pa_card_profile *p; + struct profile_data *d; + + p = pa_card_profile_new("off", _("Off"), sizeof(struct profile_data)); + + d = PA_CARD_PROFILE_DATA(p); + d->profile = NULL; + + pa_hashmap_put(profiles, p->name, p); +} + +static int card_set_profile(pa_card *c, pa_card_profile *new_profile) { + struct userdata *u; + struct profile_data *nd, *od; + uint32_t idx; + pa_alsa_mapping *am; + pa_queue *sink_inputs = NULL, *source_outputs = NULL; + int ret = 0; + + pa_assert(c); + pa_assert(new_profile); + pa_assert_se(u = c->userdata); + + nd = PA_CARD_PROFILE_DATA(new_profile); + od = PA_CARD_PROFILE_DATA(c->active_profile); + + if (od->profile && od->profile->output_mappings) + PA_IDXSET_FOREACH(am, od->profile->output_mappings, idx) { + if (!am->sink) + continue; + + if (nd->profile && + nd->profile->output_mappings && + pa_idxset_get_by_data(nd->profile->output_mappings, am, NULL)) + continue; + + sink_inputs = pa_sink_move_all_start(am->sink, sink_inputs); + pa_alsa_sink_free(am->sink); + am->sink = NULL; + } + + if (od->profile && od->profile->input_mappings) + PA_IDXSET_FOREACH(am, od->profile->input_mappings, idx) { + if (!am->source) + continue; + + if (nd->profile && + nd->profile->input_mappings && + pa_idxset_get_by_data(nd->profile->input_mappings, am, NULL)) + continue; + + source_outputs = pa_source_move_all_start(am->source, source_outputs); + pa_alsa_source_free(am->source); + am->source = NULL; + } + + /* if UCM is available for this card then update the verb */ + if (u->use_ucm) { + if (pa_alsa_ucm_set_profile(&u->ucm, c, nd->profile ? nd->profile->name : NULL, + od->profile ? od->profile->name : NULL) < 0) { + ret = -1; + goto finish; + } + } + + if (nd->profile && nd->profile->output_mappings) + PA_IDXSET_FOREACH(am, nd->profile->output_mappings, idx) { + + if (!am->sink) + am->sink = pa_alsa_sink_new(c->module, u->modargs, __FILE__, c, am); + + if (sink_inputs && am->sink) { + pa_sink_move_all_finish(am->sink, sink_inputs, false); + sink_inputs = NULL; + } + } + + if (nd->profile && nd->profile->input_mappings) + PA_IDXSET_FOREACH(am, nd->profile->input_mappings, idx) { + + if (!am->source) + am->source = pa_alsa_source_new(c->module, u->modargs, __FILE__, c, am); + + if (source_outputs && am->source) { + pa_source_move_all_finish(am->source, source_outputs, false); + source_outputs = NULL; + } + } + +finish: + if (sink_inputs) + pa_sink_move_all_fail(sink_inputs); + + if (source_outputs) + pa_source_move_all_fail(source_outputs); + + return ret; +} + +static void init_profile(struct userdata *u) { + uint32_t idx; + pa_alsa_mapping *am; + struct profile_data *d; + pa_alsa_ucm_config *ucm = &u->ucm; + + pa_assert(u); + + d = PA_CARD_PROFILE_DATA(u->card->active_profile); + + if (d->profile && u->use_ucm) { + /* Set initial verb */ + if (pa_alsa_ucm_set_profile(ucm, u->card, d->profile->name, NULL) < 0) { + pa_log("Failed to set ucm profile %s", d->profile->name); + return; + } + } + + if (d->profile && d->profile->output_mappings) + PA_IDXSET_FOREACH(am, d->profile->output_mappings, idx) + am->sink = pa_alsa_sink_new(u->module, u->modargs, __FILE__, u->card, am); + + if (d->profile && d->profile->input_mappings) + PA_IDXSET_FOREACH(am, d->profile->input_mappings, idx) + am->source = pa_alsa_source_new(u->module, u->modargs, __FILE__, u->card, am); +} + +static pa_available_t calc_port_state(pa_device_port *p, struct userdata *u) { + void *state; + pa_alsa_jack *jack; + pa_available_t pa = PA_AVAILABLE_UNKNOWN; + pa_device_port *port; + + PA_HASHMAP_FOREACH(jack, u->jacks, state) { + pa_available_t cpa; + + if (u->use_ucm) + port = pa_hashmap_get(u->card->ports, jack->name); + else { + if (jack->path) + port = jack->path->port; + else + continue; + } + + if (p != port) + continue; + + cpa = jack->plugged_in ? jack->state_plugged : jack->state_unplugged; + + if (cpa == PA_AVAILABLE_NO) { + /* If a plugged-in jack causes the availability to go to NO, it + * should override all other availability information (like a + * blacklist) so set and bail */ + if (jack->plugged_in) { + pa = cpa; + break; + } + + /* If the current availablility is unknown go the more precise no, + * but otherwise don't change state */ + if (pa == PA_AVAILABLE_UNKNOWN) + pa = cpa; + } else if (cpa == PA_AVAILABLE_YES) { + /* Output is available through at least one jack, so go to that + * level of availability. We still need to continue iterating through + * the jacks in case a jack is plugged in that forces the state to no + */ + pa = cpa; + } + } + return pa; +} + +struct temp_port_avail { + pa_device_port *port; + pa_available_t avail; +}; + +static int report_jack_state(snd_mixer_elem_t *melem, unsigned int mask) { + struct userdata *u = snd_mixer_elem_get_callback_private(melem); + snd_hctl_elem_t *elem = snd_mixer_elem_get_private(melem); + snd_ctl_elem_value_t *elem_value; + bool plugged_in; + void *state; + pa_alsa_jack *jack; + struct temp_port_avail *tp, *tports; + pa_card_profile *profile; + pa_available_t active_available = PA_AVAILABLE_UNKNOWN; + + pa_assert(u); + + /* Changing the jack state may cause a port change, and a port change will + * make the sink or source change the mixer settings. If there are multiple + * users having pulseaudio running, the mixer changes done by inactive + * users may mess up the volume settings for the active users, because when + * the inactive users change the mixer settings, those changes are picked + * up by the active user's pulseaudio instance and the changes are + * interpreted as if the active user changed the settings manually e.g. + * with alsamixer. Even single-user systems suffer from this, because gdm + * runs its own pulseaudio instance. + * + * We rerun this function when being unsuspended to catch up on jack state + * changes */ + if (u->card->suspend_cause & PA_SUSPEND_SESSION) + return 0; + + if (mask == SND_CTL_EVENT_MASK_REMOVE) + return 0; + + snd_ctl_elem_value_alloca(&elem_value); + if (snd_hctl_elem_read(elem, elem_value) < 0) { + pa_log_warn("Failed to read jack detection from '%s'", pa_strnull(snd_hctl_elem_get_name(elem))); + return 0; + } + + plugged_in = !!snd_ctl_elem_value_get_boolean(elem_value, 0); + + pa_log_debug("Jack '%s' is now %s", pa_strnull(snd_hctl_elem_get_name(elem)), plugged_in ? "plugged in" : "unplugged"); + + tports = tp = pa_xnew0(struct temp_port_avail, pa_hashmap_size(u->jacks)+1); + + PA_HASHMAP_FOREACH(jack, u->jacks, state) + if (jack->melem == melem) { + pa_alsa_jack_set_plugged_in(jack, plugged_in); + + if (u->use_ucm) { + /* When using UCM, pa_alsa_jack_set_plugged_in() maps the jack + * state to port availability. */ + continue; + } + + /* When not using UCM, we have to do the jack state -> port + * availability mapping ourselves. */ + pa_assert_se(tp->port = jack->path->port); + tp->avail = calc_port_state(tp->port, u); + tp++; + } + + /* Report available ports before unavailable ones: in case port 1 becomes available when port 2 becomes unavailable, + this prevents an unnecessary switch port 1 -> port 3 -> port 2 */ + + for (tp = tports; tp->port; tp++) + if (tp->avail != PA_AVAILABLE_NO) + pa_device_port_set_available(tp->port, tp->avail); + for (tp = tports; tp->port; tp++) + if (tp->avail == PA_AVAILABLE_NO) + pa_device_port_set_available(tp->port, tp->avail); + + for (tp = tports; tp->port; tp++) { + pa_alsa_port_data *data; + pa_sink *sink; + uint32_t idx; + + data = PA_DEVICE_PORT_DATA(tp->port); + + if (!data->suspend_when_unavailable) + continue; + + PA_IDXSET_FOREACH(sink, u->core->sinks, idx) { + if (sink->active_port == tp->port) + pa_sink_suspend(sink, tp->avail == PA_AVAILABLE_NO, PA_SUSPEND_UNAVAILABLE); + } + } + + /* Update profile availabilities. Ideally we would mark all profiles + * unavailable that contain unavailable devices. We can't currently do that + * in all cases, because if there are multiple sinks in a profile, and the + * profile contains a mix of available and unavailable ports, we don't know + * how the ports are distributed between the different sinks. It's possible + * that some sinks contain only unavailable ports, in which case we should + * mark the profile as unavailable, but it's also possible that all sinks + * contain at least one available port, in which case we should mark the + * profile as available. Until the data structures are improved so that we + * can distinguish between these two cases, we mark the problematic cases + * as available (well, "unknown" to be precise, but there's little + * practical difference). + * + * When all output ports are unavailable, we know that all sinks are + * unavailable, and therefore the profile is marked unavailable as well. + * The same applies to input ports as well, of course. + * + * If there are no output ports at all, but the profile contains at least + * one sink, then the output is considered to be available. */ + if (u->card->active_profile) + active_available = u->card->active_profile->available; + PA_HASHMAP_FOREACH(profile, u->card->profiles, state) { + pa_device_port *port; + void *state2; + bool has_input_port = false; + bool has_output_port = false; + bool found_available_input_port = false; + bool found_available_output_port = false; + pa_available_t available = PA_AVAILABLE_UNKNOWN; + + PA_HASHMAP_FOREACH(port, u->card->ports, state2) { + if (!pa_hashmap_get(port->profiles, profile->name)) + continue; + + if (port->direction == PA_DIRECTION_INPUT) { + has_input_port = true; + + if (port->available != PA_AVAILABLE_NO) + found_available_input_port = true; + } else { + has_output_port = true; + + if (port->available != PA_AVAILABLE_NO) + found_available_output_port = true; + } + } + + if ((has_input_port && !found_available_input_port) || (has_output_port && !found_available_output_port)) + available = PA_AVAILABLE_NO; + + /* We want to update the active profile's status last, so logic that + * may change the active profile based on profile availability status + * has an updated view of all profiles' availabilities. */ + if (profile == u->card->active_profile) + active_available = available; + else + pa_card_profile_set_available(profile, available); + } + + if (u->card->active_profile) + pa_card_profile_set_available(u->card->active_profile, active_available); + + pa_xfree(tports); + return 0; +} + +static pa_device_port* find_port_with_eld_device(struct userdata *u, int device) { + void *state; + pa_device_port *p; + + if (u->use_ucm) { + PA_HASHMAP_FOREACH(p, u->card->ports, state) { + pa_alsa_ucm_port_data *data = PA_DEVICE_PORT_DATA(p); + pa_assert(data->eld_mixer_device_name); + if (device == data->eld_device) + return p; + } + } else { + PA_HASHMAP_FOREACH(p, u->card->ports, state) { + pa_alsa_port_data *data = PA_DEVICE_PORT_DATA(p); + pa_assert(data->path); + if (device == data->path->eld_device) + return p; + } + } + return NULL; +} + +static int hdmi_eld_changed(snd_mixer_elem_t *melem, unsigned int mask) { + struct userdata *u = snd_mixer_elem_get_callback_private(melem); + snd_hctl_elem_t *elem = snd_mixer_elem_get_private(melem); + int device = snd_hctl_elem_get_device(elem); + const char *old_monitor_name; + pa_device_port *p; + pa_hdmi_eld eld; + bool changed = false; + + if (mask == SND_CTL_EVENT_MASK_REMOVE) + return 0; + + p = find_port_with_eld_device(u, device); + if (p == NULL) { + pa_log_error("Invalid device changed in ALSA: %d", device); + return 0; + } + + if (pa_alsa_get_hdmi_eld(elem, &eld) < 0) + memset(&eld, 0, sizeof(eld)); + + old_monitor_name = pa_proplist_gets(p->proplist, PA_PROP_DEVICE_PRODUCT_NAME); + if (eld.monitor_name[0] == '\0') { + changed |= old_monitor_name != NULL; + pa_proplist_unset(p->proplist, PA_PROP_DEVICE_PRODUCT_NAME); + } else { + changed |= (old_monitor_name == NULL) || (strcmp(old_monitor_name, eld.monitor_name) != 0); + pa_proplist_sets(p->proplist, PA_PROP_DEVICE_PRODUCT_NAME, eld.monitor_name); + } + + if (changed && mask != 0) + pa_subscription_post(u->core, PA_SUBSCRIPTION_EVENT_CARD|PA_SUBSCRIPTION_EVENT_CHANGE, u->card->index); + + return 0; +} + +static void init_eld_ctls(struct userdata *u) { + void *state; + pa_device_port *port; + + /* The code in this function expects ports to have a pa_alsa_port_data + * struct as their data, but in UCM mode ports don't have any data. Hence, + * the ELD controls can't currently be used in UCM mode. */ + PA_HASHMAP_FOREACH(port, u->card->ports, state) { + snd_mixer_t *mixer_handle; + snd_mixer_elem_t* melem; + int device; + + if (u->use_ucm) { + pa_alsa_ucm_port_data *data = PA_DEVICE_PORT_DATA(port); + device = data->eld_device; + if (device < 0 || !data->eld_mixer_device_name) + continue; + + mixer_handle = pa_alsa_open_mixer_by_name(u->mixers, data->eld_mixer_device_name, true); + } else { + pa_alsa_port_data *data = PA_DEVICE_PORT_DATA(port); + + pa_assert(data->path); + + device = data->path->eld_device; + if (device < 0) + continue; + + mixer_handle = pa_alsa_open_mixer(u->mixers, u->alsa_card_index, true); + } + + if (!mixer_handle) + continue; + + melem = pa_alsa_mixer_find_pcm(mixer_handle, "ELD", device); + if (melem) { + pa_alsa_mixer_set_fdlist(u->mixers, mixer_handle, u->core->mainloop); + snd_mixer_elem_set_callback(melem, hdmi_eld_changed); + snd_mixer_elem_set_callback_private(melem, u); + hdmi_eld_changed(melem, 0); + pa_log_info("ELD device found for port %s (%d).", port->name, device); + } + else + pa_log_debug("No ELD device found for port %s (%d).", port->name, device); + } +} + +static void init_jacks(struct userdata *u) { + void *state; + pa_alsa_path* path; + pa_alsa_jack* jack; + char buf[64]; + + u->jacks = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + + if (u->use_ucm) { + PA_LLIST_FOREACH(jack, u->ucm.jacks) + if (jack->has_control) + pa_hashmap_put(u->jacks, jack, jack); + } else { + /* See if we have any jacks */ + if (u->profile_set->output_paths) + PA_HASHMAP_FOREACH(path, u->profile_set->output_paths, state) + PA_LLIST_FOREACH(jack, path->jacks) + if (jack->has_control) + pa_hashmap_put(u->jacks, jack, jack); + + if (u->profile_set->input_paths) + PA_HASHMAP_FOREACH(path, u->profile_set->input_paths, state) + PA_LLIST_FOREACH(jack, path->jacks) + if (jack->has_control) + pa_hashmap_put(u->jacks, jack, jack); + } + + pa_log_debug("Found %d jacks.", pa_hashmap_size(u->jacks)); + + if (pa_hashmap_size(u->jacks) == 0) + return; + + PA_HASHMAP_FOREACH(jack, u->jacks, state) { + if (!jack->mixer_device_name) { + jack->mixer_handle = pa_alsa_open_mixer(u->mixers, u->alsa_card_index, false); + if (!jack->mixer_handle) { + pa_log("Failed to open mixer for card %d for jack detection", u->alsa_card_index); + continue; + } + } else { + jack->mixer_handle = pa_alsa_open_mixer_by_name(u->mixers, jack->mixer_device_name, false); + if (!jack->mixer_handle) { + pa_log("Failed to open mixer '%s' for jack detection", jack->mixer_device_name); + continue; + } + } + pa_alsa_mixer_set_fdlist(u->mixers, jack->mixer_handle, u->core->mainloop); + jack->melem = pa_alsa_mixer_find_card(jack->mixer_handle, &jack->alsa_id, 0); + if (!jack->melem) { + pa_alsa_mixer_id_to_string(buf, sizeof(buf), &jack->alsa_id); + pa_log_warn("Jack %s seems to have disappeared.", buf); + pa_alsa_jack_set_has_control(jack, false); + continue; + } + snd_mixer_elem_set_callback(jack->melem, report_jack_state); + snd_mixer_elem_set_callback_private(jack->melem, u); + report_jack_state(jack->melem, 0); + } +} + +static void prune_singleton_availability_groups(pa_hashmap *ports) { + pa_device_port *p; + pa_hashmap *group_counts; + void *state, *count; + const char *group; + + /* Collect groups and erase those that don't have more than 1 path */ + group_counts = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + + PA_HASHMAP_FOREACH(p, ports, state) { + if (p->availability_group) { + count = pa_hashmap_get(group_counts, p->availability_group); + pa_hashmap_remove(group_counts, p->availability_group); + pa_hashmap_put(group_counts, p->availability_group, PA_UINT_TO_PTR(PA_PTR_TO_UINT(count) + 1)); + } + } + + /* Now we have an availability_group -> count map, let's drop all groups + * that have only one member */ + PA_HASHMAP_FOREACH_KV(group, count, group_counts, state) { + if (count == PA_UINT_TO_PTR(1)) + pa_hashmap_remove(group_counts, group); + } + + PA_HASHMAP_FOREACH(p, ports, state) { + if (p->availability_group && !pa_hashmap_get(group_counts, p->availability_group)) { + pa_log_debug("Pruned singleton availability group %s from port %s", p->availability_group, p->name); + + pa_xfree(p->availability_group); + p->availability_group = NULL; + } + } + + pa_hashmap_free(group_counts); +} + +static void set_card_name(pa_card_new_data *data, pa_modargs *ma, const char *device_id) { + char *t; + const char *n; + + pa_assert(data); + pa_assert(ma); + pa_assert(device_id); + + if ((n = pa_modargs_get_value(ma, "card_name", NULL))) { + pa_card_new_data_set_name(data, n); + data->namereg_fail = true; + return; + } + + if ((n = pa_modargs_get_value(ma, "name", NULL))) + data->namereg_fail = true; + else { + n = device_id; + data->namereg_fail = false; + } + + t = pa_sprintf_malloc("alsa_card.%s", n); + pa_card_new_data_set_name(data, t); + pa_xfree(t); +} + +static pa_hook_result_t card_suspend_changed(pa_core *c, pa_card *card, struct userdata *u) { + void *state; + pa_alsa_jack *jack; + + if (card->suspend_cause == 0) { + /* We were unsuspended, update jack state in case it changed while we were suspended */ + PA_HASHMAP_FOREACH(jack, u->jacks, state) { + if (jack->melem) + report_jack_state(jack->melem, 0); + } + } + + return PA_HOOK_OK; +} + +static pa_hook_result_t sink_input_put_hook_callback(pa_core *c, pa_sink_input *sink_input, struct userdata *u) { + const char *role; + pa_sink *sink = sink_input->sink; + + pa_assert(sink); + + role = pa_proplist_gets(sink_input->proplist, PA_PROP_MEDIA_ROLE); + + /* new sink input linked to sink of this card */ + if (role && sink->card == u->card) + pa_alsa_ucm_roled_stream_begin(&u->ucm, role, PA_DIRECTION_OUTPUT); + + return PA_HOOK_OK; +} + +static pa_hook_result_t source_output_put_hook_callback(pa_core *c, pa_source_output *source_output, struct userdata *u) { + const char *role; + pa_source *source = source_output->source; + + pa_assert(source); + + role = pa_proplist_gets(source_output->proplist, PA_PROP_MEDIA_ROLE); + + /* new source output linked to source of this card */ + if (role && source->card == u->card) + pa_alsa_ucm_roled_stream_begin(&u->ucm, role, PA_DIRECTION_INPUT); + + return PA_HOOK_OK; +} + +static pa_hook_result_t sink_input_unlink_hook_callback(pa_core *c, pa_sink_input *sink_input, struct userdata *u) { + const char *role; + pa_sink *sink = sink_input->sink; + + pa_assert(sink); + + role = pa_proplist_gets(sink_input->proplist, PA_PROP_MEDIA_ROLE); + + /* new sink input unlinked from sink of this card */ + if (role && sink->card == u->card) + pa_alsa_ucm_roled_stream_end(&u->ucm, role, PA_DIRECTION_OUTPUT); + + return PA_HOOK_OK; +} + +static pa_hook_result_t source_output_unlink_hook_callback(pa_core *c, pa_source_output *source_output, struct userdata *u) { + const char *role; + pa_source *source = source_output->source; + + pa_assert(source); + + role = pa_proplist_gets(source_output->proplist, PA_PROP_MEDIA_ROLE); + + /* new source output unlinked from source of this card */ + if (role && source->card == u->card) + pa_alsa_ucm_roled_stream_end(&u->ucm, role, PA_DIRECTION_INPUT); + + return PA_HOOK_OK; +} + +int pa__init(pa_module *m) { + pa_card_new_data data; + bool ignore_dB = false; + struct userdata *u; + pa_reserve_wrapper *reserve = NULL; + const char *description; + const char *profile_str = NULL; + char *fn = NULL; + bool namereg_fail = false; + int err = -PA_MODULE_ERR_UNSPECIFIED, rval; + + pa_alsa_refcnt_inc(); + + pa_assert(m); + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + u->use_ucm = true; + u->ucm.core = m->core; + + u->mixers = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, + pa_xfree, (pa_free_cb_t) pa_alsa_mixer_free); + u->ucm.mixers = u->mixers; /* alias */ + + if (!(u->modargs = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments."); + goto fail; + } + + u->device_id = pa_xstrdup(pa_modargs_get_value(u->modargs, "device_id", DEFAULT_DEVICE_ID)); + + if ((u->alsa_card_index = snd_card_get_index(u->device_id)) < 0) { + pa_log("Card '%s' doesn't exist: %s", u->device_id, pa_alsa_strerror(u->alsa_card_index)); + goto fail; + } + + if (pa_modargs_get_value_boolean(u->modargs, "ignore_dB", &ignore_dB) < 0) { + pa_log("Failed to parse ignore_dB argument."); + goto fail; + } + + if (!pa_in_system_mode()) { + char *rname; + + if ((rname = pa_alsa_get_reserve_name(u->device_id))) { + reserve = pa_reserve_wrapper_get(m->core, rname); + pa_xfree(rname); + + if (!reserve) + goto fail; + } + } + + if (pa_modargs_get_value_boolean(u->modargs, "use_ucm", &u->use_ucm) < 0) { + pa_log("Failed to parse use_ucm argument."); + goto fail; + } + + /* Force ALSA to reread its configuration. This matters if our device + * was hot-plugged after ALSA has already read its configuration - see + * https://bugs.freedesktop.org/show_bug.cgi?id=54029 + */ + + snd_config_update_free_global(); + + rval = u->use_ucm ? pa_alsa_ucm_query_profiles(&u->ucm, u->alsa_card_index) : -1; + if (rval == -PA_ALSA_ERR_UCM_LINKED) { + err = -PA_MODULE_ERR_SKIP; + goto fail; + } + if (rval == 0) { + pa_log_info("Found UCM profiles"); + + u->profile_set = pa_alsa_ucm_add_profile_set(&u->ucm, &u->core->default_channel_map); + + /* hook start of sink input/source output to enable modifiers */ + /* A little bit later than module-role-cork */ + pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_SINK_INPUT_PUT], PA_HOOK_LATE+10, + (pa_hook_cb_t) sink_input_put_hook_callback, u); + pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_PUT], PA_HOOK_LATE+10, + (pa_hook_cb_t) source_output_put_hook_callback, u); + + /* hook end of sink input/source output to disable modifiers */ + /* A little bit later than module-role-cork */ + pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_SINK_INPUT_UNLINK], PA_HOOK_LATE+10, + (pa_hook_cb_t) sink_input_unlink_hook_callback, u); + pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_UNLINK], PA_HOOK_LATE+10, + (pa_hook_cb_t) source_output_unlink_hook_callback, u); + } + else { + u->use_ucm = false; +#ifdef HAVE_UDEV + fn = pa_udev_get_property(u->alsa_card_index, "PULSE_PROFILE_SET"); +#endif + + if (pa_modargs_get_value(u->modargs, "profile_set", NULL)) { + pa_xfree(fn); + fn = pa_xstrdup(pa_modargs_get_value(u->modargs, "profile_set", NULL)); + } + + u->profile_set = pa_alsa_profile_set_new(fn, &u->core->default_channel_map); + pa_xfree(fn); + } + + if (!u->profile_set) + goto fail; + + u->profile_set->ignore_dB = ignore_dB; + + pa_alsa_profile_set_probe(u->profile_set, u->mixers, u->device_id, &m->core->default_sample_spec, m->core->default_n_fragments, m->core->default_fragment_size_msec); + pa_alsa_profile_set_dump(u->profile_set); + + pa_card_new_data_init(&data); + data.driver = __FILE__; + data.module = m; + + pa_alsa_init_proplist_card(m->core, data.proplist, u->alsa_card_index); + + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, u->device_id); + pa_alsa_init_description(data.proplist, NULL); + set_card_name(&data, u->modargs, u->device_id); + + /* We need to give pa_modargs_get_value_boolean() a pointer to a local + * variable instead of using &data.namereg_fail directly, because + * data.namereg_fail is a bitfield and taking the address of a bitfield + * variable is impossible. */ + namereg_fail = data.namereg_fail; + if (pa_modargs_get_value_boolean(u->modargs, "namereg_fail", &namereg_fail) < 0) { + pa_log("Failed to parse namereg_fail argument."); + pa_card_new_data_done(&data); + goto fail; + } + data.namereg_fail = namereg_fail; + + if (reserve) + if ((description = pa_proplist_gets(data.proplist, PA_PROP_DEVICE_DESCRIPTION))) + pa_reserve_wrapper_set_application_device_name(reserve, description); + + add_profiles(u, data.profiles, data.ports); + + if (pa_hashmap_isempty(data.profiles)) { + pa_log("Failed to find a working profile."); + pa_card_new_data_done(&data); + goto fail; + } + + add_disabled_profile(data.profiles); + prune_singleton_availability_groups(data.ports); + + if (pa_modargs_get_proplist(u->modargs, "card_properties", data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_card_new_data_done(&data); + goto fail; + } + + /* The Intel HDMI LPE driver needs some special handling. When the HDMI + * cable is not plugged in, trying to play audio doesn't work. Any written + * audio is immediately discarded and an underrun is reported, and that + * results in an infinite loop of "fill buffer, handle underrun". To work + * around this issue, the suspend_when_unavailable flag is used to stop + * playback when the HDMI cable is unplugged. */ + if (!u->use_ucm && + pa_safe_streq(pa_proplist_gets(data.proplist, "alsa.driver_name"), "snd_hdmi_lpe_audio")) { + pa_device_port *port; + void *state; + + PA_HASHMAP_FOREACH(port, data.ports, state) { + pa_alsa_port_data *port_data; + + port_data = PA_DEVICE_PORT_DATA(port); + port_data->suspend_when_unavailable = true; + } + } + + u->card = pa_card_new(m->core, &data); + pa_card_new_data_done(&data); + + if (!u->card) + goto fail; + + u->card->userdata = u; + u->card->set_profile = card_set_profile; + + pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_CARD_SUSPEND_CHANGED], PA_HOOK_NORMAL, + (pa_hook_cb_t) card_suspend_changed, u); + + init_jacks(u); + + pa_card_choose_initial_profile(u->card); + + /* If the "profile" modarg is given, we have to override whatever the usual + * policy chose in pa_card_choose_initial_profile(). */ + profile_str = pa_modargs_get_value(u->modargs, "profile", NULL); + if (profile_str) { + pa_card_profile *profile; + + profile = pa_hashmap_get(u->card->profiles, profile_str); + if (!profile) { + pa_log("No such profile: %s", profile_str); + goto fail; + } + + pa_card_set_profile(u->card, profile, false); + } + + pa_card_put(u->card); + + init_profile(u); + init_eld_ctls(u); + + /* Remove all probe only mixers */ + if (u->mixers) { + const char *devname; + pa_alsa_mixer *pm; + void *state; + PA_HASHMAP_FOREACH_KV(devname, pm, u->mixers, state) + if (pm->used_for_probe_only) + pa_hashmap_remove_and_free(u->mixers, devname); + } + + if (reserve) + pa_reserve_wrapper_unref(reserve); + + if (!pa_hashmap_isempty(u->profile_set->decibel_fixes)) + pa_log_warn("Card %s uses decibel fixes (i.e. overrides the decibel information for some alsa volume elements). " + "Please note that this feature is meant just as a help for figuring out the correct decibel values. " + "PulseAudio is not the correct place to maintain the decibel mappings! The fixed decibel values " + "should be sent to ALSA developers so that they can fix the driver. If it turns out that this feature " + "is abused (i.e. fixes are not pushed to ALSA), the decibel fix feature may be removed in some future " + "PulseAudio version.", u->card->name); + + return 0; + +fail: + if (reserve) + pa_reserve_wrapper_unref(reserve); + + pa__done(m); + + return err; +} + +int pa__get_n_used(pa_module *m) { + struct userdata *u; + int n = 0; + uint32_t idx; + pa_sink *sink; + pa_source *source; + + pa_assert(m); + pa_assert_se(u = m->userdata); + pa_assert(u->card); + + PA_IDXSET_FOREACH(sink, u->card->sinks, idx) + n += pa_sink_linked_by(sink); + + PA_IDXSET_FOREACH(source, u->card->sources, idx) + n += pa_source_linked_by(source); + + return n; +} + +void pa__done(pa_module*m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + goto finish; + + if (u->mixers) + pa_hashmap_free(u->mixers); + if (u->jacks) + pa_hashmap_free(u->jacks); + + if (u->card && u->card->sinks) + pa_idxset_remove_all(u->card->sinks, (pa_free_cb_t) pa_alsa_sink_free); + + if (u->card && u->card->sources) + pa_idxset_remove_all(u->card->sources, (pa_free_cb_t) pa_alsa_source_free); + + if (u->card) + pa_card_free(u->card); + + if (u->modargs) + pa_modargs_free(u->modargs); + + if (u->profile_set) + pa_alsa_profile_set_free(u->profile_set); + + pa_alsa_ucm_free(&u->ucm); + + pa_xfree(u->device_id); + pa_xfree(u); + +finish: + pa_alsa_refcnt_dec(); +} diff --git a/src/modules/alsa/module-alsa-sink.c b/src/modules/alsa/module-alsa-sink.c new file mode 100644 index 0000000..a90c5e4 --- /dev/null +++ b/src/modules/alsa/module-alsa-sink.c @@ -0,0 +1,137 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2008 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "alsa-util.h" +#include "alsa-sink.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("ALSA Sink"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(false); +PA_MODULE_USAGE( + "name= " + "sink_name= " + "sink_properties= " + "namereg_fail= " + "device= " + "device_id= " + "format= " + "rate= " + "alternate_rate= " + "channels= " + "channel_map= " + "fragments= " + "fragment_size= " + "mmap= " + "tsched= " + "tsched_buffer_size= " + "tsched_buffer_watermark= " + "ignore_dB= " + "control= " + "rewind_safeguard= " + "deferred_volume= " + "deferred_volume_safety_margin= " + "deferred_volume_extra_delay= " + "fixed_latency_range="); + +static const char* const valid_modargs[] = { + "name", + "sink_name", + "sink_properties", + "namereg_fail", + "device", + "device_id", + "format", + "rate", + "alternate_rate", + "channels", + "channel_map", + "fragments", + "fragment_size", + "mmap", + "tsched", + "tsched_buffer_size", + "tsched_buffer_watermark", + "ignore_dB", + "control", + "rewind_safeguard", + "deferred_volume", + "deferred_volume_safety_margin", + "deferred_volume_extra_delay", + "fixed_latency_range", + NULL +}; + +int pa__init(pa_module*m) { + pa_modargs *ma = NULL; + + pa_assert(m); + + pa_alsa_refcnt_inc(); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + if (!(m->userdata = pa_alsa_sink_new(m, ma, __FILE__, NULL, NULL))) + goto fail; + + pa_modargs_free(ma); + + return 0; + +fail: + + if (ma) + pa_modargs_free(ma); + + pa__done(m); + + return -1; +} + +int pa__get_n_used(pa_module *m) { + pa_sink *sink; + + pa_assert(m); + pa_assert_se(sink = m->userdata); + + return pa_sink_linked_by(sink); +} + +void pa__done(pa_module*m) { + pa_sink *sink; + + pa_assert(m); + + if ((sink = m->userdata)) + pa_alsa_sink_free(sink); + + pa_alsa_refcnt_dec(); +} diff --git a/src/modules/alsa/module-alsa-source.c b/src/modules/alsa/module-alsa-source.c new file mode 100644 index 0000000..d152283 --- /dev/null +++ b/src/modules/alsa/module-alsa-source.c @@ -0,0 +1,144 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2008 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include + +#ifdef HAVE_VALGRIND_MEMCHECK_H +#include +#endif + +#include +#include +#include +#include + +#include "alsa-util.h" +#include "alsa-source.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("ALSA Source"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(false); +PA_MODULE_USAGE( + "name= " + "source_name= " + "source_properties= " + "namereg_fail= " + "device= " + "device_id= " + "format= " + "rate= " + "alternate_rate= " + "channels= " + "channel_map= " + "fragments= " + "fragment_size= " + "mmap= " + "tsched= " + "tsched_buffer_size= " + "tsched_buffer_watermark= " + "ignore_dB= " + "control=" + "deferred_volume= " + "deferred_volume_safety_margin= " + "deferred_volume_extra_delay= " + "fixed_latency_range="); + +static const char* const valid_modargs[] = { + "name", + "source_name", + "source_properties", + "namereg_fail", + "device", + "device_id", + "format", + "rate", + "alternate_rate", + "channels", + "channel_map", + "fragments", + "fragment_size", + "mmap", + "tsched", + "tsched_buffer_size", + "tsched_buffer_watermark", + "ignore_dB", + "control", + "deferred_volume", + "deferred_volume_safety_margin", + "deferred_volume_extra_delay", + "fixed_latency_range", + NULL +}; + +int pa__init(pa_module*m) { + pa_modargs *ma = NULL; + + pa_assert(m); + + pa_alsa_refcnt_inc(); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + if (!(m->userdata = pa_alsa_source_new(m, ma, __FILE__, NULL, NULL))) + goto fail; + + pa_modargs_free(ma); + + return 0; + +fail: + + if (ma) + pa_modargs_free(ma); + + pa__done(m); + + return -1; +} + +int pa__get_n_used(pa_module *m) { + pa_source *source; + + pa_assert(m); + pa_assert_se(source = m->userdata); + + return pa_source_linked_by(source); +} + +void pa__done(pa_module*m) { + pa_source *source; + + pa_assert(m); + + if ((source = m->userdata)) + pa_alsa_source_free(source); + + pa_alsa_refcnt_dec(); +} diff --git a/src/modules/bluetooth/a2dp-codec-api.h b/src/modules/bluetooth/a2dp-codec-api.h new file mode 100644 index 0000000..a3123f4 --- /dev/null +++ b/src/modules/bluetooth/a2dp-codec-api.h @@ -0,0 +1,98 @@ +#ifndef fooa2dpcodechfoo +#define fooa2dpcodechfoo + +/*** + This file is part of PulseAudio. + + Copyright 2018-2019 Pali Rohár + + PulseAudio 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 2.1 of the + License, or (at your option) any later version. + + PulseAudio 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 Lesser General Public + License along with PulseAudio; if not, see . +***/ + +#include + +#define MAX_A2DP_CAPS_SIZE 254 + +typedef struct pa_a2dp_codec_capabilities { + uint8_t size; + uint8_t buffer[]; /* max size is 254 bytes */ +} pa_a2dp_codec_capabilities; + +typedef struct pa_a2dp_codec_id { + uint8_t codec_id; + uint32_t vendor_id; + uint16_t vendor_codec_id; +} pa_a2dp_codec_id; + +typedef struct pa_a2dp_codec { + /* Unique name of the codec, lowercase and without whitespaces, used for + * constructing identifier, D-Bus paths, ... */ + const char *name; + /* Human readable codec description */ + const char *description; + + /* A2DP codec id */ + pa_a2dp_codec_id id; + + /* True if codec is bi-directional and supports backchannel */ + bool support_backchannel; + + /* Returns true if codec accepts capabilities, for_encoding is true when + * capabilities are used for encoding */ + bool (*can_accept_capabilities)(const uint8_t *capabilities_buffer, uint8_t capabilities_size, bool for_encoding); + /* Choose remote endpoint based on capabilities from hash map + * (const char *endpoint -> const pa_a2dp_codec_capabilities *capability) + * and returns corresponding endpoint key (or NULL when there is no valid), + * for_encoder is true when capabilities hash map is used for encoding */ + const char *(*choose_remote_endpoint)(const pa_hashmap *capabilities_hashmap, const pa_sample_spec *default_sample_spec, bool for_encoding); + /* Fill codec capabilities, returns size of filled buffer */ + uint8_t (*fill_capabilities)(uint8_t capabilities_buffer[MAX_A2DP_CAPS_SIZE]); + /* Validate codec configuration, returns true on success */ + bool (*is_configuration_valid)(const uint8_t *config_buffer, uint8_t config_size); + /* Fill preferred codec configuration, returns size of filled buffer or 0 on failure */ + uint8_t (*fill_preferred_configuration)(const pa_sample_spec *default_sample_spec, const uint8_t *capabilities_buffer, uint8_t capabilities_size, uint8_t config_buffer[MAX_A2DP_CAPS_SIZE]); + + /* Initialize codec, returns codec info data and set sample_spec, + * for_encoding is true when codec_info is used for encoding, + * for_backchannel is true when codec_info is used for backchannel */ + void *(*init)(bool for_encoding, bool for_backchannel, const uint8_t *config_buffer, uint8_t config_size, pa_sample_spec *sample_spec); + /* Deinitialize and release codec info data in codec_info */ + void (*deinit)(void *codec_info); + /* Reset internal state of codec info data in codec_info, returns + * a negative value on failure */ + int (*reset)(void *codec_info); + + /* Get read block size for codec, it is minimal size of buffer + * needed to decode read_link_mtu bytes of encoded data */ + size_t (*get_read_block_size)(void *codec_info, size_t read_link_mtu); + /* Get write block size for codec, it is maximal size of buffer + * which can produce at most write_link_mtu bytes of encoded data */ + size_t (*get_write_block_size)(void *codec_info, size_t write_link_mtu); + + /* Reduce encoder bitrate for codec, returns new write block size or zero + * if not changed, called when socket is not accepting encoded data fast + * enough */ + size_t (*reduce_encoder_bitrate)(void *codec_info, size_t write_link_mtu); + + /* Encode input_buffer of input_size to output_buffer of output_size, + * returns size of filled ouput_buffer and set processed to size of + * processed input_buffer */ + size_t (*encode_buffer)(void *codec_info, uint32_t timestamp, const uint8_t *input_buffer, size_t input_size, uint8_t *output_buffer, size_t output_size, size_t *processed); + /* Decode input_buffer of input_size to output_buffer of output_size, + * returns size of filled ouput_buffer and set processed to size of + * processed input_buffer */ + size_t (*decode_buffer)(void *codec_info, const uint8_t *input_buffer, size_t input_size, uint8_t *output_buffer, size_t output_size, size_t *processed); +} pa_a2dp_codec; + +#endif diff --git a/src/modules/bluetooth/a2dp-codec-sbc.c b/src/modules/bluetooth/a2dp-codec-sbc.c new file mode 100644 index 0000000..89c647f --- /dev/null +++ b/src/modules/bluetooth/a2dp-codec-sbc.c @@ -0,0 +1,682 @@ +/*** + This file is part of PulseAudio. + + Copyright 2018-2019 Pali Rohár + + PulseAudio 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 2.1 of the + License, or (at your option) any later version. + + PulseAudio 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 Lesser General Public + License along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include "a2dp-codecs.h" +#include "a2dp-codec-api.h" +#include "rtp.h" + +#define SBC_BITPOOL_DEC_LIMIT 32 +#define SBC_BITPOOL_DEC_STEP 5 + +struct sbc_info { + sbc_t sbc; /* Codec data */ + size_t codesize, frame_length; /* SBC Codesize, frame_length. We simply cache those values here */ + uint16_t seq_num; /* Cumulative packet sequence */ + uint8_t frequency; + uint8_t blocks; + uint8_t subbands; + uint8_t mode; + uint8_t allocation; + uint8_t initial_bitpool; + uint8_t min_bitpool; + uint8_t max_bitpool; +}; + +static bool can_accept_capabilities(const uint8_t *capabilities_buffer, uint8_t capabilities_size, bool for_encoding) { + const a2dp_sbc_t *capabilities = (const a2dp_sbc_t *) capabilities_buffer; + + if (capabilities_size != sizeof(*capabilities)) + return false; + + if (!(capabilities->frequency & (SBC_SAMPLING_FREQ_16000 | SBC_SAMPLING_FREQ_32000 | SBC_SAMPLING_FREQ_44100 | SBC_SAMPLING_FREQ_48000))) + return false; + + if (!(capabilities->channel_mode & (SBC_CHANNEL_MODE_MONO | SBC_CHANNEL_MODE_DUAL_CHANNEL | SBC_CHANNEL_MODE_STEREO | SBC_CHANNEL_MODE_JOINT_STEREO))) + return false; + + if (!(capabilities->allocation_method & (SBC_ALLOCATION_SNR | SBC_ALLOCATION_LOUDNESS))) + return false; + + if (!(capabilities->subbands & (SBC_SUBBANDS_4 | SBC_SUBBANDS_8))) + return false; + + if (!(capabilities->block_length & (SBC_BLOCK_LENGTH_4 | SBC_BLOCK_LENGTH_8 | SBC_BLOCK_LENGTH_12 | SBC_BLOCK_LENGTH_16))) + return false; + + return true; +} + +static const char *choose_remote_endpoint(const pa_hashmap *capabilities_hashmap, const pa_sample_spec *default_sample_spec, bool for_encoding) { + const pa_a2dp_codec_capabilities *a2dp_capabilities; + const char *key; + void *state; + + /* There is no preference, just choose random valid entry */ + PA_HASHMAP_FOREACH_KV(key, a2dp_capabilities, capabilities_hashmap, state) { + if (can_accept_capabilities(a2dp_capabilities->buffer, a2dp_capabilities->size, for_encoding)) + return key; + } + + return NULL; +} + +static uint8_t fill_capabilities(uint8_t capabilities_buffer[MAX_A2DP_CAPS_SIZE]) { + a2dp_sbc_t *capabilities = (a2dp_sbc_t *) capabilities_buffer; + + pa_zero(*capabilities); + + capabilities->channel_mode = SBC_CHANNEL_MODE_MONO | SBC_CHANNEL_MODE_DUAL_CHANNEL | SBC_CHANNEL_MODE_STEREO | + SBC_CHANNEL_MODE_JOINT_STEREO; + capabilities->frequency = SBC_SAMPLING_FREQ_16000 | SBC_SAMPLING_FREQ_32000 | SBC_SAMPLING_FREQ_44100 | + SBC_SAMPLING_FREQ_48000; + capabilities->allocation_method = SBC_ALLOCATION_SNR | SBC_ALLOCATION_LOUDNESS; + capabilities->subbands = SBC_SUBBANDS_4 | SBC_SUBBANDS_8; + capabilities->block_length = SBC_BLOCK_LENGTH_4 | SBC_BLOCK_LENGTH_8 | SBC_BLOCK_LENGTH_12 | SBC_BLOCK_LENGTH_16; + capabilities->min_bitpool = SBC_MIN_BITPOOL; + capabilities->max_bitpool = SBC_BITPOOL_HQ_JOINT_STEREO_44100; + + return sizeof(*capabilities); +} + +static bool is_configuration_valid(const uint8_t *config_buffer, uint8_t config_size) { + const a2dp_sbc_t *config = (const a2dp_sbc_t *) config_buffer; + + if (config_size != sizeof(*config)) { + pa_log_error("Invalid size of config buffer"); + return false; + } + + if (config->frequency != SBC_SAMPLING_FREQ_16000 && config->frequency != SBC_SAMPLING_FREQ_32000 && + config->frequency != SBC_SAMPLING_FREQ_44100 && config->frequency != SBC_SAMPLING_FREQ_48000) { + pa_log_error("Invalid sampling frequency in configuration"); + return false; + } + + if (config->channel_mode != SBC_CHANNEL_MODE_MONO && config->channel_mode != SBC_CHANNEL_MODE_DUAL_CHANNEL && + config->channel_mode != SBC_CHANNEL_MODE_STEREO && config->channel_mode != SBC_CHANNEL_MODE_JOINT_STEREO) { + pa_log_error("Invalid channel mode in configuration"); + return false; + } + + if (config->allocation_method != SBC_ALLOCATION_SNR && config->allocation_method != SBC_ALLOCATION_LOUDNESS) { + pa_log_error("Invalid allocation method in configuration"); + return false; + } + + if (config->subbands != SBC_SUBBANDS_4 && config->subbands != SBC_SUBBANDS_8) { + pa_log_error("Invalid SBC subbands in configuration"); + return false; + } + + if (config->block_length != SBC_BLOCK_LENGTH_4 && config->block_length != SBC_BLOCK_LENGTH_8 && + config->block_length != SBC_BLOCK_LENGTH_12 && config->block_length != SBC_BLOCK_LENGTH_16) { + pa_log_error("Invalid block length in configuration"); + return false; + } + + if (config->min_bitpool > config->max_bitpool) { + pa_log_error("Invalid bitpool in configuration"); + return false; + } + + return true; +} + +static uint8_t default_bitpool(uint8_t freq, uint8_t mode) { + /* These bitpool values were chosen based on the A2DP spec recommendation */ + switch (freq) { + case SBC_SAMPLING_FREQ_16000: + case SBC_SAMPLING_FREQ_32000: + switch (mode) { + case SBC_CHANNEL_MODE_MONO: + case SBC_CHANNEL_MODE_DUAL_CHANNEL: + case SBC_CHANNEL_MODE_STEREO: + case SBC_CHANNEL_MODE_JOINT_STEREO: + return SBC_BITPOOL_HQ_JOINT_STEREO_44100; + } + break; + + case SBC_SAMPLING_FREQ_44100: + switch (mode) { + case SBC_CHANNEL_MODE_MONO: + case SBC_CHANNEL_MODE_DUAL_CHANNEL: + return SBC_BITPOOL_HQ_MONO_44100; + + case SBC_CHANNEL_MODE_STEREO: + case SBC_CHANNEL_MODE_JOINT_STEREO: + return SBC_BITPOOL_HQ_JOINT_STEREO_44100; + } + break; + + case SBC_SAMPLING_FREQ_48000: + switch (mode) { + case SBC_CHANNEL_MODE_MONO: + case SBC_CHANNEL_MODE_DUAL_CHANNEL: + return SBC_BITPOOL_HQ_MONO_48000; + + case SBC_CHANNEL_MODE_STEREO: + case SBC_CHANNEL_MODE_JOINT_STEREO: + return SBC_BITPOOL_HQ_JOINT_STEREO_48000; + } + break; + } + + pa_assert_not_reached(); +} + +static uint8_t fill_preferred_configuration(const pa_sample_spec *default_sample_spec, const uint8_t *capabilities_buffer, uint8_t capabilities_size, uint8_t config_buffer[MAX_A2DP_CAPS_SIZE]) { + a2dp_sbc_t *config = (a2dp_sbc_t *) config_buffer; + const a2dp_sbc_t *capabilities = (const a2dp_sbc_t *) capabilities_buffer; + int i; + + static const struct { + uint32_t rate; + uint8_t cap; + } freq_table[] = { + { 16000U, SBC_SAMPLING_FREQ_16000 }, + { 32000U, SBC_SAMPLING_FREQ_32000 }, + { 44100U, SBC_SAMPLING_FREQ_44100 }, + { 48000U, SBC_SAMPLING_FREQ_48000 } + }; + + if (capabilities_size != sizeof(*capabilities)) { + pa_log_error("Invalid size of capabilities buffer"); + return 0; + } + + pa_zero(*config); + + /* Find the lowest freq that is at least as high as the requested sampling rate */ + for (i = 0; (unsigned) i < PA_ELEMENTSOF(freq_table); i++) + if (freq_table[i].rate >= default_sample_spec->rate && (capabilities->frequency & freq_table[i].cap)) { + config->frequency = freq_table[i].cap; + break; + } + + if ((unsigned) i == PA_ELEMENTSOF(freq_table)) { + for (--i; i >= 0; i--) { + if (capabilities->frequency & freq_table[i].cap) { + config->frequency = freq_table[i].cap; + break; + } + } + + if (i < 0) { + pa_log_error("Not suitable sample rate"); + return 0; + } + } + + pa_assert((unsigned) i < PA_ELEMENTSOF(freq_table)); + + if (default_sample_spec->channels <= 1) { + if (capabilities->channel_mode & SBC_CHANNEL_MODE_MONO) + config->channel_mode = SBC_CHANNEL_MODE_MONO; + else if (capabilities->channel_mode & SBC_CHANNEL_MODE_JOINT_STEREO) + config->channel_mode = SBC_CHANNEL_MODE_JOINT_STEREO; + else if (capabilities->channel_mode & SBC_CHANNEL_MODE_STEREO) + config->channel_mode = SBC_CHANNEL_MODE_STEREO; + else if (capabilities->channel_mode & SBC_CHANNEL_MODE_DUAL_CHANNEL) + config->channel_mode = SBC_CHANNEL_MODE_DUAL_CHANNEL; + else { + pa_log_error("No supported channel modes"); + return 0; + } + } else { + if (capabilities->channel_mode & SBC_CHANNEL_MODE_JOINT_STEREO) + config->channel_mode = SBC_CHANNEL_MODE_JOINT_STEREO; + else if (capabilities->channel_mode & SBC_CHANNEL_MODE_STEREO) + config->channel_mode = SBC_CHANNEL_MODE_STEREO; + else if (capabilities->channel_mode & SBC_CHANNEL_MODE_DUAL_CHANNEL) + config->channel_mode = SBC_CHANNEL_MODE_DUAL_CHANNEL; + else if (capabilities->channel_mode & SBC_CHANNEL_MODE_MONO) + config->channel_mode = SBC_CHANNEL_MODE_MONO; + else { + pa_log_error("No supported channel modes"); + return 0; + } + } + + if (capabilities->block_length & SBC_BLOCK_LENGTH_16) + config->block_length = SBC_BLOCK_LENGTH_16; + else if (capabilities->block_length & SBC_BLOCK_LENGTH_12) + config->block_length = SBC_BLOCK_LENGTH_12; + else if (capabilities->block_length & SBC_BLOCK_LENGTH_8) + config->block_length = SBC_BLOCK_LENGTH_8; + else if (capabilities->block_length & SBC_BLOCK_LENGTH_4) + config->block_length = SBC_BLOCK_LENGTH_4; + else { + pa_log_error("No supported block lengths"); + return 0; + } + + if (capabilities->subbands & SBC_SUBBANDS_8) + config->subbands = SBC_SUBBANDS_8; + else if (capabilities->subbands & SBC_SUBBANDS_4) + config->subbands = SBC_SUBBANDS_4; + else { + pa_log_error("No supported subbands"); + return 0; + } + + if (capabilities->allocation_method & SBC_ALLOCATION_LOUDNESS) + config->allocation_method = SBC_ALLOCATION_LOUDNESS; + else if (capabilities->allocation_method & SBC_ALLOCATION_SNR) + config->allocation_method = SBC_ALLOCATION_SNR; + else { + pa_log_error("No supported allocation method"); + return 0; + } + + config->min_bitpool = (uint8_t) PA_MAX(SBC_MIN_BITPOOL, capabilities->min_bitpool); + config->max_bitpool = (uint8_t) PA_MIN(default_bitpool(config->frequency, config->channel_mode), capabilities->max_bitpool); + + if (config->min_bitpool > config->max_bitpool) { + pa_log_error("No supported bitpool"); + return 0; + } + + return sizeof(*config); +} + +static void set_params(struct sbc_info *sbc_info) { + sbc_info->sbc.frequency = sbc_info->frequency; + sbc_info->sbc.blocks = sbc_info->blocks; + sbc_info->sbc.subbands = sbc_info->subbands; + sbc_info->sbc.mode = sbc_info->mode; + sbc_info->sbc.allocation = sbc_info->allocation; + sbc_info->sbc.bitpool = sbc_info->initial_bitpool; + sbc_info->sbc.endian = SBC_LE; + + sbc_info->codesize = sbc_get_codesize(&sbc_info->sbc); + sbc_info->frame_length = sbc_get_frame_length(&sbc_info->sbc); +} + +static void *init(bool for_encoding, bool for_backchannel, const uint8_t *config_buffer, uint8_t config_size, pa_sample_spec *sample_spec) { + struct sbc_info *sbc_info; + const a2dp_sbc_t *config = (const a2dp_sbc_t *) config_buffer; + int ret; + + pa_assert(config_size == sizeof(*config)); + pa_assert(!for_backchannel); + + sbc_info = pa_xnew0(struct sbc_info, 1); + + ret = sbc_init(&sbc_info->sbc, 0); + if (ret != 0) { + pa_xfree(sbc_info); + pa_log_error("SBC initialization failed: %d", ret); + return NULL; + } + + sample_spec->format = PA_SAMPLE_S16LE; + + switch (config->frequency) { + case SBC_SAMPLING_FREQ_16000: + sbc_info->frequency = SBC_FREQ_16000; + sample_spec->rate = 16000U; + break; + case SBC_SAMPLING_FREQ_32000: + sbc_info->frequency = SBC_FREQ_32000; + sample_spec->rate = 32000U; + break; + case SBC_SAMPLING_FREQ_44100: + sbc_info->frequency = SBC_FREQ_44100; + sample_spec->rate = 44100U; + break; + case SBC_SAMPLING_FREQ_48000: + sbc_info->frequency = SBC_FREQ_48000; + sample_spec->rate = 48000U; + break; + default: + pa_assert_not_reached(); + } + + switch (config->channel_mode) { + case SBC_CHANNEL_MODE_MONO: + sbc_info->mode = SBC_MODE_MONO; + sample_spec->channels = 1; + break; + case SBC_CHANNEL_MODE_DUAL_CHANNEL: + sbc_info->mode = SBC_MODE_DUAL_CHANNEL; + sample_spec->channels = 2; + break; + case SBC_CHANNEL_MODE_STEREO: + sbc_info->mode = SBC_MODE_STEREO; + sample_spec->channels = 2; + break; + case SBC_CHANNEL_MODE_JOINT_STEREO: + sbc_info->mode = SBC_MODE_JOINT_STEREO; + sample_spec->channels = 2; + break; + default: + pa_assert_not_reached(); + } + + switch (config->allocation_method) { + case SBC_ALLOCATION_SNR: + sbc_info->allocation = SBC_AM_SNR; + break; + case SBC_ALLOCATION_LOUDNESS: + sbc_info->allocation = SBC_AM_LOUDNESS; + break; + default: + pa_assert_not_reached(); + } + + switch (config->subbands) { + case SBC_SUBBANDS_4: + sbc_info->subbands = SBC_SB_4; + break; + case SBC_SUBBANDS_8: + sbc_info->subbands = SBC_SB_8; + break; + default: + pa_assert_not_reached(); + } + + switch (config->block_length) { + case SBC_BLOCK_LENGTH_4: + sbc_info->blocks = SBC_BLK_4; + break; + case SBC_BLOCK_LENGTH_8: + sbc_info->blocks = SBC_BLK_8; + break; + case SBC_BLOCK_LENGTH_12: + sbc_info->blocks = SBC_BLK_12; + break; + case SBC_BLOCK_LENGTH_16: + sbc_info->blocks = SBC_BLK_16; + break; + default: + pa_assert_not_reached(); + } + + sbc_info->min_bitpool = config->min_bitpool; + sbc_info->max_bitpool = config->max_bitpool; + + /* Set minimum bitpool for source to get the maximum possible block_size + * in get_block_size() function. This block_size is length of buffer used + * for decoded audio data and so is inversely proportional to frame length + * which depends on bitpool value. Bitpool is controlled by other side from + * range [min_bitpool, max_bitpool]. */ + sbc_info->initial_bitpool = for_encoding ? sbc_info->max_bitpool : sbc_info->min_bitpool; + + set_params(sbc_info); + + pa_log_info("SBC parameters: allocation=%s, subbands=%u, blocks=%u, mode=%s bitpool=%u codesize=%u frame_length=%u", + sbc_info->sbc.allocation ? "SNR" : "Loudness", sbc_info->sbc.subbands ? 8 : 4, + (sbc_info->sbc.blocks+1)*4, sbc_info->sbc.mode == SBC_MODE_MONO ? "Mono" : + sbc_info->sbc.mode == SBC_MODE_DUAL_CHANNEL ? "DualChannel" : + sbc_info->sbc.mode == SBC_MODE_STEREO ? "Stereo" : "JointStereo", + sbc_info->sbc.bitpool, (unsigned)sbc_info->codesize, (unsigned)sbc_info->frame_length); + + return sbc_info; +} + +static void deinit(void *codec_info) { + struct sbc_info *sbc_info = (struct sbc_info *) codec_info; + + sbc_finish(&sbc_info->sbc); + pa_xfree(sbc_info); +} + +static void set_bitpool(struct sbc_info *sbc_info, uint8_t bitpool) { + if (bitpool > sbc_info->max_bitpool) + bitpool = sbc_info->max_bitpool; + else if (bitpool < sbc_info->min_bitpool) + bitpool = sbc_info->min_bitpool; + + sbc_info->sbc.bitpool = bitpool; + + sbc_info->codesize = sbc_get_codesize(&sbc_info->sbc); + sbc_info->frame_length = sbc_get_frame_length(&sbc_info->sbc); + + pa_log_debug("Bitpool has changed to %u", sbc_info->sbc.bitpool); +} + +static int reset(void *codec_info) { + struct sbc_info *sbc_info = (struct sbc_info *) codec_info; + int ret; + + ret = sbc_reinit(&sbc_info->sbc, 0); + if (ret != 0) { + pa_log_error("SBC reinitialization failed: %d", ret); + return -1; + } + + /* sbc_reinit() sets also default parameters, so reset them back */ + set_params(sbc_info); + + sbc_info->seq_num = 0; + return 0; +} + +static size_t get_block_size(void *codec_info, size_t link_mtu) { + struct sbc_info *sbc_info = (struct sbc_info *) codec_info; + size_t rtp_size = sizeof(struct rtp_header) + sizeof(struct rtp_sbc_payload); + size_t frame_count = (link_mtu - rtp_size) / sbc_info->frame_length; + + /* frame_count is only 4 bit number */ + if (frame_count > 15) + frame_count = 15; + + return frame_count * sbc_info->codesize; +} + +static size_t reduce_encoder_bitrate(void *codec_info, size_t write_link_mtu) { + struct sbc_info *sbc_info = (struct sbc_info *) codec_info; + uint8_t bitpool; + + /* Check if bitpool is already at its limit */ + if (sbc_info->sbc.bitpool <= SBC_BITPOOL_DEC_LIMIT) + return 0; + + bitpool = sbc_info->sbc.bitpool - SBC_BITPOOL_DEC_STEP; + + if (bitpool < SBC_BITPOOL_DEC_LIMIT) + bitpool = SBC_BITPOOL_DEC_LIMIT; + + if (sbc_info->sbc.bitpool == bitpool) + return 0; + + set_bitpool(sbc_info, bitpool); + return get_block_size(codec_info, write_link_mtu); +} + +static size_t encode_buffer(void *codec_info, uint32_t timestamp, const uint8_t *input_buffer, size_t input_size, uint8_t *output_buffer, size_t output_size, size_t *processed) { + struct sbc_info *sbc_info = (struct sbc_info *) codec_info; + struct rtp_header *header; + struct rtp_sbc_payload *payload; + uint8_t *d; + const uint8_t *p; + size_t to_write, to_encode; + uint8_t frame_count; + + header = (struct rtp_header*) output_buffer; + payload = (struct rtp_sbc_payload*) (output_buffer + sizeof(*header)); + + frame_count = 0; + + p = input_buffer; + to_encode = input_size; + + d = output_buffer + sizeof(*header) + sizeof(*payload); + to_write = output_size - sizeof(*header) - sizeof(*payload); + + /* frame_count is only 4 bit number */ + while (PA_LIKELY(to_encode > 0 && to_write > 0 && frame_count < 15)) { + ssize_t written; + ssize_t encoded; + + encoded = sbc_encode(&sbc_info->sbc, + p, to_encode, + d, to_write, + &written); + + if (PA_UNLIKELY(encoded <= 0)) { + pa_log_error("SBC encoding error (%li)", (long) encoded); + break; + } + + if (PA_UNLIKELY(written < 0)) { + pa_log_error("SBC encoding error (%li)", (long) written); + break; + } + + pa_assert_fp((size_t) encoded <= to_encode); + pa_assert_fp((size_t) encoded == sbc_info->codesize); + + pa_assert_fp((size_t) written <= to_write); + pa_assert_fp((size_t) written == sbc_info->frame_length); + + p += encoded; + to_encode -= encoded; + + d += written; + to_write -= written; + + frame_count++; + } + + PA_ONCE_BEGIN { + pa_log_debug("Using SBC codec implementation: %s", pa_strnull(sbc_get_implementation_info(&sbc_info->sbc))); + } PA_ONCE_END; + + if (PA_UNLIKELY(frame_count == 0)) { + *processed = 0; + return 0; + } + + /* write it to the fifo */ + pa_memzero(output_buffer, sizeof(*header) + sizeof(*payload)); + header->v = 2; + + /* A2DP spec: "A payload type in the RTP dynamic range shall be chosen". + * RFC3551 defines the dynamic range to span from 96 to 127, and 96 appears + * to be the most common choice in A2DP implementations. */ + header->pt = 96; + + header->sequence_number = htons(sbc_info->seq_num++); + header->timestamp = htonl(timestamp); + header->ssrc = htonl(1); + payload->frame_count = frame_count; + + *processed = p - input_buffer; + return d - output_buffer; +} + +static size_t decode_buffer(void *codec_info, const uint8_t *input_buffer, size_t input_size, uint8_t *output_buffer, size_t output_size, size_t *processed) { + struct sbc_info *sbc_info = (struct sbc_info *) codec_info; + + struct rtp_header *header; + struct rtp_sbc_payload *payload; + const uint8_t *p; + uint8_t *d; + size_t to_write, to_decode; + uint8_t frame_count; + + header = (struct rtp_header *) input_buffer; + payload = (struct rtp_sbc_payload*) (input_buffer + sizeof(*header)); + + frame_count = payload->frame_count; + + /* TODO: Add support for decoding fragmented SBC frames */ + if (payload->is_fragmented) { + pa_log_error("Unsupported fragmented SBC frame"); + *processed = 0; + return 0; + } + + p = input_buffer + sizeof(*header) + sizeof(*payload); + to_decode = input_size - sizeof(*header) - sizeof(*payload); + + d = output_buffer; + to_write = output_size; + + while (PA_LIKELY(to_decode > 0 && to_write > 0 && frame_count > 0)) { + size_t written; + ssize_t decoded; + + decoded = sbc_decode(&sbc_info->sbc, + p, to_decode, + d, to_write, + &written); + + if (PA_UNLIKELY(decoded <= 0)) { + pa_log_error("SBC decoding error (%li)", (long) decoded); + break; + } + + /* Reset frame length, it can be changed due to bitpool change */ + sbc_info->frame_length = sbc_get_frame_length(&sbc_info->sbc); + + pa_assert_fp((size_t) decoded <= to_decode); + pa_assert_fp((size_t) decoded == sbc_info->frame_length); + + pa_assert_fp((size_t) written <= to_write); + pa_assert_fp((size_t) written == sbc_info->codesize); + + p += decoded; + to_decode -= decoded; + + d += written; + to_write -= written; + + frame_count--; + } + + *processed = p - input_buffer; + return d - output_buffer; +} + +const pa_a2dp_codec pa_a2dp_codec_sbc = { + .name = "sbc", + .description = "SBC", + .id = { A2DP_CODEC_SBC, 0, 0 }, + .support_backchannel = false, + .can_accept_capabilities = can_accept_capabilities, + .choose_remote_endpoint = choose_remote_endpoint, + .fill_capabilities = fill_capabilities, + .is_configuration_valid = is_configuration_valid, + .fill_preferred_configuration = fill_preferred_configuration, + .init = init, + .deinit = deinit, + .reset = reset, + .get_read_block_size = get_block_size, + .get_write_block_size = get_block_size, + .reduce_encoder_bitrate = reduce_encoder_bitrate, + .encode_buffer = encode_buffer, + .decode_buffer = decode_buffer, +}; diff --git a/src/modules/bluetooth/a2dp-codec-util.c b/src/modules/bluetooth/a2dp-codec-util.c new file mode 100644 index 0000000..94d01e7 --- /dev/null +++ b/src/modules/bluetooth/a2dp-codec-util.c @@ -0,0 +1,56 @@ +/*** + This file is part of PulseAudio. + + Copyright 2019 Pali Rohár + + PulseAudio 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 2.1 of the + License, or (at your option) any later version. + + PulseAudio 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 Lesser General Public + License along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "a2dp-codec-util.h" + +extern const pa_a2dp_codec pa_a2dp_codec_sbc; + +/* This is list of supported codecs. Their order is important. + * Codec with higher index has higher priority. */ +const pa_a2dp_codec *pa_a2dp_codecs[] = { + &pa_a2dp_codec_sbc, +}; + +unsigned int pa_bluetooth_a2dp_codec_count(void) { + return PA_ELEMENTSOF(pa_a2dp_codecs); +} + +const pa_a2dp_codec *pa_bluetooth_a2dp_codec_iter(unsigned int i) { + pa_assert(i < pa_bluetooth_a2dp_codec_count()); + return pa_a2dp_codecs[i]; +} + +const pa_a2dp_codec *pa_bluetooth_get_a2dp_codec(const char *name) { + unsigned int i; + unsigned int count = pa_bluetooth_a2dp_codec_count(); + + for (i = 0; i < count; i++) { + if (pa_streq(pa_a2dp_codecs[i]->name, name)) + return pa_a2dp_codecs[i]; + } + + return NULL; +} diff --git a/src/modules/bluetooth/a2dp-codec-util.h b/src/modules/bluetooth/a2dp-codec-util.h new file mode 100644 index 0000000..86f233a --- /dev/null +++ b/src/modules/bluetooth/a2dp-codec-util.h @@ -0,0 +1,34 @@ +#ifndef fooa2dpcodecutilhfoo +#define fooa2dpcodecutilhfoo + +/*** + This file is part of PulseAudio. + + Copyright 2019 Pali Rohár + + PulseAudio 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 2.1 of the + License, or (at your option) any later version. + + PulseAudio 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 Lesser General Public + License along with PulseAudio; if not, see . +***/ + +#include "a2dp-codec-api.h" + +/* Get number of supported A2DP codecs */ +unsigned int pa_bluetooth_a2dp_codec_count(void); + +/* Get i-th codec. Codec with higher number has higher priority */ +const pa_a2dp_codec *pa_bluetooth_a2dp_codec_iter(unsigned int i); + +/* Get codec by name */ +const pa_a2dp_codec *pa_bluetooth_get_a2dp_codec(const char *name); + +#endif diff --git a/src/modules/bluetooth/a2dp-codecs.h b/src/modules/bluetooth/a2dp-codecs.h new file mode 100644 index 0000000..93e9d35 --- /dev/null +++ b/src/modules/bluetooth/a2dp-codecs.h @@ -0,0 +1,435 @@ +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2006-2010 Nokia Corporation + * Copyright (C) 2004-2010 Marcel Holtmann + * Copyright (C) 2018 Pali Rohár + * + * + * This library 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 2.1 of the License, or (at your option) any later version. + * + * This library 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 library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#include +#include + +#define A2DP_CODEC_SBC 0x00 +#define A2DP_CODEC_MPEG12 0x01 +#define A2DP_CODEC_MPEG24 0x02 +#define A2DP_CODEC_ATRAC 0x04 +#define A2DP_CODEC_VENDOR 0xFF + +#define SBC_SAMPLING_FREQ_16000 (1 << 3) +#define SBC_SAMPLING_FREQ_32000 (1 << 2) +#define SBC_SAMPLING_FREQ_44100 (1 << 1) +#define SBC_SAMPLING_FREQ_48000 1 + +#define SBC_CHANNEL_MODE_MONO (1 << 3) +#define SBC_CHANNEL_MODE_DUAL_CHANNEL (1 << 2) +#define SBC_CHANNEL_MODE_STEREO (1 << 1) +#define SBC_CHANNEL_MODE_JOINT_STEREO 1 + +#define SBC_BLOCK_LENGTH_4 (1 << 3) +#define SBC_BLOCK_LENGTH_8 (1 << 2) +#define SBC_BLOCK_LENGTH_12 (1 << 1) +#define SBC_BLOCK_LENGTH_16 1 + +#define SBC_SUBBANDS_4 (1 << 1) +#define SBC_SUBBANDS_8 1 + +#define SBC_ALLOCATION_SNR (1 << 1) +#define SBC_ALLOCATION_LOUDNESS 1 + +#define SBC_MIN_BITPOOL 2 +#define SBC_MAX_BITPOOL 250 + +/* Other settings: + * Block length = 16 + * Allocation method = Loudness + * Subbands = 8 + */ +#define SBC_BITPOOL_MQ_MONO_44100 19 +#define SBC_BITPOOL_MQ_MONO_48000 18 +#define SBC_BITPOOL_MQ_JOINT_STEREO_44100 35 +#define SBC_BITPOOL_MQ_JOINT_STEREO_48000 33 +#define SBC_BITPOOL_HQ_MONO_44100 31 +#define SBC_BITPOOL_HQ_MONO_48000 29 +#define SBC_BITPOOL_HQ_JOINT_STEREO_44100 53 +#define SBC_BITPOOL_HQ_JOINT_STEREO_48000 51 + +#define MPEG_CHANNEL_MODE_MONO (1 << 3) +#define MPEG_CHANNEL_MODE_DUAL_CHANNEL (1 << 2) +#define MPEG_CHANNEL_MODE_STEREO (1 << 1) +#define MPEG_CHANNEL_MODE_JOINT_STEREO 1 + +#define MPEG_LAYER_MP1 (1 << 2) +#define MPEG_LAYER_MP2 (1 << 1) +#define MPEG_LAYER_MP3 1 + +#define MPEG_SAMPLING_FREQ_16000 (1 << 5) +#define MPEG_SAMPLING_FREQ_22050 (1 << 4) +#define MPEG_SAMPLING_FREQ_24000 (1 << 3) +#define MPEG_SAMPLING_FREQ_32000 (1 << 2) +#define MPEG_SAMPLING_FREQ_44100 (1 << 1) +#define MPEG_SAMPLING_FREQ_48000 1 + +#define MPEG_BIT_RATE_INDEX_0 (1 << 0) +#define MPEG_BIT_RATE_INDEX_1 (1 << 1) +#define MPEG_BIT_RATE_INDEX_2 (1 << 2) +#define MPEG_BIT_RATE_INDEX_3 (1 << 3) +#define MPEG_BIT_RATE_INDEX_4 (1 << 4) +#define MPEG_BIT_RATE_INDEX_5 (1 << 5) +#define MPEG_BIT_RATE_INDEX_6 (1 << 6) +#define MPEG_BIT_RATE_INDEX_7 (1 << 7) +#define MPEG_BIT_RATE_INDEX_8 (1 << 8) +#define MPEG_BIT_RATE_INDEX_9 (1 << 9) +#define MPEG_BIT_RATE_INDEX_10 (1 << 10) +#define MPEG_BIT_RATE_INDEX_11 (1 << 11) +#define MPEG_BIT_RATE_INDEX_12 (1 << 12) +#define MPEG_BIT_RATE_INDEX_13 (1 << 13) +#define MPEG_BIT_RATE_INDEX_14 (1 << 14) + +#define MPEG_MP1_BIT_RATE_32000 MPEG_BIT_RATE_INDEX_1 +#define MPEG_MP1_BIT_RATE_64000 MPEG_BIT_RATE_INDEX_2 +#define MPEG_MP1_BIT_RATE_96000 MPEG_BIT_RATE_INDEX_3 +#define MPEG_MP1_BIT_RATE_128000 MPEG_BIT_RATE_INDEX_4 +#define MPEG_MP1_BIT_RATE_160000 MPEG_BIT_RATE_INDEX_5 +#define MPEG_MP1_BIT_RATE_192000 MPEG_BIT_RATE_INDEX_6 +#define MPEG_MP1_BIT_RATE_224000 MPEG_BIT_RATE_INDEX_7 +#define MPEG_MP1_BIT_RATE_256000 MPEG_BIT_RATE_INDEX_8 +#define MPEG_MP1_BIT_RATE_288000 MPEG_BIT_RATE_INDEX_9 +#define MPEG_MP1_BIT_RATE_320000 MPEG_BIT_RATE_INDEX_10 +#define MPEG_MP1_BIT_RATE_352000 MPEG_BIT_RATE_INDEX_11 +#define MPEG_MP1_BIT_RATE_384000 MPEG_BIT_RATE_INDEX_12 +#define MPEG_MP1_BIT_RATE_416000 MPEG_BIT_RATE_INDEX_13 +#define MPEG_MP1_BIT_RATE_448000 MPEG_BIT_RATE_INDEX_14 + +#define MPEG_MP2_BIT_RATE_32000 MPEG_BIT_RATE_INDEX_1 +#define MPEG_MP2_BIT_RATE_48000 MPEG_BIT_RATE_INDEX_2 +#define MPEG_MP2_BIT_RATE_56000 MPEG_BIT_RATE_INDEX_3 +#define MPEG_MP2_BIT_RATE_64000 MPEG_BIT_RATE_INDEX_4 +#define MPEG_MP2_BIT_RATE_80000 MPEG_BIT_RATE_INDEX_5 +#define MPEG_MP2_BIT_RATE_96000 MPEG_BIT_RATE_INDEX_6 +#define MPEG_MP2_BIT_RATE_112000 MPEG_BIT_RATE_INDEX_7 +#define MPEG_MP2_BIT_RATE_128000 MPEG_BIT_RATE_INDEX_8 +#define MPEG_MP2_BIT_RATE_160000 MPEG_BIT_RATE_INDEX_9 +#define MPEG_MP2_BIT_RATE_192000 MPEG_BIT_RATE_INDEX_10 +#define MPEG_MP2_BIT_RATE_224000 MPEG_BIT_RATE_INDEX_11 +#define MPEG_MP2_BIT_RATE_256000 MPEG_BIT_RATE_INDEX_12 +#define MPEG_MP2_BIT_RATE_320000 MPEG_BIT_RATE_INDEX_13 +#define MPEG_MP2_BIT_RATE_384000 MPEG_BIT_RATE_INDEX_14 + +#define MPEG_MP3_BIT_RATE_32000 MPEG_BIT_RATE_INDEX_1 +#define MPEG_MP3_BIT_RATE_40000 MPEG_BIT_RATE_INDEX_2 +#define MPEG_MP3_BIT_RATE_48000 MPEG_BIT_RATE_INDEX_3 +#define MPEG_MP3_BIT_RATE_56000 MPEG_BIT_RATE_INDEX_4 +#define MPEG_MP3_BIT_RATE_64000 MPEG_BIT_RATE_INDEX_5 +#define MPEG_MP3_BIT_RATE_80000 MPEG_BIT_RATE_INDEX_6 +#define MPEG_MP3_BIT_RATE_96000 MPEG_BIT_RATE_INDEX_7 +#define MPEG_MP3_BIT_RATE_112000 MPEG_BIT_RATE_INDEX_8 +#define MPEG_MP3_BIT_RATE_128000 MPEG_BIT_RATE_INDEX_9 +#define MPEG_MP3_BIT_RATE_160000 MPEG_BIT_RATE_INDEX_10 +#define MPEG_MP3_BIT_RATE_192000 MPEG_BIT_RATE_INDEX_11 +#define MPEG_MP3_BIT_RATE_224000 MPEG_BIT_RATE_INDEX_12 +#define MPEG_MP3_BIT_RATE_256000 MPEG_BIT_RATE_INDEX_13 +#define MPEG_MP3_BIT_RATE_320000 MPEG_BIT_RATE_INDEX_14 + +#define MPEG_BIT_RATE_FREE MPEG_BIT_RATE_INDEX_0 + +#define MPEG_GET_BITRATE(a) ((uint16_t)(a).bitrate1 << 8 | (a).bitrate2) +#define MPEG_SET_BITRATE(a, b) \ + do { \ + (a).bitrate1 = ((b) >> 8) & 0x7f; \ + (a).bitrate2 = (b) & 0xff; \ + } while (0) + +#define AAC_OBJECT_TYPE_MPEG2_AAC_LC 0x80 +#define AAC_OBJECT_TYPE_MPEG4_AAC_LC 0x40 +#define AAC_OBJECT_TYPE_MPEG4_AAC_LTP 0x20 +#define AAC_OBJECT_TYPE_MPEG4_AAC_SCA 0x10 + +#define AAC_SAMPLING_FREQ_8000 0x0800 +#define AAC_SAMPLING_FREQ_11025 0x0400 +#define AAC_SAMPLING_FREQ_12000 0x0200 +#define AAC_SAMPLING_FREQ_16000 0x0100 +#define AAC_SAMPLING_FREQ_22050 0x0080 +#define AAC_SAMPLING_FREQ_24000 0x0040 +#define AAC_SAMPLING_FREQ_32000 0x0020 +#define AAC_SAMPLING_FREQ_44100 0x0010 +#define AAC_SAMPLING_FREQ_48000 0x0008 +#define AAC_SAMPLING_FREQ_64000 0x0004 +#define AAC_SAMPLING_FREQ_88200 0x0002 +#define AAC_SAMPLING_FREQ_96000 0x0001 + +#define AAC_CHANNELS_1 0x02 +#define AAC_CHANNELS_2 0x01 + +#define AAC_GET_BITRATE(a) ((a).bitrate1 << 16 | \ + (a).bitrate2 << 8 | (a).bitrate3) +#define AAC_GET_FREQUENCY(a) ((a).frequency1 << 4 | (a).frequency2) + +#define AAC_SET_BITRATE(a, b) \ + do { \ + (a).bitrate1 = (b >> 16) & 0x7f; \ + (a).bitrate2 = (b >> 8) & 0xff; \ + (a).bitrate3 = b & 0xff; \ + } while (0) +#define AAC_SET_FREQUENCY(a, f) \ + do { \ + (a).frequency1 = (f >> 4) & 0xff; \ + (a).frequency2 = f & 0x0f; \ + } while (0) + +#define AAC_INIT_BITRATE(b) \ + .bitrate1 = (b >> 16) & 0x7f, \ + .bitrate2 = (b >> 8) & 0xff, \ + .bitrate3 = b & 0xff, +#define AAC_INIT_FREQUENCY(f) \ + .frequency1 = (f >> 4) & 0xff, \ + .frequency2 = f & 0x0f, + +#define APTX_VENDOR_ID 0x0000004f +#define APTX_CODEC_ID 0x0001 + +#define APTX_CHANNEL_MODE_MONO 0x01 +#define APTX_CHANNEL_MODE_STEREO 0x02 + +#define APTX_SAMPLING_FREQ_16000 0x08 +#define APTX_SAMPLING_FREQ_32000 0x04 +#define APTX_SAMPLING_FREQ_44100 0x02 +#define APTX_SAMPLING_FREQ_48000 0x01 + +#define FASTSTREAM_VENDOR_ID 0x0000000a +#define FASTSTREAM_CODEC_ID 0x0001 + +#define FASTSTREAM_DIRECTION_SINK 0x1 +#define FASTSTREAM_DIRECTION_SOURCE 0x2 + +#define FASTSTREAM_SINK_SAMPLING_FREQ_44100 0x2 +#define FASTSTREAM_SINK_SAMPLING_FREQ_48000 0x1 + +#define FASTSTREAM_SOURCE_SAMPLING_FREQ_16000 0x2 + +#define APTX_LL_VENDOR_ID 0x0000000a +#define APTX_LL_CODEC_ID 0x0002 + +/* Default parameters for aptX Low Latency encoder */ + +/* Target codec buffer level = 180 */ +#define APTX_LL_TARGET_LEVEL2 0xb4 +#define APTX_LL_TARGET_LEVEL1 0x00 + +/* Initial codec buffer level = 360 */ +#define APTX_LL_INITIAL_LEVEL2 0x68 +#define APTX_LL_INITIAL_LEVEL1 0x01 + +/* SRA max rate 0.005 * 10000 = 50 */ +#define APTX_LL_SRA_MAX_RATE 0x32 + +/* SRA averaging time = 1s */ +#define APTX_LL_SRA_AVG_TIME 0x01 + +/* Good working codec buffer level = 180 */ +#define APTX_LL_GOOD_WORKING_LEVEL2 0xB4 +#define APTX_LL_GOOD_WORKING_LEVEL1 0x00 + +#define APTX_HD_VENDOR_ID 0x000000D7 +#define APTX_HD_CODEC_ID 0x0024 + +#define LDAC_VENDOR_ID 0x0000012d +#define LDAC_CODEC_ID 0x00aa + +#define LDAC_SAMPLING_FREQ_44100 0x20 +#define LDAC_SAMPLING_FREQ_48000 0x10 +#define LDAC_SAMPLING_FREQ_88200 0x08 +#define LDAC_SAMPLING_FREQ_96000 0x04 +#define LDAC_SAMPLING_FREQ_176400 0x02 +#define LDAC_SAMPLING_FREQ_192000 0x01 + +#define LDAC_CHANNEL_MODE_MONO 0x04 +#define LDAC_CHANNEL_MODE_DUAL 0x02 +#define LDAC_CHANNEL_MODE_STEREO 0x01 + +typedef struct { + uint8_t vendor_id4; + uint8_t vendor_id3; + uint8_t vendor_id2; + uint8_t vendor_id1; + uint8_t codec_id2; + uint8_t codec_id1; +} __attribute__ ((packed)) a2dp_vendor_codec_t; + +#define A2DP_GET_VENDOR_ID(a) ( \ + (((uint32_t)(a).vendor_id4) << 0) | \ + (((uint32_t)(a).vendor_id3) << 8) | \ + (((uint32_t)(a).vendor_id2) << 16) | \ + (((uint32_t)(a).vendor_id1) << 24) \ + ) +#define A2DP_GET_CODEC_ID(a) ((a).codec_id2 | (((uint16_t)(a).codec_id1) << 8)) +#define A2DP_SET_VENDOR_ID_CODEC_ID(v, c) ((a2dp_vendor_codec_t){ \ + .vendor_id4 = (((v) >> 0) & 0xff), \ + .vendor_id3 = (((v) >> 8) & 0xff), \ + .vendor_id2 = (((v) >> 16) & 0xff), \ + .vendor_id1 = (((v) >> 24) & 0xff), \ + .codec_id2 = (((c) >> 0) & 0xff), \ + .codec_id1 = (((c) >> 8) & 0xff), \ + }) + +typedef struct { + uint8_t reserved; + uint8_t target_level2; + uint8_t target_level1; + uint8_t initial_level2; + uint8_t initial_level1; + uint8_t sra_max_rate; + uint8_t sra_avg_time; + uint8_t good_working_level2; + uint8_t good_working_level1; +} __attribute__ ((packed)) a2dp_aptx_ll_new_caps_t; + +typedef struct { + a2dp_vendor_codec_t info; + uint8_t frequency; + uint8_t channel_mode; +} __attribute__ ((packed)) a2dp_ldac_t; + +#if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \ + __BYTE_ORDER == __LITTLE_ENDIAN + +typedef struct { + uint8_t channel_mode:4; + uint8_t frequency:4; + uint8_t allocation_method:2; + uint8_t subbands:2; + uint8_t block_length:4; + uint8_t min_bitpool; + uint8_t max_bitpool; +} __attribute__ ((packed)) a2dp_sbc_t; + +typedef struct { + uint8_t channel_mode:4; + uint8_t crc:1; + uint8_t layer:3; + uint8_t frequency:6; + uint8_t mpf:1; + uint8_t rfa:1; + uint8_t bitrate1:7; + uint8_t vbr:1; + uint8_t bitrate2; +} __attribute__ ((packed)) a2dp_mpeg_t; + +typedef struct { + uint8_t object_type; + uint8_t frequency1; + uint8_t rfa:2; + uint8_t channels:2; + uint8_t frequency2:4; + uint8_t bitrate1:7; + uint8_t vbr:1; + uint8_t bitrate2; + uint8_t bitrate3; +} __attribute__ ((packed)) a2dp_aac_t; + +typedef struct { + a2dp_vendor_codec_t info; + uint8_t channel_mode:4; + uint8_t frequency:4; +} __attribute__ ((packed)) a2dp_aptx_t; + +typedef struct { + a2dp_vendor_codec_t info; + uint8_t direction; + uint8_t sink_frequency:4; + uint8_t source_frequency:4; +} __attribute__ ((packed)) a2dp_faststream_t; + +typedef struct { + a2dp_aptx_t aptx; + uint8_t bidirect_link:1; + uint8_t has_new_caps:1; + uint8_t reserved:6; + a2dp_aptx_ll_new_caps_t new_caps[0]; +} __attribute__ ((packed)) a2dp_aptx_ll_t; + +#elif defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && \ + __BYTE_ORDER == __BIG_ENDIAN + +typedef struct { + uint8_t frequency:4; + uint8_t channel_mode:4; + uint8_t block_length:4; + uint8_t subbands:2; + uint8_t allocation_method:2; + uint8_t min_bitpool; + uint8_t max_bitpool; +} __attribute__ ((packed)) a2dp_sbc_t; + +typedef struct { + uint8_t layer:3; + uint8_t crc:1; + uint8_t channel_mode:4; + uint8_t rfa:1; + uint8_t mpf:1; + uint8_t frequency:6; + uint8_t vbr:1; + uint8_t bitrate1:7; + uint8_t bitrate2; +} __attribute__ ((packed)) a2dp_mpeg_t; + +typedef struct { + uint8_t object_type; + uint8_t frequency1; + uint8_t frequency2:4; + uint8_t channels:2; + uint8_t rfa:2; + uint8_t vbr:1; + uint8_t bitrate1:7; + uint8_t bitrate2; + uint8_t bitrate3; +} __attribute__ ((packed)) a2dp_aac_t; + +typedef struct { + a2dp_vendor_codec_t info; + uint8_t frequency:4; + uint8_t channel_mode:4; +} __attribute__ ((packed)) a2dp_aptx_t; + +typedef struct { + a2dp_vendor_codec_t info; + uint8_t direction; + uint8_t source_frequency:4; + uint8_t sink_frequency:4; +} __attribute__ ((packed)) a2dp_faststream_t; + +typedef struct { + a2dp_aptx_t aptx; + uint8_t reserved:6; + uint8_t has_new_caps:1; + uint8_t bidirect_link:1; + a2dp_aptx_ll_new_caps_t new_caps[0]; +} __attribute__ ((packed)) a2dp_aptx_ll_t; + +#else +#error "Unknown byte order" +#endif + +typedef struct { + a2dp_aptx_t aptx; + uint8_t reserved0; + uint8_t reserved1; + uint8_t reserved2; + uint8_t reserved3; +} __attribute__ ((packed)) a2dp_aptx_hd_t; diff --git a/src/modules/bluetooth/backend-native.c b/src/modules/bluetooth/backend-native.c new file mode 100644 index 0000000..5ba7439 --- /dev/null +++ b/src/modules/bluetooth/backend-native.c @@ -0,0 +1,714 @@ +/*** + This file is part of PulseAudio. + + Copyright 2014 Wim Taymans + + PulseAudio 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 2.1 of the + License, or (at your option) any later version. + + PulseAudio 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 Lesser General Public + License along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include "bluez5-util.h" + +struct pa_bluetooth_backend { + pa_core *core; + pa_dbus_connection *connection; + pa_bluetooth_discovery *discovery; + bool enable_hs_role; + + PA_LLIST_HEAD(pa_dbus_pending, pending); +}; + +struct transport_data { + int rfcomm_fd; + pa_io_event *rfcomm_io; + int sco_fd; + pa_io_event *sco_io; + pa_mainloop_api *mainloop; +}; + +#define BLUEZ_SERVICE "org.bluez" +#define BLUEZ_MEDIA_TRANSPORT_INTERFACE BLUEZ_SERVICE ".MediaTransport1" + +#define BLUEZ_ERROR_NOT_SUPPORTED "org.bluez.Error.NotSupported" + +#define BLUEZ_PROFILE_MANAGER_INTERFACE BLUEZ_SERVICE ".ProfileManager1" +#define BLUEZ_PROFILE_INTERFACE BLUEZ_SERVICE ".Profile1" + +#define HSP_AG_PROFILE "/Profile/HSPAGProfile" +#define HSP_HS_PROFILE "/Profile/HSPHSProfile" + +/* RFCOMM channel for HSP headset role + * The choice seems to be a bit arbitrary -- it looks like at least channels 2, 4 and 5 also work*/ +#define HSP_HS_DEFAULT_CHANNEL 3 + +#define PROFILE_INTROSPECT_XML \ + DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \ + "" \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + "" + +static pa_dbus_pending* send_and_add_to_pending(pa_bluetooth_backend *backend, DBusMessage *m, + DBusPendingCallNotifyFunction func, void *call_data) { + + pa_dbus_pending *p; + DBusPendingCall *call; + + pa_assert(backend); + pa_assert(m); + + pa_assert_se(dbus_connection_send_with_reply(pa_dbus_connection_get(backend->connection), m, &call, -1)); + + p = pa_dbus_pending_new(pa_dbus_connection_get(backend->connection), m, call, backend, call_data); + PA_LLIST_PREPEND(pa_dbus_pending, backend->pending, p); + dbus_pending_call_set_notify(call, func, p, NULL); + + return p; +} + +static int sco_do_connect(pa_bluetooth_transport *t) { + pa_bluetooth_device *d = t->device; + struct sockaddr_sco addr; + socklen_t len; + int err, i; + int sock; + bdaddr_t src; + bdaddr_t dst; + const char *src_addr, *dst_addr; + + src_addr = d->adapter->address; + dst_addr = d->address; + + /* don't use ba2str to avoid -lbluetooth */ + for (i = 5; i >= 0; i--, src_addr += 3) + src.b[i] = strtol(src_addr, NULL, 16); + for (i = 5; i >= 0; i--, dst_addr += 3) + dst.b[i] = strtol(dst_addr, NULL, 16); + + sock = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO); + if (sock < 0) { + pa_log_error("socket(SEQPACKET, SCO) %s", pa_cstrerror(errno)); + return -1; + } + + len = sizeof(addr); + memset(&addr, 0, len); + addr.sco_family = AF_BLUETOOTH; + bacpy(&addr.sco_bdaddr, &src); + + if (bind(sock, (struct sockaddr *) &addr, len) < 0) { + pa_log_error("bind(): %s", pa_cstrerror(errno)); + goto fail_close; + } + + memset(&addr, 0, len); + addr.sco_family = AF_BLUETOOTH; + bacpy(&addr.sco_bdaddr, &dst); + + pa_log_info("doing connect"); + err = connect(sock, (struct sockaddr *) &addr, len); + if (err < 0 && !(errno == EAGAIN || errno == EINPROGRESS)) { + pa_log_error("connect(): %s", pa_cstrerror(errno)); + goto fail_close; + } + return sock; + +fail_close: + close(sock); + return -1; +} + +static int sco_do_accept(pa_bluetooth_transport *t) { + struct transport_data *trd = t->userdata; + struct sockaddr_sco addr; + socklen_t optlen; + int sock; + + memset(&addr, 0, sizeof(addr)); + optlen = sizeof(addr); + + pa_log_info ("doing accept"); + sock = accept(trd->sco_fd, (struct sockaddr *) &addr, &optlen); + if (sock < 0) { + if (errno != EAGAIN) + pa_log_error("accept(): %s", pa_cstrerror(errno)); + goto fail; + } + return sock; + +fail: + return -1; +} + +static int sco_acquire_cb(pa_bluetooth_transport *t, bool optional, size_t *imtu, size_t *omtu) { + int sock; + socklen_t len; + + if (optional) + sock = sco_do_accept(t); + else + sock = sco_do_connect(t); + + if (sock < 0) + goto fail; + + if (imtu) *imtu = 48; + if (omtu) *omtu = 48; + + if (t->device->autodetect_mtu) { + struct sco_options sco_opt; + + len = sizeof(sco_opt); + memset(&sco_opt, 0, len); + + if (getsockopt(sock, SOL_SCO, SCO_OPTIONS, &sco_opt, &len) < 0) + pa_log_warn("getsockopt(SCO_OPTIONS) failed, loading defaults"); + else { + pa_log_debug("autodetected imtu = omtu = %u", sco_opt.mtu); + if (imtu) *imtu = sco_opt.mtu; + if (omtu) *omtu = sco_opt.mtu; + } + } + + return sock; + +fail: + return -1; +} + +static void sco_release_cb(pa_bluetooth_transport *t) { + pa_log_info("Transport %s released", t->path); + /* device will close the SCO socket for us */ +} + +static void sco_io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_io_event_flags_t events, void *userdata) { + pa_bluetooth_transport *t = userdata; + + pa_assert(io); + pa_assert(t); + + if (events & (PA_IO_EVENT_HANGUP|PA_IO_EVENT_ERROR)) { + pa_log_error("error listening SCO connection: %s", pa_cstrerror(errno)); + goto fail; + } + + if (t->state != PA_BLUETOOTH_TRANSPORT_STATE_PLAYING) { + pa_log_info("SCO incoming connection: changing state to PLAYING"); + pa_bluetooth_transport_set_state (t, PA_BLUETOOTH_TRANSPORT_STATE_PLAYING); + } + +fail: + return; +} + +static int sco_listen(pa_bluetooth_transport *t) { + struct transport_data *trd = t->userdata; + struct sockaddr_sco addr; + int sock, i; + bdaddr_t src; + const char *src_addr; + + sock = socket(PF_BLUETOOTH, SOCK_SEQPACKET | SOCK_NONBLOCK | SOCK_CLOEXEC, BTPROTO_SCO); + if (sock < 0) { + pa_log_error("socket(SEQPACKET, SCO) %s", pa_cstrerror(errno)); + return -1; + } + + src_addr = t->device->adapter->address; + + /* don't use ba2str to avoid -lbluetooth */ + for (i = 5; i >= 0; i--, src_addr += 3) + src.b[i] = strtol(src_addr, NULL, 16); + + /* Bind to local address */ + memset(&addr, 0, sizeof(addr)); + addr.sco_family = AF_BLUETOOTH; + bacpy(&addr.sco_bdaddr, &src); + + if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) { + pa_log_error("bind(): %s", pa_cstrerror(errno)); + goto fail_close; + } + + pa_log_info ("doing listen"); + if (listen(sock, 1) < 0) { + pa_log_error("listen(): %s", pa_cstrerror(errno)); + goto fail_close; + } + + trd->sco_fd = sock; + trd->sco_io = trd->mainloop->io_new(trd->mainloop, sock, PA_IO_EVENT_INPUT, + sco_io_callback, t); + + return sock; + +fail_close: + close(sock); + return -1; +} + +static void register_profile_reply(DBusPendingCall *pending, void *userdata) { + DBusMessage *r; + pa_dbus_pending *p; + pa_bluetooth_backend *b; + char *profile; + + pa_assert(pending); + pa_assert_se(p = userdata); + pa_assert_se(b = p->context_data); + pa_assert_se(profile = p->call_data); + pa_assert_se(r = dbus_pending_call_steal_reply(pending)); + + if (dbus_message_is_error(r, BLUEZ_ERROR_NOT_SUPPORTED)) { + pa_log_info("Couldn't register profile %s because it is disabled in BlueZ", profile); + goto finish; + } + + if (dbus_message_get_type(r) == DBUS_MESSAGE_TYPE_ERROR) { + pa_log_error(BLUEZ_PROFILE_MANAGER_INTERFACE ".RegisterProfile() failed: %s: %s", dbus_message_get_error_name(r), + pa_dbus_get_error_message(r)); + goto finish; + } + +finish: + dbus_message_unref(r); + + PA_LLIST_REMOVE(pa_dbus_pending, b->pending, p); + pa_dbus_pending_free(p); + + pa_xfree(profile); +} + +static void register_profile(pa_bluetooth_backend *b, const char *profile, const char *uuid) { + DBusMessage *m; + DBusMessageIter i, d; + dbus_bool_t autoconnect; + dbus_uint16_t version, chan; + + pa_log_debug("Registering Profile %s %s", profile, uuid); + + pa_assert_se(m = dbus_message_new_method_call(BLUEZ_SERVICE, "/org/bluez", BLUEZ_PROFILE_MANAGER_INTERFACE, "RegisterProfile")); + + dbus_message_iter_init_append(m, &i); + pa_assert_se(dbus_message_iter_append_basic(&i, DBUS_TYPE_OBJECT_PATH, &profile)); + pa_assert_se(dbus_message_iter_append_basic(&i, DBUS_TYPE_STRING, &uuid)); + dbus_message_iter_open_container(&i, DBUS_TYPE_ARRAY, DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING DBUS_TYPE_STRING_AS_STRING + DBUS_TYPE_VARIANT_AS_STRING DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &d); + if (pa_bluetooth_uuid_is_hsp_hs(uuid)) { + /* In the headset role, the connection will only be initiated from the remote side */ + autoconnect = 0; + pa_dbus_append_basic_variant_dict_entry(&d, "AutoConnect", DBUS_TYPE_BOOLEAN, &autoconnect); + chan = HSP_HS_DEFAULT_CHANNEL; + pa_dbus_append_basic_variant_dict_entry(&d, "Channel", DBUS_TYPE_UINT16, &chan); + /* HSP version 1.2 */ + version = 0x0102; + pa_dbus_append_basic_variant_dict_entry(&d, "Version", DBUS_TYPE_UINT16, &version); + } + dbus_message_iter_close_container(&i, &d); + + send_and_add_to_pending(b, m, register_profile_reply, pa_xstrdup(profile)); +} + +static void rfcomm_io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_io_event_flags_t events, void *userdata) { + pa_bluetooth_transport *t = userdata; + + pa_assert(io); + pa_assert(t); + + if (events & (PA_IO_EVENT_HANGUP|PA_IO_EVENT_ERROR)) { + pa_log_info("Lost RFCOMM connection."); + goto fail; + } + + if (events & PA_IO_EVENT_INPUT) { + char buf[512]; + ssize_t len; + int gain, dummy; + bool do_reply = false; + + len = pa_read(fd, buf, 511, NULL); + if (len < 0) { + pa_log_error("RFCOMM read error: %s", pa_cstrerror(errno)); + goto fail; + } + buf[len] = 0; + pa_log_debug("RFCOMM << %s", buf); + + /* There are only four HSP AT commands: + * AT+VGS=value: value between 0 and 15, sent by the HS to AG to set the speaker gain. + * +VGS=value is sent by AG to HS as a response to an AT+VGS command or when the gain + * is changed on the AG side. + * AT+VGM=value: value between 0 and 15, sent by the HS to AG to set the microphone gain. + * +VGM=value is sent by AG to HS as a response to an AT+VGM command or when the gain + * is changed on the AG side. + * AT+CKPD=200: Sent by HS when headset button is pressed. + * RING: Sent by AG to HS to notify of an incoming call. It can safely be ignored because + * it does not expect a reply. */ + if (sscanf(buf, "AT+VGS=%d", &gain) == 1 || sscanf(buf, "\r\n+VGM=%d\r\n", &gain) == 1) { + t->speaker_gain = gain; + pa_hook_fire(pa_bluetooth_discovery_hook(t->device->discovery, PA_BLUETOOTH_HOOK_TRANSPORT_SPEAKER_GAIN_CHANGED), t); + do_reply = true; + + } else if (sscanf(buf, "AT+VGM=%d", &gain) == 1 || sscanf(buf, "\r\n+VGS=%d\r\n", &gain) == 1) { + t->microphone_gain = gain; + pa_hook_fire(pa_bluetooth_discovery_hook(t->device->discovery, PA_BLUETOOTH_HOOK_TRANSPORT_MICROPHONE_GAIN_CHANGED), t); + do_reply = true; + } else if (sscanf(buf, "AT+CKPD=%d", &dummy) == 1) { + do_reply = true; + } else { + do_reply = false; + } + + if (do_reply) { + pa_log_debug("RFCOMM >> OK"); + + len = write(fd, "\r\nOK\r\n", 6); + + /* we ignore any errors, it's not critical and real errors should + * be caught with the HANGUP and ERROR events handled above */ + if (len < 0) + pa_log_error("RFCOMM write error: %s", pa_cstrerror(errno)); + } + } + + return; + +fail: + pa_bluetooth_transport_unlink(t); + pa_bluetooth_transport_free(t); +} + +static void transport_destroy(pa_bluetooth_transport *t) { + struct transport_data *trd = t->userdata; + + if (trd->sco_io) { + trd->mainloop->io_free(trd->sco_io); + shutdown(trd->sco_fd, SHUT_RDWR); + close (trd->sco_fd); + } + + trd->mainloop->io_free(trd->rfcomm_io); + shutdown(trd->rfcomm_fd, SHUT_RDWR); + close (trd->rfcomm_fd); + + pa_xfree(trd); +} + +static void set_speaker_gain(pa_bluetooth_transport *t, uint16_t gain) { + struct transport_data *trd = t->userdata; + char buf[512]; + ssize_t len, written; + + if (t->speaker_gain == gain) + return; + + t->speaker_gain = gain; + + /* If we are in the AG role, we send a command to the head set to change + * the speaker gain. In the HS role, source and sink are swapped, so + * in this case we notify the AG that the microphone gain has changed */ + if (t->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT) { + len = sprintf(buf, "\r\n+VGS=%d\r\n", gain); + pa_log_debug("RFCOMM >> +VGS=%d", gain); + } else { + len = sprintf(buf, "\r\nAT+VGM=%d\r\n", gain); + pa_log_debug("RFCOMM >> AT+VGM=%d", gain); + } + + written = write(trd->rfcomm_fd, buf, len); + + if (written != len) + pa_log_error("RFCOMM write error: %s", pa_cstrerror(errno)); +} + +static void set_microphone_gain(pa_bluetooth_transport *t, uint16_t gain) { + struct transport_data *trd = t->userdata; + char buf[512]; + ssize_t len, written; + + if (t->microphone_gain == gain) + return; + + t->microphone_gain = gain; + + /* If we are in the AG role, we send a command to the head set to change + * the microphone gain. In the HS role, source and sink are swapped, so + * in this case we notify the AG that the speaker gain has changed */ + if (t->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT) { + len = sprintf(buf, "\r\n+VGM=%d\r\n", gain); + pa_log_debug("RFCOMM >> +VGM=%d", gain); + } else { + len = sprintf(buf, "\r\nAT+VGS=%d\r\n", gain); + pa_log_debug("RFCOMM >> AT+VGS=%d", gain); + } + + written = write (trd->rfcomm_fd, buf, len); + + if (written != len) + pa_log_error("RFCOMM write error: %s", pa_cstrerror(errno)); +} + +static DBusMessage *profile_new_connection(DBusConnection *conn, DBusMessage *m, void *userdata) { + pa_bluetooth_backend *b = userdata; + pa_bluetooth_device *d; + pa_bluetooth_transport *t; + pa_bluetooth_profile_t p; + DBusMessage *r; + int fd; + const char *sender, *path, PA_UNUSED *handler; + DBusMessageIter arg_i; + char *pathfd; + struct transport_data *trd; + + if (!dbus_message_iter_init(m, &arg_i) || !pa_streq(dbus_message_get_signature(m), "oha{sv}")) { + pa_log_error("Invalid signature found in NewConnection"); + goto fail; + } + + handler = dbus_message_get_path(m); + if (pa_streq(handler, HSP_AG_PROFILE)) { + p = PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT; + } else if (pa_streq(handler, HSP_HS_PROFILE)) { + p = PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY; + } else { + pa_log_error("Invalid handler"); + goto fail; + } + + pa_assert(dbus_message_iter_get_arg_type(&arg_i) == DBUS_TYPE_OBJECT_PATH); + dbus_message_iter_get_basic(&arg_i, &path); + + d = pa_bluetooth_discovery_get_device_by_path(b->discovery, path); + if (d == NULL) { + pa_log_error("Device doesnt exist for %s", path); + goto fail; + } + + pa_assert_se(dbus_message_iter_next(&arg_i)); + + pa_assert(dbus_message_iter_get_arg_type(&arg_i) == DBUS_TYPE_UNIX_FD); + dbus_message_iter_get_basic(&arg_i, &fd); + + pa_log_debug("dbus: NewConnection path=%s, fd=%d, profile %s", path, fd, + pa_bluetooth_profile_to_string(p)); + + sender = dbus_message_get_sender(m); + + pathfd = pa_sprintf_malloc ("%s/fd%d", path, fd); + t = pa_bluetooth_transport_new(d, sender, pathfd, p, NULL, 0); + pa_xfree(pathfd); + + t->acquire = sco_acquire_cb; + t->release = sco_release_cb; + t->destroy = transport_destroy; + t->set_speaker_gain = set_speaker_gain; + t->set_microphone_gain = set_microphone_gain; + + trd = pa_xnew0(struct transport_data, 1); + trd->rfcomm_fd = fd; + trd->mainloop = b->core->mainloop; + trd->rfcomm_io = trd->mainloop->io_new(b->core->mainloop, fd, PA_IO_EVENT_INPUT, + rfcomm_io_callback, t); + t->userdata = trd; + + sco_listen(t); + + pa_bluetooth_transport_put(t); + + pa_log_debug("Transport %s available for profile %s", t->path, pa_bluetooth_profile_to_string(t->profile)); + + pa_assert_se(r = dbus_message_new_method_return(m)); + + return r; + +fail: + pa_assert_se(r = dbus_message_new_error(m, "org.bluez.Error.InvalidArguments", "Unable to handle new connection")); + return r; +} + +static DBusMessage *profile_request_disconnection(DBusConnection *conn, DBusMessage *m, void *userdata) { + DBusMessage *r; + + pa_assert_se(r = dbus_message_new_method_return(m)); + + return r; +} + +static DBusHandlerResult profile_handler(DBusConnection *c, DBusMessage *m, void *userdata) { + pa_bluetooth_backend *b = userdata; + DBusMessage *r = NULL; + const char *path, *interface, *member; + + pa_assert(b); + + path = dbus_message_get_path(m); + interface = dbus_message_get_interface(m); + member = dbus_message_get_member(m); + + pa_log_debug("dbus: path=%s, interface=%s, member=%s", path, interface, member); + + if (!pa_streq(path, HSP_AG_PROFILE) && !pa_streq(path, HSP_HS_PROFILE)) + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + if (dbus_message_is_method_call(m, "org.freedesktop.DBus.Introspectable", "Introspect")) { + const char *xml = PROFILE_INTROSPECT_XML; + + pa_assert_se(r = dbus_message_new_method_return(m)); + pa_assert_se(dbus_message_append_args(r, DBUS_TYPE_STRING, &xml, DBUS_TYPE_INVALID)); + + } else if (dbus_message_is_method_call(m, BLUEZ_PROFILE_INTERFACE, "Release")) { + pa_log_debug("Release not handled"); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } else if (dbus_message_is_method_call(m, BLUEZ_PROFILE_INTERFACE, "RequestDisconnection")) { + r = profile_request_disconnection(c, m, userdata); + } else if (dbus_message_is_method_call(m, BLUEZ_PROFILE_INTERFACE, "NewConnection")) + r = profile_new_connection(c, m, userdata); + else + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + if (r) { + pa_assert_se(dbus_connection_send(pa_dbus_connection_get(b->connection), r, NULL)); + dbus_message_unref(r); + } + + return DBUS_HANDLER_RESULT_HANDLED; +} + +static void profile_init(pa_bluetooth_backend *b, pa_bluetooth_profile_t profile) { + static const DBusObjectPathVTable vtable_profile = { + .message_function = profile_handler, + }; + const char *object_name; + const char *uuid; + + pa_assert(b); + + switch (profile) { + case PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT: + object_name = HSP_AG_PROFILE; + uuid = PA_BLUETOOTH_UUID_HSP_AG; + break; + case PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY: + object_name = HSP_HS_PROFILE; + uuid = PA_BLUETOOTH_UUID_HSP_HS; + break; + default: + pa_assert_not_reached(); + break; + } + + pa_assert_se(dbus_connection_register_object_path(pa_dbus_connection_get(b->connection), object_name, &vtable_profile, b)); + register_profile(b, object_name, uuid); +} + +static void profile_done(pa_bluetooth_backend *b, pa_bluetooth_profile_t profile) { + pa_assert(b); + + switch (profile) { + case PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT: + dbus_connection_unregister_object_path(pa_dbus_connection_get(b->connection), HSP_AG_PROFILE); + break; + case PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY: + dbus_connection_unregister_object_path(pa_dbus_connection_get(b->connection), HSP_HS_PROFILE); + break; + default: + pa_assert_not_reached(); + break; + } +} + +void pa_bluetooth_native_backend_enable_hs_role(pa_bluetooth_backend *native_backend, bool enable_hs_role) { + + if (enable_hs_role == native_backend->enable_hs_role) + return; + + if (enable_hs_role) + profile_init(native_backend, PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY); + else + profile_done(native_backend, PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY); + + native_backend->enable_hs_role = enable_hs_role; +} + +pa_bluetooth_backend *pa_bluetooth_native_backend_new(pa_core *c, pa_bluetooth_discovery *y, bool enable_hs_role) { + pa_bluetooth_backend *backend; + DBusError err; + + pa_log_debug("Bluetooth Headset Backend API support using the native backend"); + + backend = pa_xnew0(pa_bluetooth_backend, 1); + backend->core = c; + + dbus_error_init(&err); + if (!(backend->connection = pa_dbus_bus_get(c, DBUS_BUS_SYSTEM, &err))) { + pa_log("Failed to get D-Bus connection: %s", err.message); + dbus_error_free(&err); + pa_xfree(backend); + return NULL; + } + + backend->discovery = y; + backend->enable_hs_role = enable_hs_role; + + if (enable_hs_role) + profile_init(backend, PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY); + profile_init(backend, PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT); + + return backend; +} + +void pa_bluetooth_native_backend_free(pa_bluetooth_backend *backend) { + pa_assert(backend); + + pa_dbus_free_pending_list(&backend->pending); + + if (backend->enable_hs_role) + profile_done(backend, PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY); + profile_done(backend, PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT); + + pa_dbus_connection_unref(backend->connection); + + pa_xfree(backend); +} diff --git a/src/modules/bluetooth/backend-ofono.c b/src/modules/bluetooth/backend-ofono.c new file mode 100644 index 0000000..d7a13ef --- /dev/null +++ b/src/modules/bluetooth/backend-ofono.c @@ -0,0 +1,764 @@ +/*** + This file is part of PulseAudio. + + Copyright 2013 João Paulo Rechi Vita + + PulseAudio 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 2.1 of the + License, or (at your option) any later version. + + PulseAudio 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 Lesser General Public + License along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include +#include +#include +#include + +#include "bluez5-util.h" + +#define HFP_AUDIO_CODEC_CVSD 0x01 +#define HFP_AUDIO_CODEC_MSBC 0x02 + +#define OFONO_SERVICE "org.ofono" +#define HF_AUDIO_AGENT_INTERFACE OFONO_SERVICE ".HandsfreeAudioAgent" +#define HF_AUDIO_MANAGER_INTERFACE OFONO_SERVICE ".HandsfreeAudioManager" + +#define HF_AUDIO_AGENT_PATH "/HandsfreeAudioAgent" + +#define HF_AUDIO_AGENT_XML \ + DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \ + "" \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + "" + +struct hf_audio_card { + pa_bluetooth_backend *backend; + char *path; + char *remote_address; + char *local_address; + + bool connecting; + int fd; + int (*acquire)(struct hf_audio_card *card); + + pa_bluetooth_transport *transport; + pa_hook_slot *device_unlink_slot; +}; + +struct pa_bluetooth_backend { + pa_core *core; + pa_bluetooth_discovery *discovery; + pa_dbus_connection *connection; + pa_hashmap *cards; + char *ofono_bus_id; + + PA_LLIST_HEAD(pa_dbus_pending, pending); +}; + +static pa_dbus_pending* hf_dbus_send_and_add_to_pending(pa_bluetooth_backend *backend, DBusMessage *m, + DBusPendingCallNotifyFunction func, void *call_data) { + pa_dbus_pending *p; + DBusPendingCall *call; + + pa_assert(backend); + pa_assert(m); + + pa_assert_se(dbus_connection_send_with_reply(pa_dbus_connection_get(backend->connection), m, &call, -1)); + + p = pa_dbus_pending_new(pa_dbus_connection_get(backend->connection), m, call, backend, call_data); + PA_LLIST_PREPEND(pa_dbus_pending, backend->pending, p); + dbus_pending_call_set_notify(call, func, p, NULL); + + return p; +} + +static DBusMessage *card_send(struct hf_audio_card *card, const char *method, DBusError *err) +{ + pa_bluetooth_transport *t = card->transport; + DBusMessage *m, *r; + + pa_assert_se(m = dbus_message_new_method_call(t->owner, t->path, "org.ofono.HandsfreeAudioCard", method)); + r = dbus_connection_send_with_reply_and_block(pa_dbus_connection_get(card->backend->connection), m, -1, err); + dbus_message_unref(m); + + return r; +} + +static int card_connect(struct hf_audio_card *card) { + DBusMessage *r; + DBusError err; + + if (card->connecting) + return -EAGAIN; + + card->connecting = true; + + dbus_error_init(&err); + r = card_send(card, "Connect", &err); + + if (!r) { + pa_log_error("Failed to connect %s: %s", err.name, err.message); + card->connecting = false; + dbus_error_free(&err); + return -1; + } + + dbus_message_unref(r); + + if (card->connecting) + return -EAGAIN; + + return 0; +} + +static int card_acquire(struct hf_audio_card *card) { + int fd; + uint8_t codec; + DBusMessage *r; + DBusError err; + + /* Try acquiring the stream first which was introduced in 1.21 */ + dbus_error_init(&err); + r = card_send(card, "Acquire", &err); + + if (!r) { + if (!pa_streq(err.name, DBUS_ERROR_UNKNOWN_METHOD)) { + pa_log_error("Failed to acquire %s: %s", err.name, err.message); + dbus_error_free(&err); + return -1; + } + dbus_error_free(&err); + /* Fallback to Connect as this might be an old version of ofono */ + card->acquire = card_connect; + return card_connect(card); + } + + if ((dbus_message_get_args(r, NULL, DBUS_TYPE_UNIX_FD, &fd, + DBUS_TYPE_BYTE, &codec, + DBUS_TYPE_INVALID) == true)) { + dbus_message_unref(r); + if (codec != HFP_AUDIO_CODEC_CVSD) { + pa_log_error("Invalid codec: %u", codec); + /* shutdown to make sure connection is dropped immediately */ + shutdown(fd, SHUT_RDWR); + close(fd); + return -1; + } + card->transport->codec = codec; + card->fd = fd; + return 0; + } + + pa_log_error("Unable to acquire"); + dbus_message_unref(r); + return -1; +} + +static void hf_audio_agent_card_removed(pa_bluetooth_backend *backend, const char *path); + +static pa_hook_result_t device_unlink_cb(pa_bluetooth_discovery *y, const pa_bluetooth_device *d, struct hf_audio_card *card) { + pa_assert(d); + pa_assert(card); + + hf_audio_agent_card_removed(card->backend, card->path); + + return PA_HOOK_OK; +} + +static struct hf_audio_card *hf_audio_card_new(pa_bluetooth_backend *backend, const char *path) { + struct hf_audio_card *card = pa_xnew0(struct hf_audio_card, 1); + + card->path = pa_xstrdup(path); + card->backend = backend; + card->fd = -1; + card->acquire = card_acquire; + + card->device_unlink_slot = pa_hook_connect(pa_bluetooth_discovery_hook(backend->discovery, PA_BLUETOOTH_HOOK_DEVICE_UNLINK), + PA_HOOK_NORMAL, (pa_hook_cb_t) device_unlink_cb, card); + + return card; +} + +static void hf_audio_card_free(struct hf_audio_card *card) { + pa_assert(card); + + if (card->device_unlink_slot) + pa_hook_slot_free(card->device_unlink_slot); + + if (card->transport) + pa_bluetooth_transport_free(card->transport); + + pa_xfree(card->path); + pa_xfree(card->remote_address); + pa_xfree(card->local_address); + pa_xfree(card); +} + +static int socket_accept(int sock) +{ + char c; + struct pollfd pfd; + + if (sock < 0) + return -ENOTCONN; + + memset(&pfd, 0, sizeof(pfd)); + pfd.fd = sock; + pfd.events = POLLOUT; + + if (poll(&pfd, 1, 0) < 0) + return -errno; + + /* + * If socket already writable then it is not in defer setup state, + * otherwise it needs to be read to authorize the connection. + */ + if ((pfd.revents & POLLOUT)) + return 0; + + /* Enable socket by reading 1 byte */ + if (read(sock, &c, 1) < 0) + return -errno; + + return 0; +} + +static int hf_audio_agent_transport_acquire(pa_bluetooth_transport *t, bool optional, size_t *imtu, size_t *omtu) { + struct hf_audio_card *card = t->userdata; + int err; + + pa_assert(card); + + if (!optional && card->fd < 0) { + err = card->acquire(card); + if (err < 0) + return err; + } + + /* The correct block size should take into account the SCO MTU from + * the Bluetooth adapter and (for adapters in the USB bus) the MxPS + * value from the Isoc USB endpoint in use by btusb and should be + * made available to userspace by the Bluetooth kernel subsystem. + * Meanwhile the empiric value 48 will be used. */ + if (imtu) + *imtu = 48; + if (omtu) + *omtu = 48; + + err = socket_accept(card->fd); + if (err < 0) { + pa_log_error("Deferred setup failed on fd %d: %s", card->fd, pa_cstrerror(-err)); + return -1; + } + + return card->fd; +} + +static void hf_audio_agent_transport_release(pa_bluetooth_transport *t) { + struct hf_audio_card *card = t->userdata; + + pa_assert(card); + + if (card->fd < 0) { + pa_log_info("Transport %s already released", t->path); + return; + } + + /* shutdown to make sure connection is dropped immediately */ + shutdown(card->fd, SHUT_RDWR); + close(card->fd); + card->fd = -1; +} + +static void hf_audio_agent_card_found(pa_bluetooth_backend *backend, const char *path, DBusMessageIter *props_i) { + DBusMessageIter i, value_i; + const char *key, *value; + struct hf_audio_card *card; + pa_bluetooth_device *d; + pa_bluetooth_profile_t p = PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY; + + pa_assert(backend); + pa_assert(path); + pa_assert(props_i); + + pa_log_debug("New HF card found: %s", path); + + card = hf_audio_card_new(backend, path); + + while (dbus_message_iter_get_arg_type(props_i) != DBUS_TYPE_INVALID) { + char c; + + dbus_message_iter_recurse(props_i, &i); + + dbus_message_iter_get_basic(&i, &key); + dbus_message_iter_next(&i); + dbus_message_iter_recurse(&i, &value_i); + + if ((c = dbus_message_iter_get_arg_type(&value_i)) != DBUS_TYPE_STRING) { + pa_log_error("Invalid properties for %s: expected 's', received '%c'", path, c); + goto fail; + } + + dbus_message_iter_get_basic(&value_i, &value); + + if (pa_streq(key, "RemoteAddress")) { + pa_xfree(card->remote_address); + card->remote_address = pa_xstrdup(value); + } else if (pa_streq(key, "LocalAddress")) { + pa_xfree(card->local_address); + card->local_address = pa_xstrdup(value); + } else if (pa_streq(key, "Type")) { + if (pa_streq(value, "gateway")) + p = PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT; + } + + pa_log_debug("%s: %s", key, value); + + dbus_message_iter_next(props_i); + } + + d = pa_bluetooth_discovery_get_device_by_address(backend->discovery, card->remote_address, card->local_address); + if (!d) { + pa_log_error("Device doesnt exist for %s", path); + goto fail; + } + + card->transport = pa_bluetooth_transport_new(d, backend->ofono_bus_id, path, p, NULL, 0); + card->transport->acquire = hf_audio_agent_transport_acquire; + card->transport->release = hf_audio_agent_transport_release; + card->transport->userdata = card; + + pa_bluetooth_transport_put(card->transport); + pa_hashmap_put(backend->cards, card->path, card); + + return; + +fail: + hf_audio_card_free(card); +} + +static void hf_audio_agent_card_removed(pa_bluetooth_backend *backend, const char *path) { + struct hf_audio_card *card; + + pa_assert(backend); + pa_assert(path); + + pa_log_debug("HF card removed: %s", path); + + card = pa_hashmap_remove(backend->cards, path); + if (!card) + return; + + hf_audio_card_free(card); +} + +static void hf_audio_agent_get_cards_reply(DBusPendingCall *pending, void *userdata) { + DBusMessage *r; + pa_dbus_pending *p; + pa_bluetooth_backend *backend; + DBusMessageIter i, array_i, struct_i, props_i; + + pa_assert_se(p = userdata); + pa_assert_se(backend = p->context_data); + pa_assert_se(r = dbus_pending_call_steal_reply(pending)); + + if (dbus_message_get_type(r) == DBUS_MESSAGE_TYPE_ERROR) { + pa_log_error("Failed to get a list of handsfree audio cards from ofono: %s: %s", + dbus_message_get_error_name(r), pa_dbus_get_error_message(r)); + goto finish; + } + + if (!dbus_message_iter_init(r, &i) || !pa_streq(dbus_message_get_signature(r), "a(oa{sv})")) { + pa_log_error("Invalid arguments in GetCards() reply"); + goto finish; + } + + dbus_message_iter_recurse(&i, &array_i); + while (dbus_message_iter_get_arg_type(&array_i) != DBUS_TYPE_INVALID) { + const char *path; + + dbus_message_iter_recurse(&array_i, &struct_i); + dbus_message_iter_get_basic(&struct_i, &path); + dbus_message_iter_next(&struct_i); + + dbus_message_iter_recurse(&struct_i, &props_i); + + hf_audio_agent_card_found(backend, path, &props_i); + + dbus_message_iter_next(&array_i); + } + +finish: + dbus_message_unref(r); + + PA_LLIST_REMOVE(pa_dbus_pending, backend->pending, p); + pa_dbus_pending_free(p); +} + +static void hf_audio_agent_get_cards(pa_bluetooth_backend *hf) { + DBusMessage *m; + + pa_assert(hf); + + pa_assert_se(m = dbus_message_new_method_call(OFONO_SERVICE, "/", HF_AUDIO_MANAGER_INTERFACE, "GetCards")); + hf_dbus_send_and_add_to_pending(hf, m, hf_audio_agent_get_cards_reply, NULL); +} + +static void ofono_bus_id_destroy(pa_bluetooth_backend *backend) { + pa_hashmap_remove_all(backend->cards); + + if (backend->ofono_bus_id) { + pa_xfree(backend->ofono_bus_id); + backend->ofono_bus_id = NULL; + pa_bluetooth_discovery_set_ofono_running(backend->discovery, false); + } +} + +static void hf_audio_agent_register_reply(DBusPendingCall *pending, void *userdata) { + DBusMessage *r; + pa_dbus_pending *p; + pa_bluetooth_backend *backend; + + pa_assert_se(p = userdata); + pa_assert_se(backend = p->context_data); + pa_assert_se(r = dbus_pending_call_steal_reply(pending)); + + if (dbus_message_get_type(r) == DBUS_MESSAGE_TYPE_ERROR) { + pa_log_info("Failed to register as a handsfree audio agent with ofono: %s: %s", + dbus_message_get_error_name(r), pa_dbus_get_error_message(r)); + goto finish; + } + + backend->ofono_bus_id = pa_xstrdup(dbus_message_get_sender(r)); + + hf_audio_agent_get_cards(backend); + +finish: + dbus_message_unref(r); + + PA_LLIST_REMOVE(pa_dbus_pending, backend->pending, p); + pa_dbus_pending_free(p); + + pa_bluetooth_discovery_set_ofono_running(backend->discovery, backend->ofono_bus_id != NULL); +} + +static void hf_audio_agent_register(pa_bluetooth_backend *hf) { + DBusMessage *m; + uint8_t codecs[2]; + const uint8_t *pcodecs = codecs; + int ncodecs = 0; + const char *path = HF_AUDIO_AGENT_PATH; + + pa_assert(hf); + + pa_assert_se(m = dbus_message_new_method_call(OFONO_SERVICE, "/", HF_AUDIO_MANAGER_INTERFACE, "Register")); + + codecs[ncodecs++] = HFP_AUDIO_CODEC_CVSD; + + pa_assert_se(dbus_message_append_args(m, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &pcodecs, ncodecs, + DBUS_TYPE_INVALID)); + + hf_dbus_send_and_add_to_pending(hf, m, hf_audio_agent_register_reply, NULL); +} + +static void hf_audio_agent_unregister(pa_bluetooth_backend *backend) { + DBusMessage *m; + const char *path = HF_AUDIO_AGENT_PATH; + + pa_assert(backend); + pa_assert(backend->connection); + + if (backend->ofono_bus_id) { + pa_assert_se(m = dbus_message_new_method_call(backend->ofono_bus_id, "/", HF_AUDIO_MANAGER_INTERFACE, "Unregister")); + pa_assert_se(dbus_message_append_args(m, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID)); + pa_assert_se(dbus_connection_send(pa_dbus_connection_get(backend->connection), m, NULL)); + + ofono_bus_id_destroy(backend); + } +} + +static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *data) { + const char *sender; + DBusError err; + pa_bluetooth_backend *backend = data; + + pa_assert(bus); + pa_assert(m); + pa_assert(backend); + + sender = dbus_message_get_sender(m); + if (!pa_safe_streq(backend->ofono_bus_id, sender) && !pa_streq("org.freedesktop.DBus", sender)) + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + dbus_error_init(&err); + + if (dbus_message_is_signal(m, "org.freedesktop.DBus", "NameOwnerChanged")) { + const char *name, *old_owner, *new_owner; + + if (!dbus_message_get_args(m, &err, + DBUS_TYPE_STRING, &name, + DBUS_TYPE_STRING, &old_owner, + DBUS_TYPE_STRING, &new_owner, + DBUS_TYPE_INVALID)) { + pa_log_error("Failed to parse org.freedesktop.DBus.NameOwnerChanged: %s", err.message); + goto fail; + } + + if (pa_streq(name, OFONO_SERVICE)) { + + if (old_owner && *old_owner) { + pa_log_debug("oFono disappeared"); + ofono_bus_id_destroy(backend); + } + + if (new_owner && *new_owner) { + pa_log_debug("oFono appeared"); + hf_audio_agent_register(backend); + } + } + + } else if (dbus_message_is_signal(m, "org.ofono.HandsfreeAudioManager", "CardAdded")) { + const char *p; + DBusMessageIter arg_i, props_i; + + if (!dbus_message_iter_init(m, &arg_i) || !pa_streq(dbus_message_get_signature(m), "oa{sv}")) { + pa_log_error("Failed to parse org.ofono.HandsfreeAudioManager.CardAdded"); + goto fail; + } + + dbus_message_iter_get_basic(&arg_i, &p); + + pa_assert_se(dbus_message_iter_next(&arg_i)); + pa_assert(dbus_message_iter_get_arg_type(&arg_i) == DBUS_TYPE_ARRAY); + + dbus_message_iter_recurse(&arg_i, &props_i); + + hf_audio_agent_card_found(backend, p, &props_i); + } else if (dbus_message_is_signal(m, "org.ofono.HandsfreeAudioManager", "CardRemoved")) { + const char *p; + + if (!dbus_message_get_args(m, &err, DBUS_TYPE_OBJECT_PATH, &p, DBUS_TYPE_INVALID)) { + pa_log_error("Failed to parse org.ofono.HandsfreeAudioManager.CardRemoved: %s", err.message); + goto fail; + } + + hf_audio_agent_card_removed(backend, p); + } + +fail: + dbus_error_free(&err); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +static DBusMessage *hf_audio_agent_release(DBusConnection *c, DBusMessage *m, void *data) { + DBusMessage *r; + const char *sender; + pa_bluetooth_backend *backend = data; + + pa_assert(backend); + + sender = dbus_message_get_sender(m); + if (!pa_safe_streq(backend->ofono_bus_id, sender)) { + pa_assert_se(r = dbus_message_new_error(m, "org.ofono.Error.NotAllowed", "Operation is not allowed by this sender")); + return r; + } + + pa_log_debug("HF audio agent has been unregistered by oFono (%s)", backend->ofono_bus_id); + + ofono_bus_id_destroy(backend); + + pa_assert_se(r = dbus_message_new_method_return(m)); + + return r; +} + +static DBusMessage *hf_audio_agent_new_connection(DBusConnection *c, DBusMessage *m, void *data) { + DBusMessage *r; + const char *sender, *path; + int fd; + uint8_t codec; + struct hf_audio_card *card; + pa_bluetooth_backend *backend = data; + + pa_assert(backend); + + sender = dbus_message_get_sender(m); + if (!pa_safe_streq(backend->ofono_bus_id, sender)) { + pa_assert_se(r = dbus_message_new_error(m, "org.ofono.Error.NotAllowed", "Operation is not allowed by this sender")); + return r; + } + + if (dbus_message_get_args(m, NULL, + DBUS_TYPE_OBJECT_PATH, &path, + DBUS_TYPE_UNIX_FD, &fd, + DBUS_TYPE_BYTE, &codec, + DBUS_TYPE_INVALID) == FALSE) { + pa_assert_se(r = dbus_message_new_error(m, "org.ofono.Error.InvalidArguments", "Invalid arguments in method call")); + return r; + } + + card = pa_hashmap_get(backend->cards, path); + + if (!card || codec != HFP_AUDIO_CODEC_CVSD || card->fd >= 0) { + pa_log_warn("New audio connection invalid arguments (path=%s fd=%d, codec=%d)", path, fd, codec); + pa_assert_se(r = dbus_message_new_error(m, "org.ofono.Error.InvalidArguments", "Invalid arguments in method call")); + shutdown(fd, SHUT_RDWR); + close(fd); + return r; + } + + pa_log_debug("New audio connection on card %s (fd=%d, codec=%d)", path, fd, codec); + + card->connecting = false; + card->fd = fd; + card->transport->codec = codec; + + pa_bluetooth_transport_set_state(card->transport, PA_BLUETOOTH_TRANSPORT_STATE_PLAYING); + + pa_assert_se(r = dbus_message_new_method_return(m)); + + return r; +} + +static DBusHandlerResult hf_audio_agent_handler(DBusConnection *c, DBusMessage *m, void *data) { + pa_bluetooth_backend *backend = data; + DBusMessage *r = NULL; + const char *path, *interface, *member; + + pa_assert(backend); + + path = dbus_message_get_path(m); + interface = dbus_message_get_interface(m); + member = dbus_message_get_member(m); + + if (!pa_streq(path, HF_AUDIO_AGENT_PATH)) + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + pa_log_debug("dbus: path=%s, interface=%s, member=%s", path, interface, member); + + if (dbus_message_is_method_call(m, "org.freedesktop.DBus.Introspectable", "Introspect")) { + const char *xml = HF_AUDIO_AGENT_XML; + + pa_assert_se(r = dbus_message_new_method_return(m)); + pa_assert_se(dbus_message_append_args(r, DBUS_TYPE_STRING, &xml, DBUS_TYPE_INVALID)); + + } else if (dbus_message_is_method_call(m, HF_AUDIO_AGENT_INTERFACE, "NewConnection")) + r = hf_audio_agent_new_connection(c, m, data); + else if (dbus_message_is_method_call(m, HF_AUDIO_AGENT_INTERFACE, "Release")) + r = hf_audio_agent_release(c, m, data); + else + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + if (r) { + pa_assert_se(dbus_connection_send(pa_dbus_connection_get(backend->connection), r, NULL)); + dbus_message_unref(r); + } + + return DBUS_HANDLER_RESULT_HANDLED; +} + +pa_bluetooth_backend *pa_bluetooth_ofono_backend_new(pa_core *c, pa_bluetooth_discovery *y) { + pa_bluetooth_backend *backend; + DBusError err; + static const DBusObjectPathVTable vtable_hf_audio_agent = { + .message_function = hf_audio_agent_handler, + }; + + pa_assert(c); + + backend = pa_xnew0(pa_bluetooth_backend, 1); + backend->core = c; + backend->discovery = y; + backend->cards = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, + (pa_free_cb_t) hf_audio_card_free); + + dbus_error_init(&err); + + if (!(backend->connection = pa_dbus_bus_get(c, DBUS_BUS_SYSTEM, &err))) { + pa_log("Failed to get D-Bus connection: %s", err.message); + dbus_error_free(&err); + pa_xfree(backend); + return NULL; + } + + /* dynamic detection of handsfree audio cards */ + if (!dbus_connection_add_filter(pa_dbus_connection_get(backend->connection), filter_cb, backend, NULL)) { + pa_log_error("Failed to add filter function"); + pa_dbus_connection_unref(backend->connection); + pa_xfree(backend); + return NULL; + } + + if (pa_dbus_add_matches(pa_dbus_connection_get(backend->connection), &err, + "type='signal',sender='org.freedesktop.DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged'," + "arg0='" OFONO_SERVICE "'", + "type='signal',sender='" OFONO_SERVICE "',interface='" HF_AUDIO_MANAGER_INTERFACE "',member='CardAdded'", + "type='signal',sender='" OFONO_SERVICE "',interface='" HF_AUDIO_MANAGER_INTERFACE "',member='CardRemoved'", + NULL) < 0) { + pa_log("Failed to add oFono D-Bus matches: %s", err.message); + dbus_connection_remove_filter(pa_dbus_connection_get(backend->connection), filter_cb, backend); + pa_dbus_connection_unref(backend->connection); + pa_xfree(backend); + return NULL; + } + + pa_assert_se(dbus_connection_register_object_path(pa_dbus_connection_get(backend->connection), HF_AUDIO_AGENT_PATH, + &vtable_hf_audio_agent, backend)); + + hf_audio_agent_register(backend); + + return backend; +} + +void pa_bluetooth_ofono_backend_free(pa_bluetooth_backend *backend) { + pa_assert(backend); + + pa_dbus_free_pending_list(&backend->pending); + + hf_audio_agent_unregister(backend); + + dbus_connection_unregister_object_path(pa_dbus_connection_get(backend->connection), HF_AUDIO_AGENT_PATH); + + pa_dbus_remove_matches(pa_dbus_connection_get(backend->connection), + "type='signal',sender='org.freedesktop.DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged'," + "arg0='" OFONO_SERVICE "'", + "type='signal',sender='" OFONO_SERVICE "',interface='" HF_AUDIO_MANAGER_INTERFACE "',member='CardAdded'", + "type='signal',sender='" OFONO_SERVICE "',interface='" HF_AUDIO_MANAGER_INTERFACE "',member='CardRemoved'", + NULL); + + dbus_connection_remove_filter(pa_dbus_connection_get(backend->connection), filter_cb, backend); + + pa_dbus_connection_unref(backend->connection); + + pa_hashmap_free(backend->cards); + + pa_xfree(backend); +} diff --git a/src/modules/bluetooth/bluez5-util.c b/src/modules/bluetooth/bluez5-util.c new file mode 100644 index 0000000..a21896e --- /dev/null +++ b/src/modules/bluetooth/bluez5-util.c @@ -0,0 +1,1744 @@ +/*** + This file is part of PulseAudio. + + Copyright 2008-2013 João Paulo Rechi Vita + Copyrigth 2018-2019 Pali Rohár + + PulseAudio 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 2.1 of the + License, or (at your option) any later version. + + PulseAudio 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 Lesser General Public + License along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "a2dp-codec-util.h" +#include "a2dp-codecs.h" + +#include "bluez5-util.h" + +#define WAIT_FOR_PROFILES_TIMEOUT_USEC (3 * PA_USEC_PER_SEC) + +#define BLUEZ_SERVICE "org.bluez" +#define BLUEZ_ADAPTER_INTERFACE BLUEZ_SERVICE ".Adapter1" +#define BLUEZ_DEVICE_INTERFACE BLUEZ_SERVICE ".Device1" +#define BLUEZ_MEDIA_INTERFACE BLUEZ_SERVICE ".Media1" +#define BLUEZ_MEDIA_ENDPOINT_INTERFACE BLUEZ_SERVICE ".MediaEndpoint1" +#define BLUEZ_MEDIA_TRANSPORT_INTERFACE BLUEZ_SERVICE ".MediaTransport1" + +#define BLUEZ_ERROR_NOT_SUPPORTED "org.bluez.Error.NotSupported" + +#define A2DP_SOURCE_ENDPOINT "/MediaEndpoint/A2DPSource" +#define A2DP_SINK_ENDPOINT "/MediaEndpoint/A2DPSink" + +#define ENDPOINT_INTROSPECT_XML \ + DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \ + "" \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + " " \ + "" + +struct pa_bluetooth_discovery { + PA_REFCNT_DECLARE; + + pa_core *core; + pa_dbus_connection *connection; + bool filter_added; + bool matches_added; + bool objects_listed; + pa_hook hooks[PA_BLUETOOTH_HOOK_MAX]; + pa_hashmap *adapters; + pa_hashmap *devices; + pa_hashmap *transports; + + int headset_backend; + pa_bluetooth_backend *ofono_backend, *native_backend; + PA_LLIST_HEAD(pa_dbus_pending, pending); +}; + +static pa_dbus_pending* send_and_add_to_pending(pa_bluetooth_discovery *y, DBusMessage *m, + DBusPendingCallNotifyFunction func, void *call_data) { + pa_dbus_pending *p; + DBusPendingCall *call; + + pa_assert(y); + pa_assert(m); + + pa_assert_se(dbus_connection_send_with_reply(pa_dbus_connection_get(y->connection), m, &call, -1)); + + p = pa_dbus_pending_new(pa_dbus_connection_get(y->connection), m, call, y, call_data); + PA_LLIST_PREPEND(pa_dbus_pending, y->pending, p); + dbus_pending_call_set_notify(call, func, p, NULL); + + return p; +} + +static const char *check_variant_property(DBusMessageIter *i) { + const char *key; + + pa_assert(i); + + if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_STRING) { + pa_log_error("Property name not a string."); + return NULL; + } + + dbus_message_iter_get_basic(i, &key); + + if (!dbus_message_iter_next(i)) { + pa_log_error("Property value missing"); + return NULL; + } + + if (dbus_message_iter_get_arg_type(i) != DBUS_TYPE_VARIANT) { + pa_log_error("Property value not a variant."); + return NULL; + } + + return key; +} + +pa_bluetooth_transport *pa_bluetooth_transport_new(pa_bluetooth_device *d, const char *owner, const char *path, + pa_bluetooth_profile_t p, const uint8_t *config, size_t size) { + pa_bluetooth_transport *t; + + t = pa_xnew0(pa_bluetooth_transport, 1); + t->device = d; + t->owner = pa_xstrdup(owner); + t->path = pa_xstrdup(path); + t->profile = p; + t->config_size = size; + + if (size > 0) { + t->config = pa_xnew(uint8_t, size); + memcpy(t->config, config, size); + } + + return t; +} + +static const char *transport_state_to_string(pa_bluetooth_transport_state_t state) { + switch(state) { + case PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED: + return "disconnected"; + case PA_BLUETOOTH_TRANSPORT_STATE_IDLE: + return "idle"; + case PA_BLUETOOTH_TRANSPORT_STATE_PLAYING: + return "playing"; + } + + return "invalid"; +} + +static bool device_supports_profile(pa_bluetooth_device *device, pa_bluetooth_profile_t profile) { + switch (profile) { + case PA_BLUETOOTH_PROFILE_A2DP_SINK: + return !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_A2DP_SINK); + case PA_BLUETOOTH_PROFILE_A2DP_SOURCE: + return !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_A2DP_SOURCE); + case PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT: + return !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HSP_HS) + || !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HSP_HS_ALT) + || !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HFP_HF); + case PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY: + return !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HSP_AG) + || !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HFP_AG); + case PA_BLUETOOTH_PROFILE_OFF: + pa_assert_not_reached(); + } + + pa_assert_not_reached(); +} + +static bool device_is_profile_connected(pa_bluetooth_device *device, pa_bluetooth_profile_t profile) { + if (device->transports[profile] && device->transports[profile]->state != PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED) + return true; + else + return false; +} + +static unsigned device_count_disconnected_profiles(pa_bluetooth_device *device) { + pa_bluetooth_profile_t profile; + unsigned count = 0; + + for (profile = 0; profile < PA_BLUETOOTH_PROFILE_COUNT; profile++) { + if (!device_supports_profile(device, profile)) + continue; + + if (!device_is_profile_connected(device, profile)) + count++; + } + + return count; +} + +static void device_stop_waiting_for_profiles(pa_bluetooth_device *device) { + if (!device->wait_for_profiles_timer) + return; + + device->discovery->core->mainloop->time_free(device->wait_for_profiles_timer); + device->wait_for_profiles_timer = NULL; +} + +static void wait_for_profiles_cb(pa_mainloop_api *api, pa_time_event* event, const struct timeval *tv, void *userdata) { + pa_bluetooth_device *device = userdata; + pa_strbuf *buf; + pa_bluetooth_profile_t profile; + bool first = true; + char *profiles_str; + + device_stop_waiting_for_profiles(device); + + buf = pa_strbuf_new(); + + for (profile = 0; profile < PA_BLUETOOTH_PROFILE_COUNT; profile++) { + if (device_is_profile_connected(device, profile)) + continue; + + if (!device_supports_profile(device, profile)) + continue; + + if (first) + first = false; + else + pa_strbuf_puts(buf, ", "); + + pa_strbuf_puts(buf, pa_bluetooth_profile_to_string(profile)); + } + + profiles_str = pa_strbuf_to_string_free(buf); + pa_log_debug("Timeout expired, and device %s still has disconnected profiles: %s", + device->path, profiles_str); + pa_xfree(profiles_str); + pa_hook_fire(&device->discovery->hooks[PA_BLUETOOTH_HOOK_DEVICE_CONNECTION_CHANGED], device); +} + +static void device_start_waiting_for_profiles(pa_bluetooth_device *device) { + pa_assert(!device->wait_for_profiles_timer); + device->wait_for_profiles_timer = pa_core_rttime_new(device->discovery->core, + pa_rtclock_now() + WAIT_FOR_PROFILES_TIMEOUT_USEC, + wait_for_profiles_cb, device); +} + +void pa_bluetooth_transport_set_state(pa_bluetooth_transport *t, pa_bluetooth_transport_state_t state) { + bool old_any_connected; + unsigned n_disconnected_profiles; + bool new_device_appeared; + bool device_disconnected; + + pa_assert(t); + + if (t->state == state) + return; + + old_any_connected = pa_bluetooth_device_any_transport_connected(t->device); + + pa_log_debug("Transport %s state: %s -> %s", + t->path, transport_state_to_string(t->state), transport_state_to_string(state)); + + t->state = state; + + pa_hook_fire(&t->device->discovery->hooks[PA_BLUETOOTH_HOOK_TRANSPORT_STATE_CHANGED], t); + + /* If there are profiles that are expected to get connected soon (based + * on the UUID list), we wait for a bit before announcing the new + * device, so that all profiles have time to get connected before the + * card object is created. If we didn't wait, the card would always + * have only one profile marked as available in the initial state, + * which would prevent module-card-restore from restoring the initial + * profile properly. */ + + n_disconnected_profiles = device_count_disconnected_profiles(t->device); + + new_device_appeared = !old_any_connected && pa_bluetooth_device_any_transport_connected(t->device); + device_disconnected = old_any_connected && !pa_bluetooth_device_any_transport_connected(t->device); + + if (new_device_appeared) { + if (n_disconnected_profiles > 0) + device_start_waiting_for_profiles(t->device); + else + pa_hook_fire(&t->device->discovery->hooks[PA_BLUETOOTH_HOOK_DEVICE_CONNECTION_CHANGED], t->device); + return; + } + + if (device_disconnected) { + if (t->device->wait_for_profiles_timer) { + /* If the timer is still running when the device disconnects, we + * never sent the notification of the device getting connected, so + * we don't need to send a notification about the disconnection + * either. Let's just stop the timer. */ + device_stop_waiting_for_profiles(t->device); + } else + pa_hook_fire(&t->device->discovery->hooks[PA_BLUETOOTH_HOOK_DEVICE_CONNECTION_CHANGED], t->device); + return; + } + + if (n_disconnected_profiles == 0 && t->device->wait_for_profiles_timer) { + /* All profiles are now connected, so we can stop the wait timer and + * send a notification of the new device. */ + device_stop_waiting_for_profiles(t->device); + pa_hook_fire(&t->device->discovery->hooks[PA_BLUETOOTH_HOOK_DEVICE_CONNECTION_CHANGED], t->device); + } +} + +void pa_bluetooth_transport_put(pa_bluetooth_transport *t) { + pa_assert(t); + + t->device->transports[t->profile] = t; + pa_assert_se(pa_hashmap_put(t->device->discovery->transports, t->path, t) >= 0); + pa_bluetooth_transport_set_state(t, PA_BLUETOOTH_TRANSPORT_STATE_IDLE); +} + +void pa_bluetooth_transport_unlink(pa_bluetooth_transport *t) { + pa_assert(t); + + pa_bluetooth_transport_set_state(t, PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED); + pa_hashmap_remove(t->device->discovery->transports, t->path); + t->device->transports[t->profile] = NULL; +} + +void pa_bluetooth_transport_free(pa_bluetooth_transport *t) { + pa_assert(t); + + if (t->destroy) + t->destroy(t); + pa_bluetooth_transport_unlink(t); + + pa_xfree(t->owner); + pa_xfree(t->path); + pa_xfree(t->config); + pa_xfree(t); +} + +static int bluez5_transport_acquire_cb(pa_bluetooth_transport *t, bool optional, size_t *imtu, size_t *omtu) { + DBusMessage *m, *r; + DBusError err; + int ret; + uint16_t i, o; + const char *method = optional ? "TryAcquire" : "Acquire"; + + pa_assert(t); + pa_assert(t->device); + pa_assert(t->device->discovery); + + pa_assert_se(m = dbus_message_new_method_call(t->owner, t->path, BLUEZ_MEDIA_TRANSPORT_INTERFACE, method)); + + dbus_error_init(&err); + + r = dbus_connection_send_with_reply_and_block(pa_dbus_connection_get(t->device->discovery->connection), m, -1, &err); + dbus_message_unref(m); + m = NULL; + if (!r) { + if (optional && pa_streq(err.name, "org.bluez.Error.NotAvailable")) + pa_log_info("Failed optional acquire of unavailable transport %s", t->path); + else + pa_log_error("Transport %s() failed for transport %s (%s)", method, t->path, err.message); + + dbus_error_free(&err); + return -1; + } + + if (!dbus_message_get_args(r, &err, DBUS_TYPE_UNIX_FD, &ret, DBUS_TYPE_UINT16, &i, DBUS_TYPE_UINT16, &o, + DBUS_TYPE_INVALID)) { + pa_log_error("Failed to parse %s() reply: %s", method, err.message); + dbus_error_free(&err); + ret = -1; + goto finish; + } + + if (imtu) + *imtu = i; + + if (omtu) + *omtu = o; + +finish: + dbus_message_unref(r); + return ret; +} + +static void bluez5_transport_release_cb(pa_bluetooth_transport *t) { + DBusMessage *m, *r; + DBusError err; + + pa_assert(t); + pa_assert(t->device); + pa_assert(t->device->discovery); + + dbus_error_init(&err); + + if (t->state <= PA_BLUETOOTH_TRANSPORT_STATE_IDLE) { + pa_log_info("Transport %s auto-released by BlueZ or already released", t->path); + return; + } + + pa_assert_se(m = dbus_message_new_method_call(t->owner, t->path, BLUEZ_MEDIA_TRANSPORT_INTERFACE, "Release")); + r = dbus_connection_send_with_reply_and_block(pa_dbus_connection_get(t->device->discovery->connection), m, -1, &err); + dbus_message_unref(m); + m = NULL; + if (r) { + dbus_message_unref(r); + r = NULL; + } + + if (dbus_error_is_set(&err)) { + pa_log_error("Failed to release transport %s: %s", t->path, err.message); + dbus_error_free(&err); + } else + pa_log_info("Transport %s released", t->path); +} + +bool pa_bluetooth_device_any_transport_connected(const pa_bluetooth_device *d) { + unsigned i; + + pa_assert(d); + + if (!d->valid) + return false; + + for (i = 0; i < PA_BLUETOOTH_PROFILE_COUNT; i++) + if (d->transports[i] && d->transports[i]->state != PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED) + return true; + + return false; +} + +static int transport_state_from_string(const char* value, pa_bluetooth_transport_state_t *state) { + pa_assert(value); + pa_assert(state); + + if (pa_streq(value, "idle")) + *state = PA_BLUETOOTH_TRANSPORT_STATE_IDLE; + else if (pa_streq(value, "pending") || pa_streq(value, "active")) + *state = PA_BLUETOOTH_TRANSPORT_STATE_PLAYING; + else + return -1; + + return 0; +} + +static void parse_transport_property(pa_bluetooth_transport *t, DBusMessageIter *i) { + const char *key; + DBusMessageIter variant_i; + + key = check_variant_property(i); + if (key == NULL) + return; + + dbus_message_iter_recurse(i, &variant_i); + + switch (dbus_message_iter_get_arg_type(&variant_i)) { + + case DBUS_TYPE_STRING: { + + const char *value; + dbus_message_iter_get_basic(&variant_i, &value); + + if (pa_streq(key, "State")) { + pa_bluetooth_transport_state_t state; + + if (transport_state_from_string(value, &state) < 0) { + pa_log_error("Invalid state received: %s", value); + return; + } + + pa_bluetooth_transport_set_state(t, state); + } + + break; + } + } + + return; +} + +static int parse_transport_properties(pa_bluetooth_transport *t, DBusMessageIter *i) { + DBusMessageIter element_i; + + dbus_message_iter_recurse(i, &element_i); + + while (dbus_message_iter_get_arg_type(&element_i) == DBUS_TYPE_DICT_ENTRY) { + DBusMessageIter dict_i; + + dbus_message_iter_recurse(&element_i, &dict_i); + + parse_transport_property(t, &dict_i); + + dbus_message_iter_next(&element_i); + } + + return 0; +} + +static pa_bluetooth_device* device_create(pa_bluetooth_discovery *y, const char *path) { + pa_bluetooth_device *d; + + pa_assert(y); + pa_assert(path); + + d = pa_xnew0(pa_bluetooth_device, 1); + d->discovery = y; + d->path = pa_xstrdup(path); + d->uuids = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, pa_xfree); + + pa_hashmap_put(y->devices, d->path, d); + + return d; +} + +pa_bluetooth_device* pa_bluetooth_discovery_get_device_by_path(pa_bluetooth_discovery *y, const char *path) { + pa_bluetooth_device *d; + + pa_assert(y); + pa_assert(PA_REFCNT_VALUE(y) > 0); + pa_assert(path); + + if ((d = pa_hashmap_get(y->devices, path)) && d->valid) + return d; + + return NULL; +} + +pa_bluetooth_device* pa_bluetooth_discovery_get_device_by_address(pa_bluetooth_discovery *y, const char *remote, const char *local) { + pa_bluetooth_device *d; + void *state = NULL; + + pa_assert(y); + pa_assert(PA_REFCNT_VALUE(y) > 0); + pa_assert(remote); + pa_assert(local); + + while ((d = pa_hashmap_iterate(y->devices, &state, NULL))) + if (d->valid && pa_streq(d->address, remote) && pa_streq(d->adapter->address, local)) + return d; + + return NULL; +} + +static void device_free(pa_bluetooth_device *d) { + unsigned i; + + pa_assert(d); + + device_stop_waiting_for_profiles(d); + + pa_hook_fire(&d->discovery->hooks[PA_BLUETOOTH_HOOK_DEVICE_UNLINK], d); + + for (i = 0; i < PA_BLUETOOTH_PROFILE_COUNT; i++) { + pa_bluetooth_transport *t; + + if (!(t = d->transports[i])) + continue; + + pa_bluetooth_transport_free(t); + } + + if (d->uuids) + pa_hashmap_free(d->uuids); + + pa_xfree(d->path); + pa_xfree(d->alias); + pa_xfree(d->address); + pa_xfree(d->adapter_path); + pa_xfree(d); +} + +static void device_remove(pa_bluetooth_discovery *y, const char *path) { + pa_bluetooth_device *d; + + if (!(d = pa_hashmap_remove(y->devices, path))) + pa_log_warn("Unknown device removed %s", path); + else { + pa_log_debug("Device %s removed", path); + device_free(d); + } +} + +static void device_set_valid(pa_bluetooth_device *device, bool valid) { + bool old_any_connected; + + pa_assert(device); + + if (valid == device->valid) + return; + + old_any_connected = pa_bluetooth_device_any_transport_connected(device); + device->valid = valid; + + if (pa_bluetooth_device_any_transport_connected(device) != old_any_connected) + pa_hook_fire(&device->discovery->hooks[PA_BLUETOOTH_HOOK_DEVICE_CONNECTION_CHANGED], device); +} + +static void device_update_valid(pa_bluetooth_device *d) { + pa_assert(d); + + if (!d->properties_received) { + pa_assert(!d->valid); + return; + } + + /* Check if mandatory properties are set. */ + if (!d->address || !d->adapter_path || !d->alias) { + device_set_valid(d, false); + return; + } + + if (!d->adapter || !d->adapter->valid) { + device_set_valid(d, false); + return; + } + + device_set_valid(d, true); +} + +static void device_set_adapter(pa_bluetooth_device *device, pa_bluetooth_adapter *adapter) { + pa_assert(device); + + if (adapter == device->adapter) + return; + + device->adapter = adapter; + + device_update_valid(device); +} + +static pa_bluetooth_adapter* adapter_create(pa_bluetooth_discovery *y, const char *path) { + pa_bluetooth_adapter *a; + + pa_assert(y); + pa_assert(path); + + a = pa_xnew0(pa_bluetooth_adapter, 1); + a->discovery = y; + a->path = pa_xstrdup(path); + + pa_hashmap_put(y->adapters, a->path, a); + + return a; +} + +static void adapter_free(pa_bluetooth_adapter *a) { + pa_bluetooth_device *d; + void *state; + + pa_assert(a); + pa_assert(a->discovery); + + PA_HASHMAP_FOREACH(d, a->discovery->devices, state) + if (d->adapter == a) + device_set_adapter(d, NULL); + + pa_xfree(a->path); + pa_xfree(a->address); + pa_xfree(a); +} + +static void adapter_remove(pa_bluetooth_discovery *y, const char *path) { + pa_bluetooth_adapter *a; + + if (!(a = pa_hashmap_remove(y->adapters, path))) + pa_log_warn("Unknown adapter removed %s", path); + else { + pa_log_debug("Adapter %s removed", path); + adapter_free(a); + } +} + +static void parse_device_property(pa_bluetooth_device *d, DBusMessageIter *i) { + const char *key; + DBusMessageIter variant_i; + + pa_assert(d); + + key = check_variant_property(i); + if (key == NULL) { + pa_log_error("Received invalid property for device %s", d->path); + return; + } + + dbus_message_iter_recurse(i, &variant_i); + + switch (dbus_message_iter_get_arg_type(&variant_i)) { + + case DBUS_TYPE_STRING: { + const char *value; + dbus_message_iter_get_basic(&variant_i, &value); + + if (pa_streq(key, "Alias")) { + pa_xfree(d->alias); + d->alias = pa_xstrdup(value); + pa_log_debug("%s: %s", key, value); + } else if (pa_streq(key, "Address")) { + if (d->properties_received) { + pa_log_warn("Device property 'Address' expected to be constant but changed for %s, ignoring", d->path); + return; + } + + if (d->address) { + pa_log_warn("Device %s: Received a duplicate 'Address' property, ignoring", d->path); + return; + } + + d->address = pa_xstrdup(value); + pa_log_debug("%s: %s", key, value); + } + + break; + } + + case DBUS_TYPE_OBJECT_PATH: { + const char *value; + dbus_message_iter_get_basic(&variant_i, &value); + + if (pa_streq(key, "Adapter")) { + + if (d->properties_received) { + pa_log_warn("Device property 'Adapter' expected to be constant but changed for %s, ignoring", d->path); + return; + } + + if (d->adapter_path) { + pa_log_warn("Device %s: Received a duplicate 'Adapter' property, ignoring", d->path); + return; + } + + d->adapter_path = pa_xstrdup(value); + pa_log_debug("%s: %s", key, value); + } + + break; + } + + case DBUS_TYPE_UINT32: { + uint32_t value; + dbus_message_iter_get_basic(&variant_i, &value); + + if (pa_streq(key, "Class")) { + d->class_of_device = value; + pa_log_debug("%s: %d", key, value); + } + + break; + } + + case DBUS_TYPE_ARRAY: { + DBusMessageIter ai; + dbus_message_iter_recurse(&variant_i, &ai); + + if (dbus_message_iter_get_arg_type(&ai) == DBUS_TYPE_STRING && pa_streq(key, "UUIDs")) { + /* bluetoothd never removes UUIDs from a device object so we + * don't need to check for disappeared UUIDs here. */ + while (dbus_message_iter_get_arg_type(&ai) != DBUS_TYPE_INVALID) { + const char *value; + char *uuid; + + dbus_message_iter_get_basic(&ai, &value); + + if (pa_hashmap_get(d->uuids, value)) { + dbus_message_iter_next(&ai); + continue; + } + + uuid = pa_xstrdup(value); + pa_hashmap_put(d->uuids, uuid, uuid); + + pa_log_debug("%s: %s", key, value); + dbus_message_iter_next(&ai); + } + } + + break; + } + } +} + +static void parse_device_properties(pa_bluetooth_device *d, DBusMessageIter *i) { + DBusMessageIter element_i; + + dbus_message_iter_recurse(i, &element_i); + + while (dbus_message_iter_get_arg_type(&element_i) == DBUS_TYPE_DICT_ENTRY) { + DBusMessageIter dict_i; + + dbus_message_iter_recurse(&element_i, &dict_i); + parse_device_property(d, &dict_i); + dbus_message_iter_next(&element_i); + } + + if (!d->properties_received) { + d->properties_received = true; + device_update_valid(d); + + if (!d->address || !d->adapter_path || !d->alias) + pa_log_error("Non-optional information missing for device %s", d->path); + } +} + +static void parse_adapter_properties(pa_bluetooth_adapter *a, DBusMessageIter *i, bool is_property_change) { + DBusMessageIter element_i; + + pa_assert(a); + + dbus_message_iter_recurse(i, &element_i); + + while (dbus_message_iter_get_arg_type(&element_i) == DBUS_TYPE_DICT_ENTRY) { + DBusMessageIter dict_i, variant_i; + const char *key; + + dbus_message_iter_recurse(&element_i, &dict_i); + + key = check_variant_property(&dict_i); + if (key == NULL) { + pa_log_error("Received invalid property for adapter %s", a->path); + return; + } + + dbus_message_iter_recurse(&dict_i, &variant_i); + + if (dbus_message_iter_get_arg_type(&variant_i) == DBUS_TYPE_STRING && pa_streq(key, "Address")) { + const char *value; + + if (is_property_change) { + pa_log_warn("Adapter property 'Address' expected to be constant but changed for %s, ignoring", a->path); + return; + } + + if (a->address) { + pa_log_warn("Adapter %s received a duplicate 'Address' property, ignoring", a->path); + return; + } + + dbus_message_iter_get_basic(&variant_i, &value); + a->address = pa_xstrdup(value); + a->valid = true; + } + + dbus_message_iter_next(&element_i); + } +} + +static void register_endpoint_reply(DBusPendingCall *pending, void *userdata) { + DBusMessage *r; + pa_dbus_pending *p; + pa_bluetooth_discovery *y; + char *endpoint; + + pa_assert(pending); + pa_assert_se(p = userdata); + pa_assert_se(y = p->context_data); + pa_assert_se(endpoint = p->call_data); + pa_assert_se(r = dbus_pending_call_steal_reply(pending)); + + if (dbus_message_is_error(r, BLUEZ_ERROR_NOT_SUPPORTED)) { + pa_log_info("Couldn't register endpoint %s because it is disabled in BlueZ", endpoint); + goto finish; + } + + if (dbus_message_get_type(r) == DBUS_MESSAGE_TYPE_ERROR) { + pa_log_error(BLUEZ_MEDIA_INTERFACE ".RegisterEndpoint() failed: %s: %s", dbus_message_get_error_name(r), + pa_dbus_get_error_message(r)); + goto finish; + } + +finish: + dbus_message_unref(r); + + PA_LLIST_REMOVE(pa_dbus_pending, y->pending, p); + pa_dbus_pending_free(p); + + pa_xfree(endpoint); +} + +static void register_endpoint(pa_bluetooth_discovery *y, const pa_a2dp_codec *a2dp_codec, const char *path, const char *endpoint, const char *uuid) { + DBusMessage *m; + DBusMessageIter i, d; + uint8_t capabilities[MAX_A2DP_CAPS_SIZE]; + size_t capabilities_size; + uint8_t codec_id; + + pa_log_debug("Registering %s on adapter %s", endpoint, path); + + codec_id = a2dp_codec->id.codec_id; + capabilities_size = a2dp_codec->fill_capabilities(capabilities); + pa_assert(capabilities_size != 0); + + pa_assert_se(m = dbus_message_new_method_call(BLUEZ_SERVICE, path, BLUEZ_MEDIA_INTERFACE, "RegisterEndpoint")); + + dbus_message_iter_init_append(m, &i); + pa_assert_se(dbus_message_iter_append_basic(&i, DBUS_TYPE_OBJECT_PATH, &endpoint)); + dbus_message_iter_open_container(&i, DBUS_TYPE_ARRAY, DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING DBUS_TYPE_STRING_AS_STRING + DBUS_TYPE_VARIANT_AS_STRING DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &d); + pa_dbus_append_basic_variant_dict_entry(&d, "UUID", DBUS_TYPE_STRING, &uuid); + pa_dbus_append_basic_variant_dict_entry(&d, "Codec", DBUS_TYPE_BYTE, &codec_id); + pa_dbus_append_basic_array_variant_dict_entry(&d, "Capabilities", DBUS_TYPE_BYTE, &capabilities, capabilities_size); + + dbus_message_iter_close_container(&i, &d); + + send_and_add_to_pending(y, m, register_endpoint_reply, pa_xstrdup(endpoint)); +} + +static void parse_interfaces_and_properties(pa_bluetooth_discovery *y, DBusMessageIter *dict_i) { + DBusMessageIter element_i; + const char *path; + void *state; + pa_bluetooth_device *d; + + pa_assert(dbus_message_iter_get_arg_type(dict_i) == DBUS_TYPE_OBJECT_PATH); + dbus_message_iter_get_basic(dict_i, &path); + + pa_assert_se(dbus_message_iter_next(dict_i)); + pa_assert(dbus_message_iter_get_arg_type(dict_i) == DBUS_TYPE_ARRAY); + + dbus_message_iter_recurse(dict_i, &element_i); + + while (dbus_message_iter_get_arg_type(&element_i) == DBUS_TYPE_DICT_ENTRY) { + DBusMessageIter iface_i; + const char *interface; + + dbus_message_iter_recurse(&element_i, &iface_i); + + pa_assert(dbus_message_iter_get_arg_type(&iface_i) == DBUS_TYPE_STRING); + dbus_message_iter_get_basic(&iface_i, &interface); + + pa_assert_se(dbus_message_iter_next(&iface_i)); + pa_assert(dbus_message_iter_get_arg_type(&iface_i) == DBUS_TYPE_ARRAY); + + if (pa_streq(interface, BLUEZ_ADAPTER_INTERFACE)) { + + const pa_a2dp_codec *a2dp_codec_sbc; + pa_bluetooth_adapter *a; + + if ((a = pa_hashmap_get(y->adapters, path))) { + pa_log_error("Found duplicated D-Bus path for adapter %s", path); + return; + } else + a = adapter_create(y, path); + + pa_log_debug("Adapter %s found", path); + + parse_adapter_properties(a, &iface_i, false); + + if (!a->valid) + return; + + /* Currently only one A2DP codec is supported, so register only SBC + * Support for multiple codecs needs to use a new Bluez API which + * pulseaudio does not implement yet, patches are waiting in queue */ + a2dp_codec_sbc = pa_bluetooth_get_a2dp_codec("sbc"); + pa_assert(a2dp_codec_sbc); + register_endpoint(y, a2dp_codec_sbc, path, A2DP_SINK_ENDPOINT "/sbc", PA_BLUETOOTH_UUID_A2DP_SINK); + register_endpoint(y, a2dp_codec_sbc, path, A2DP_SOURCE_ENDPOINT "/sbc", PA_BLUETOOTH_UUID_A2DP_SOURCE); + + } else if (pa_streq(interface, BLUEZ_DEVICE_INTERFACE)) { + + if ((d = pa_hashmap_get(y->devices, path))) { + if (d->properties_received) { + pa_log_error("Found duplicated D-Bus path for device %s", path); + return; + } + } else + d = device_create(y, path); + + pa_log_debug("Device %s found", d->path); + + parse_device_properties(d, &iface_i); + + } else + pa_log_debug("Unknown interface %s found, skipping", interface); + + dbus_message_iter_next(&element_i); + } + + PA_HASHMAP_FOREACH(d, y->devices, state) { + if (d->properties_received && !d->tried_to_link_with_adapter) { + if (d->adapter_path) { + device_set_adapter(d, pa_hashmap_get(d->discovery->adapters, d->adapter_path)); + + if (!d->adapter) + pa_log("Device %s points to a nonexistent adapter %s.", d->path, d->adapter_path); + else if (!d->adapter->valid) + pa_log("Device %s points to an invalid adapter %s.", d->path, d->adapter_path); + } + + d->tried_to_link_with_adapter = true; + } + } + + return; +} + +void pa_bluetooth_discovery_set_ofono_running(pa_bluetooth_discovery *y, bool is_running) { + pa_assert(y); + + pa_log_debug("oFono is running: %s", pa_yes_no(is_running)); + if (y->headset_backend != HEADSET_BACKEND_AUTO) + return; + + /* If ofono starts running, all devices that might be connected to the HS role + * need to be disconnected, so that the devices can be handled by ofono */ + if (is_running) { + void *state; + pa_bluetooth_device *d; + + PA_HASHMAP_FOREACH(d, y->devices, state) { + if (device_supports_profile(d, PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY)) { + DBusMessage *m; + + pa_assert_se(m = dbus_message_new_method_call(BLUEZ_SERVICE, d->path, "org.bluez.Device1", "Disconnect")); + dbus_message_set_no_reply(m, true); + pa_assert_se(dbus_connection_send(pa_dbus_connection_get(y->connection), m, NULL)); + dbus_message_unref(m); + } + } + } + + pa_bluetooth_native_backend_enable_hs_role(y->native_backend, !is_running); +} + +static void get_managed_objects_reply(DBusPendingCall *pending, void *userdata) { + pa_dbus_pending *p; + pa_bluetooth_discovery *y; + DBusMessage *r; + DBusMessageIter arg_i, element_i; + + pa_assert_se(p = userdata); + pa_assert_se(y = p->context_data); + pa_assert_se(r = dbus_pending_call_steal_reply(pending)); + + if (dbus_message_is_error(r, DBUS_ERROR_UNKNOWN_METHOD)) { + pa_log_warn("BlueZ D-Bus ObjectManager not available"); + goto finish; + } + + if (dbus_message_get_type(r) == DBUS_MESSAGE_TYPE_ERROR) { + pa_log_error("GetManagedObjects() failed: %s: %s", dbus_message_get_error_name(r), pa_dbus_get_error_message(r)); + goto finish; + } + + if (!dbus_message_iter_init(r, &arg_i) || !pa_streq(dbus_message_get_signature(r), "a{oa{sa{sv}}}")) { + pa_log_error("Invalid reply signature for GetManagedObjects()"); + goto finish; + } + + dbus_message_iter_recurse(&arg_i, &element_i); + while (dbus_message_iter_get_arg_type(&element_i) == DBUS_TYPE_DICT_ENTRY) { + DBusMessageIter dict_i; + + dbus_message_iter_recurse(&element_i, &dict_i); + + parse_interfaces_and_properties(y, &dict_i); + + dbus_message_iter_next(&element_i); + } + + y->objects_listed = true; + + if (!y->native_backend && y->headset_backend != HEADSET_BACKEND_OFONO) + y->native_backend = pa_bluetooth_native_backend_new(y->core, y, (y->headset_backend == HEADSET_BACKEND_NATIVE)); + if (!y->ofono_backend && y->headset_backend != HEADSET_BACKEND_NATIVE) + y->ofono_backend = pa_bluetooth_ofono_backend_new(y->core, y); + +finish: + dbus_message_unref(r); + + PA_LLIST_REMOVE(pa_dbus_pending, y->pending, p); + pa_dbus_pending_free(p); +} + +static void get_managed_objects(pa_bluetooth_discovery *y) { + DBusMessage *m; + + pa_assert(y); + + pa_assert_se(m = dbus_message_new_method_call(BLUEZ_SERVICE, "/", "org.freedesktop.DBus.ObjectManager", + "GetManagedObjects")); + send_and_add_to_pending(y, m, get_managed_objects_reply, NULL); +} + +pa_hook* pa_bluetooth_discovery_hook(pa_bluetooth_discovery *y, pa_bluetooth_hook_t hook) { + pa_assert(y); + pa_assert(PA_REFCNT_VALUE(y) > 0); + + return &y->hooks[hook]; +} + +static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *userdata) { + pa_bluetooth_discovery *y; + DBusError err; + + pa_assert(bus); + pa_assert(m); + pa_assert_se(y = userdata); + + dbus_error_init(&err); + + if (dbus_message_is_signal(m, "org.freedesktop.DBus", "NameOwnerChanged")) { + const char *name, *old_owner, *new_owner; + + if (!dbus_message_get_args(m, &err, + DBUS_TYPE_STRING, &name, + DBUS_TYPE_STRING, &old_owner, + DBUS_TYPE_STRING, &new_owner, + DBUS_TYPE_INVALID)) { + pa_log_error("Failed to parse org.freedesktop.DBus.NameOwnerChanged: %s", err.message); + goto fail; + } + + if (pa_streq(name, BLUEZ_SERVICE)) { + if (old_owner && *old_owner) { + pa_log_debug("Bluetooth daemon disappeared"); + pa_hashmap_remove_all(y->devices); + pa_hashmap_remove_all(y->adapters); + y->objects_listed = false; + if (y->ofono_backend) { + pa_bluetooth_ofono_backend_free(y->ofono_backend); + y->ofono_backend = NULL; + } + if (y->native_backend) { + pa_bluetooth_native_backend_free(y->native_backend); + y->native_backend = NULL; + } + } + + if (new_owner && *new_owner) { + pa_log_debug("Bluetooth daemon appeared"); + get_managed_objects(y); + } + } + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } else if (dbus_message_is_signal(m, "org.freedesktop.DBus.ObjectManager", "InterfacesAdded")) { + DBusMessageIter arg_i; + + if (!y->objects_listed) + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; /* No reply received yet from GetManagedObjects */ + + if (!dbus_message_iter_init(m, &arg_i) || !pa_streq(dbus_message_get_signature(m), "oa{sa{sv}}")) { + pa_log_error("Invalid signature found in InterfacesAdded"); + goto fail; + } + + parse_interfaces_and_properties(y, &arg_i); + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } else if (dbus_message_is_signal(m, "org.freedesktop.DBus.ObjectManager", "InterfacesRemoved")) { + const char *p; + DBusMessageIter arg_i; + DBusMessageIter element_i; + + if (!y->objects_listed) + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; /* No reply received yet from GetManagedObjects */ + + if (!dbus_message_iter_init(m, &arg_i) || !pa_streq(dbus_message_get_signature(m), "oas")) { + pa_log_error("Invalid signature found in InterfacesRemoved"); + goto fail; + } + + dbus_message_iter_get_basic(&arg_i, &p); + + pa_assert_se(dbus_message_iter_next(&arg_i)); + pa_assert(dbus_message_iter_get_arg_type(&arg_i) == DBUS_TYPE_ARRAY); + + dbus_message_iter_recurse(&arg_i, &element_i); + + while (dbus_message_iter_get_arg_type(&element_i) == DBUS_TYPE_STRING) { + const char *iface; + + dbus_message_iter_get_basic(&element_i, &iface); + + if (pa_streq(iface, BLUEZ_DEVICE_INTERFACE)) + device_remove(y, p); + else if (pa_streq(iface, BLUEZ_ADAPTER_INTERFACE)) + adapter_remove(y, p); + + dbus_message_iter_next(&element_i); + } + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + } else if (dbus_message_is_signal(m, "org.freedesktop.DBus.Properties", "PropertiesChanged")) { + DBusMessageIter arg_i; + const char *iface; + + if (!y->objects_listed) + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; /* No reply received yet from GetManagedObjects */ + + if (!dbus_message_iter_init(m, &arg_i) || !pa_streq(dbus_message_get_signature(m), "sa{sv}as")) { + pa_log_error("Invalid signature found in PropertiesChanged"); + goto fail; + } + + dbus_message_iter_get_basic(&arg_i, &iface); + + pa_assert_se(dbus_message_iter_next(&arg_i)); + pa_assert(dbus_message_iter_get_arg_type(&arg_i) == DBUS_TYPE_ARRAY); + + if (pa_streq(iface, BLUEZ_ADAPTER_INTERFACE)) { + pa_bluetooth_adapter *a; + + pa_log_debug("Properties changed in adapter %s", dbus_message_get_path(m)); + + if (!(a = pa_hashmap_get(y->adapters, dbus_message_get_path(m)))) { + pa_log_warn("Properties changed in unknown adapter"); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + + parse_adapter_properties(a, &arg_i, true); + + } else if (pa_streq(iface, BLUEZ_DEVICE_INTERFACE)) { + pa_bluetooth_device *d; + + pa_log_debug("Properties changed in device %s", dbus_message_get_path(m)); + + if (!(d = pa_hashmap_get(y->devices, dbus_message_get_path(m)))) { + pa_log_warn("Properties changed in unknown device"); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + + if (!d->properties_received) + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + parse_device_properties(d, &arg_i); + } else if (pa_streq(iface, BLUEZ_MEDIA_TRANSPORT_INTERFACE)) { + pa_bluetooth_transport *t; + + pa_log_debug("Properties changed in transport %s", dbus_message_get_path(m)); + + if (!(t = pa_hashmap_get(y->transports, dbus_message_get_path(m)))) + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + parse_transport_properties(t, &arg_i); + } + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + +fail: + dbus_error_free(&err); + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +const char *pa_bluetooth_profile_to_string(pa_bluetooth_profile_t profile) { + switch(profile) { + case PA_BLUETOOTH_PROFILE_A2DP_SINK: + return "a2dp_sink"; + case PA_BLUETOOTH_PROFILE_A2DP_SOURCE: + return "a2dp_source"; + case PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT: + return "headset_head_unit"; + case PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY: + return "headset_audio_gateway"; + case PA_BLUETOOTH_PROFILE_OFF: + return "off"; + } + + return NULL; +} + +static const pa_a2dp_codec *a2dp_endpoint_to_a2dp_codec(const char *endpoint) { + const char *codec_name; + + if (pa_startswith(endpoint, A2DP_SINK_ENDPOINT "/")) + codec_name = endpoint + strlen(A2DP_SINK_ENDPOINT "/"); + else if (pa_startswith(endpoint, A2DP_SOURCE_ENDPOINT "/")) + codec_name = endpoint + strlen(A2DP_SOURCE_ENDPOINT "/"); + else + return NULL; + + return pa_bluetooth_get_a2dp_codec(codec_name); +} + +static DBusMessage *endpoint_set_configuration(DBusConnection *conn, DBusMessage *m, void *userdata) { + pa_bluetooth_discovery *y = userdata; + pa_bluetooth_device *d; + pa_bluetooth_transport *t; + const pa_a2dp_codec *a2dp_codec = NULL; + const char *sender, *path, *endpoint_path, *dev_path = NULL, *uuid = NULL; + const uint8_t *config = NULL; + int size = 0; + pa_bluetooth_profile_t p = PA_BLUETOOTH_PROFILE_OFF; + DBusMessageIter args, props; + DBusMessage *r; + + if (!dbus_message_iter_init(m, &args) || !pa_streq(dbus_message_get_signature(m), "oa{sv}")) { + pa_log_error("Invalid signature for method SetConfiguration()"); + goto fail2; + } + + dbus_message_iter_get_basic(&args, &path); + + if (pa_hashmap_get(y->transports, path)) { + pa_log_error("Endpoint SetConfiguration(): Transport %s is already configured.", path); + goto fail2; + } + + pa_assert_se(dbus_message_iter_next(&args)); + + dbus_message_iter_recurse(&args, &props); + if (dbus_message_iter_get_arg_type(&props) != DBUS_TYPE_DICT_ENTRY) + goto fail; + + endpoint_path = dbus_message_get_path(m); + + /* Read transport properties */ + while (dbus_message_iter_get_arg_type(&props) == DBUS_TYPE_DICT_ENTRY) { + const char *key; + DBusMessageIter value, entry; + int var; + + dbus_message_iter_recurse(&props, &entry); + dbus_message_iter_get_basic(&entry, &key); + + dbus_message_iter_next(&entry); + dbus_message_iter_recurse(&entry, &value); + + var = dbus_message_iter_get_arg_type(&value); + + if (pa_streq(key, "UUID")) { + if (var != DBUS_TYPE_STRING) { + pa_log_error("Property %s of wrong type %c", key, (char)var); + goto fail; + } + + dbus_message_iter_get_basic(&value, &uuid); + + if (pa_startswith(endpoint_path, A2DP_SINK_ENDPOINT "/")) + p = PA_BLUETOOTH_PROFILE_A2DP_SOURCE; + else if (pa_startswith(endpoint_path, A2DP_SOURCE_ENDPOINT "/")) + p = PA_BLUETOOTH_PROFILE_A2DP_SINK; + + if ((pa_streq(uuid, PA_BLUETOOTH_UUID_A2DP_SOURCE) && p != PA_BLUETOOTH_PROFILE_A2DP_SINK) || + (pa_streq(uuid, PA_BLUETOOTH_UUID_A2DP_SINK) && p != PA_BLUETOOTH_PROFILE_A2DP_SOURCE)) { + pa_log_error("UUID %s of transport %s incompatible with endpoint %s", uuid, path, endpoint_path); + goto fail; + } + } else if (pa_streq(key, "Device")) { + if (var != DBUS_TYPE_OBJECT_PATH) { + pa_log_error("Property %s of wrong type %c", key, (char)var); + goto fail; + } + + dbus_message_iter_get_basic(&value, &dev_path); + } else if (pa_streq(key, "Configuration")) { + DBusMessageIter array; + + if (var != DBUS_TYPE_ARRAY) { + pa_log_error("Property %s of wrong type %c", key, (char)var); + goto fail; + } + + dbus_message_iter_recurse(&value, &array); + var = dbus_message_iter_get_arg_type(&array); + if (var != DBUS_TYPE_BYTE) { + pa_log_error("%s is an array of wrong type %c", key, (char)var); + goto fail; + } + + dbus_message_iter_get_fixed_array(&array, &config, &size); + + a2dp_codec = a2dp_endpoint_to_a2dp_codec(endpoint_path); + pa_assert(a2dp_codec); + + if (!a2dp_codec->is_configuration_valid(config, size)) + goto fail; + } + + dbus_message_iter_next(&props); + } + + if (!a2dp_codec) + goto fail2; + + if ((d = pa_hashmap_get(y->devices, dev_path))) { + if (!d->valid) { + pa_log_error("Information about device %s is invalid", dev_path); + goto fail2; + } + } else { + /* InterfacesAdded signal is probably on its way, device_info_valid is kept as 0. */ + pa_log_warn("SetConfiguration() received for unknown device %s", dev_path); + d = device_create(y, dev_path); + } + + if (d->transports[p] != NULL) { + pa_log_error("Cannot configure transport %s because profile %s is already used", path, pa_bluetooth_profile_to_string(p)); + goto fail2; + } + + sender = dbus_message_get_sender(m); + + pa_assert_se(r = dbus_message_new_method_return(m)); + pa_assert_se(dbus_connection_send(pa_dbus_connection_get(y->connection), r, NULL)); + dbus_message_unref(r); + + t = pa_bluetooth_transport_new(d, sender, path, p, config, size); + t->a2dp_codec = a2dp_codec; + t->acquire = bluez5_transport_acquire_cb; + t->release = bluez5_transport_release_cb; + pa_bluetooth_transport_put(t); + + pa_log_debug("Transport %s available for profile %s", t->path, pa_bluetooth_profile_to_string(t->profile)); + + return NULL; + +fail: + pa_log_error("Endpoint SetConfiguration(): invalid arguments"); + +fail2: + pa_assert_se(r = dbus_message_new_error(m, "org.bluez.Error.InvalidArguments", "Unable to set configuration")); + return r; +} + +static DBusMessage *endpoint_select_configuration(DBusConnection *conn, DBusMessage *m, void *userdata) { + pa_bluetooth_discovery *y = userdata; + const char *endpoint_path; + uint8_t *cap; + int size; + const pa_a2dp_codec *a2dp_codec; + uint8_t config[MAX_A2DP_CAPS_SIZE]; + uint8_t *config_ptr = config; + size_t config_size; + DBusMessage *r; + DBusError err; + + endpoint_path = dbus_message_get_path(m); + + dbus_error_init(&err); + + if (!dbus_message_get_args(m, &err, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &cap, &size, DBUS_TYPE_INVALID)) { + pa_log_error("Endpoint SelectConfiguration(): %s", err.message); + dbus_error_free(&err); + goto fail; + } + + a2dp_codec = a2dp_endpoint_to_a2dp_codec(endpoint_path); + pa_assert(a2dp_codec); + + config_size = a2dp_codec->fill_preferred_configuration(&y->core->default_sample_spec, cap, size, config); + if (config_size == 0) + goto fail; + + pa_assert_se(r = dbus_message_new_method_return(m)); + pa_assert_se(dbus_message_append_args(r, DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &config_ptr, config_size, DBUS_TYPE_INVALID)); + + return r; + +fail: + pa_assert_se(r = dbus_message_new_error(m, "org.bluez.Error.InvalidArguments", "Unable to select configuration")); + return r; +} + +static DBusMessage *endpoint_clear_configuration(DBusConnection *conn, DBusMessage *m, void *userdata) { + pa_bluetooth_discovery *y = userdata; + pa_bluetooth_transport *t; + DBusMessage *r; + DBusError err; + const char *path; + + dbus_error_init(&err); + + if (!dbus_message_get_args(m, &err, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID)) { + pa_log_error("Endpoint ClearConfiguration(): %s", err.message); + dbus_error_free(&err); + goto fail; + } + + if ((t = pa_hashmap_get(y->transports, path))) { + pa_log_debug("Clearing transport %s profile %s", t->path, pa_bluetooth_profile_to_string(t->profile)); + pa_bluetooth_transport_free(t); + } + + pa_assert_se(r = dbus_message_new_method_return(m)); + + return r; + +fail: + pa_assert_se(r = dbus_message_new_error(m, "org.bluez.Error.InvalidArguments", "Unable to clear configuration")); + return r; +} + +static DBusMessage *endpoint_release(DBusConnection *conn, DBusMessage *m, void *userdata) { + DBusMessage *r = NULL; + + /* From doc/media-api.txt in bluez: + * + * This method gets called when the service daemon + * unregisters the endpoint. An endpoint can use it to do + * cleanup tasks. There is no need to unregister the + * endpoint, because when this method gets called it has + * already been unregistered. + * + * We don't have any cleanup to do. */ + + /* Reply only if requested. Generally bluetoothd doesn't request a reply + * to the Release() call. Sending replies when not requested on the system + * bus tends to cause errors in syslog from dbus-daemon, because it + * doesn't let unexpected replies through, so it's important to have this + * check here. */ + if (!dbus_message_get_no_reply(m)) + pa_assert_se(r = dbus_message_new_method_return(m)); + + return r; +} + +static DBusHandlerResult endpoint_handler(DBusConnection *c, DBusMessage *m, void *userdata) { + struct pa_bluetooth_discovery *y = userdata; + DBusMessage *r = NULL; + const char *path, *interface, *member; + + pa_assert(y); + + path = dbus_message_get_path(m); + interface = dbus_message_get_interface(m); + member = dbus_message_get_member(m); + + pa_log_debug("dbus: path=%s, interface=%s, member=%s", path, interface, member); + + if (!a2dp_endpoint_to_a2dp_codec(path)) + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + if (dbus_message_is_method_call(m, "org.freedesktop.DBus.Introspectable", "Introspect")) { + const char *xml = ENDPOINT_INTROSPECT_XML; + + pa_assert_se(r = dbus_message_new_method_return(m)); + pa_assert_se(dbus_message_append_args(r, DBUS_TYPE_STRING, &xml, DBUS_TYPE_INVALID)); + + } else if (dbus_message_is_method_call(m, BLUEZ_MEDIA_ENDPOINT_INTERFACE, "SetConfiguration")) + r = endpoint_set_configuration(c, m, userdata); + else if (dbus_message_is_method_call(m, BLUEZ_MEDIA_ENDPOINT_INTERFACE, "SelectConfiguration")) + r = endpoint_select_configuration(c, m, userdata); + else if (dbus_message_is_method_call(m, BLUEZ_MEDIA_ENDPOINT_INTERFACE, "ClearConfiguration")) + r = endpoint_clear_configuration(c, m, userdata); + else if (dbus_message_is_method_call(m, BLUEZ_MEDIA_ENDPOINT_INTERFACE, "Release")) + r = endpoint_release(c, m, userdata); + else + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + if (r) { + pa_assert_se(dbus_connection_send(pa_dbus_connection_get(y->connection), r, NULL)); + dbus_message_unref(r); + } + + return DBUS_HANDLER_RESULT_HANDLED; +} + +static void endpoint_init(pa_bluetooth_discovery *y, const char *endpoint) { + static const DBusObjectPathVTable vtable_endpoint = { + .message_function = endpoint_handler, + }; + + pa_assert(y); + pa_assert(endpoint); + + pa_assert_se(dbus_connection_register_object_path(pa_dbus_connection_get(y->connection), endpoint, + &vtable_endpoint, y)); +} + +static void endpoint_done(pa_bluetooth_discovery *y, const char *endpoint) { + pa_assert(y); + pa_assert(endpoint); + + dbus_connection_unregister_object_path(pa_dbus_connection_get(y->connection), endpoint); +} + +pa_bluetooth_discovery* pa_bluetooth_discovery_get(pa_core *c, int headset_backend) { + pa_bluetooth_discovery *y; + DBusError err; + DBusConnection *conn; + unsigned i, count; + const pa_a2dp_codec *a2dp_codec; + char *endpoint; + + y = pa_xnew0(pa_bluetooth_discovery, 1); + PA_REFCNT_INIT(y); + y->core = c; + y->headset_backend = headset_backend; + y->adapters = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, + (pa_free_cb_t) adapter_free); + y->devices = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, + (pa_free_cb_t) device_free); + y->transports = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + PA_LLIST_HEAD_INIT(pa_dbus_pending, y->pending); + + for (i = 0; i < PA_BLUETOOTH_HOOK_MAX; i++) + pa_hook_init(&y->hooks[i], y); + + pa_shared_set(c, "bluetooth-discovery", y); + + dbus_error_init(&err); + + if (!(y->connection = pa_dbus_bus_get(y->core, DBUS_BUS_SYSTEM, &err))) { + pa_log_error("Failed to get D-Bus connection: %s", err.message); + goto fail; + } + + conn = pa_dbus_connection_get(y->connection); + + /* dynamic detection of bluetooth audio devices */ + if (!dbus_connection_add_filter(conn, filter_cb, y, NULL)) { + pa_log_error("Failed to add filter function"); + goto fail; + } + y->filter_added = true; + + if (pa_dbus_add_matches(conn, &err, + "type='signal',sender='org.freedesktop.DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged'" + ",arg0='" BLUEZ_SERVICE "'", + "type='signal',sender='" BLUEZ_SERVICE "',interface='org.freedesktop.DBus.ObjectManager',member='InterfacesAdded'", + "type='signal',sender='" BLUEZ_SERVICE "',interface='org.freedesktop.DBus.ObjectManager'," + "member='InterfacesRemoved'", + "type='signal',sender='" BLUEZ_SERVICE "',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged'" + ",arg0='" BLUEZ_ADAPTER_INTERFACE "'", + "type='signal',sender='" BLUEZ_SERVICE "',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged'" + ",arg0='" BLUEZ_DEVICE_INTERFACE "'", + "type='signal',sender='" BLUEZ_SERVICE "',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged'" + ",arg0='" BLUEZ_MEDIA_TRANSPORT_INTERFACE "'", + NULL) < 0) { + pa_log_error("Failed to add D-Bus matches: %s", err.message); + goto fail; + } + y->matches_added = true; + + count = pa_bluetooth_a2dp_codec_count(); + for (i = 0; i < count; i++) { + a2dp_codec = pa_bluetooth_a2dp_codec_iter(i); + + endpoint = pa_sprintf_malloc("%s/%s", A2DP_SINK_ENDPOINT, a2dp_codec->name); + endpoint_init(y, endpoint); + pa_xfree(endpoint); + + endpoint = pa_sprintf_malloc("%s/%s", A2DP_SOURCE_ENDPOINT, a2dp_codec->name); + endpoint_init(y, endpoint); + pa_xfree(endpoint); + } + + get_managed_objects(y); + + return y; + +fail: + pa_bluetooth_discovery_unref(y); + dbus_error_free(&err); + + return NULL; +} + +pa_bluetooth_discovery* pa_bluetooth_discovery_ref(pa_bluetooth_discovery *y) { + pa_assert(y); + pa_assert(PA_REFCNT_VALUE(y) > 0); + + PA_REFCNT_INC(y); + + return y; +} + +void pa_bluetooth_discovery_unref(pa_bluetooth_discovery *y) { + unsigned i, count; + const pa_a2dp_codec *a2dp_codec; + char *endpoint; + + pa_assert(y); + pa_assert(PA_REFCNT_VALUE(y) > 0); + + if (PA_REFCNT_DEC(y) > 0) + return; + + pa_dbus_free_pending_list(&y->pending); + + if (y->ofono_backend) + pa_bluetooth_ofono_backend_free(y->ofono_backend); + if (y->native_backend) + pa_bluetooth_native_backend_free(y->native_backend); + + if (y->adapters) + pa_hashmap_free(y->adapters); + + if (y->devices) + pa_hashmap_free(y->devices); + + if (y->transports) { + pa_assert(pa_hashmap_isempty(y->transports)); + pa_hashmap_free(y->transports); + } + + if (y->connection) { + + if (y->matches_added) + pa_dbus_remove_matches(pa_dbus_connection_get(y->connection), + "type='signal',sender='org.freedesktop.DBus',interface='org.freedesktop.DBus',member='NameOwnerChanged'," + "arg0='" BLUEZ_SERVICE "'", + "type='signal',sender='" BLUEZ_SERVICE "',interface='org.freedesktop.DBus.ObjectManager'," + "member='InterfacesAdded'", + "type='signal',sender='" BLUEZ_SERVICE "',interface='org.freedesktop.DBus.ObjectManager'," + "member='InterfacesRemoved'", + "type='signal',sender='" BLUEZ_SERVICE "',interface='org.freedesktop.DBus.Properties'," + "member='PropertiesChanged',arg0='" BLUEZ_ADAPTER_INTERFACE "'", + "type='signal',sender='" BLUEZ_SERVICE "',interface='org.freedesktop.DBus.Properties'," + "member='PropertiesChanged',arg0='" BLUEZ_DEVICE_INTERFACE "'", + "type='signal',sender='" BLUEZ_SERVICE "',interface='org.freedesktop.DBus.Properties'," + "member='PropertiesChanged',arg0='" BLUEZ_MEDIA_TRANSPORT_INTERFACE "'", + NULL); + + if (y->filter_added) + dbus_connection_remove_filter(pa_dbus_connection_get(y->connection), filter_cb, y); + + count = pa_bluetooth_a2dp_codec_count(); + for (i = 0; i < count; i++) { + a2dp_codec = pa_bluetooth_a2dp_codec_iter(i); + + endpoint = pa_sprintf_malloc("%s/%s", A2DP_SINK_ENDPOINT, a2dp_codec->name); + endpoint_done(y, endpoint); + pa_xfree(endpoint); + + endpoint = pa_sprintf_malloc("%s/%s", A2DP_SOURCE_ENDPOINT, a2dp_codec->name); + endpoint_done(y, endpoint); + pa_xfree(endpoint); + } + + pa_dbus_connection_unref(y->connection); + } + + pa_shared_remove(y->core, "bluetooth-discovery"); + pa_xfree(y); +} diff --git a/src/modules/bluetooth/bluez5-util.h b/src/modules/bluetooth/bluez5-util.h new file mode 100644 index 0000000..ff172e0 --- /dev/null +++ b/src/modules/bluetooth/bluez5-util.h @@ -0,0 +1,185 @@ +#ifndef foobluez5utilhfoo +#define foobluez5utilhfoo + +/*** + This file is part of PulseAudio. + + Copyright 2008-2013 João Paulo Rechi Vita + Copyrigth 2018-2019 Pali Rohár + + PulseAudio 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 2.1 of the + License, or (at your option) any later version. + + PulseAudio 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 Lesser General Public + License along with PulseAudio; if not, see . +***/ + +#include + +#include "a2dp-codec-util.h" + +#define PA_BLUETOOTH_UUID_A2DP_SOURCE "0000110a-0000-1000-8000-00805f9b34fb" +#define PA_BLUETOOTH_UUID_A2DP_SINK "0000110b-0000-1000-8000-00805f9b34fb" + +/* There are two HSP HS UUIDs. The first one (older?) is used both as the HSP + * profile identifier and as the HS role identifier, while the second one is + * only used to identify the role. As far as PulseAudio is concerned, the two + * UUIDs mean exactly the same thing. */ +#define PA_BLUETOOTH_UUID_HSP_HS "00001108-0000-1000-8000-00805f9b34fb" +#define PA_BLUETOOTH_UUID_HSP_HS_ALT "00001131-0000-1000-8000-00805f9b34fb" + +#define PA_BLUETOOTH_UUID_HSP_AG "00001112-0000-1000-8000-00805f9b34fb" +#define PA_BLUETOOTH_UUID_HFP_HF "0000111e-0000-1000-8000-00805f9b34fb" +#define PA_BLUETOOTH_UUID_HFP_AG "0000111f-0000-1000-8000-00805f9b34fb" + +typedef struct pa_bluetooth_transport pa_bluetooth_transport; +typedef struct pa_bluetooth_device pa_bluetooth_device; +typedef struct pa_bluetooth_adapter pa_bluetooth_adapter; +typedef struct pa_bluetooth_discovery pa_bluetooth_discovery; +typedef struct pa_bluetooth_backend pa_bluetooth_backend; + +typedef enum pa_bluetooth_hook { + PA_BLUETOOTH_HOOK_DEVICE_CONNECTION_CHANGED, /* Call data: pa_bluetooth_device */ + PA_BLUETOOTH_HOOK_DEVICE_UNLINK, /* Call data: pa_bluetooth_device */ + PA_BLUETOOTH_HOOK_TRANSPORT_STATE_CHANGED, /* Call data: pa_bluetooth_transport */ + PA_BLUETOOTH_HOOK_TRANSPORT_MICROPHONE_GAIN_CHANGED, /* Call data: pa_bluetooth_transport */ + PA_BLUETOOTH_HOOK_TRANSPORT_SPEAKER_GAIN_CHANGED, /* Call data: pa_bluetooth_transport */ + PA_BLUETOOTH_HOOK_MAX +} pa_bluetooth_hook_t; + +typedef enum profile { + PA_BLUETOOTH_PROFILE_A2DP_SINK, + PA_BLUETOOTH_PROFILE_A2DP_SOURCE, + PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT, + PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY, + PA_BLUETOOTH_PROFILE_OFF +} pa_bluetooth_profile_t; +#define PA_BLUETOOTH_PROFILE_COUNT PA_BLUETOOTH_PROFILE_OFF + +typedef enum pa_bluetooth_transport_state { + PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED, + PA_BLUETOOTH_TRANSPORT_STATE_IDLE, + PA_BLUETOOTH_TRANSPORT_STATE_PLAYING +} pa_bluetooth_transport_state_t; + +typedef int (*pa_bluetooth_transport_acquire_cb)(pa_bluetooth_transport *t, bool optional, size_t *imtu, size_t *omtu); +typedef void (*pa_bluetooth_transport_release_cb)(pa_bluetooth_transport *t); +typedef void (*pa_bluetooth_transport_destroy_cb)(pa_bluetooth_transport *t); +typedef void (*pa_bluetooth_transport_set_speaker_gain_cb)(pa_bluetooth_transport *t, uint16_t gain); +typedef void (*pa_bluetooth_transport_set_microphone_gain_cb)(pa_bluetooth_transport *t, uint16_t gain); + +struct pa_bluetooth_transport { + pa_bluetooth_device *device; + + char *owner; + char *path; + pa_bluetooth_profile_t profile; + + uint8_t codec; + uint8_t *config; + size_t config_size; + + const pa_a2dp_codec *a2dp_codec; + + uint16_t microphone_gain; + uint16_t speaker_gain; + + pa_bluetooth_transport_state_t state; + + pa_bluetooth_transport_acquire_cb acquire; + pa_bluetooth_transport_release_cb release; + pa_bluetooth_transport_destroy_cb destroy; + pa_bluetooth_transport_set_speaker_gain_cb set_speaker_gain; + pa_bluetooth_transport_set_microphone_gain_cb set_microphone_gain; + void *userdata; +}; + +struct pa_bluetooth_device { + pa_bluetooth_discovery *discovery; + pa_bluetooth_adapter *adapter; + + bool properties_received; + bool tried_to_link_with_adapter; + bool valid; + bool autodetect_mtu; + + /* Device information */ + char *path; + char *adapter_path; + char *alias; + char *address; + uint32_t class_of_device; + pa_hashmap *uuids; /* char* -> char* (hashmap-as-a-set) */ + + pa_bluetooth_transport *transports[PA_BLUETOOTH_PROFILE_COUNT]; + + pa_time_event *wait_for_profiles_timer; +}; + +struct pa_bluetooth_adapter { + pa_bluetooth_discovery *discovery; + char *path; + char *address; + + bool valid; +}; + +#ifdef HAVE_BLUEZ_5_OFONO_HEADSET +pa_bluetooth_backend *pa_bluetooth_ofono_backend_new(pa_core *c, pa_bluetooth_discovery *y); +void pa_bluetooth_ofono_backend_free(pa_bluetooth_backend *b); +#else +static inline pa_bluetooth_backend *pa_bluetooth_ofono_backend_new(pa_core *c, pa_bluetooth_discovery *y) { + return NULL; +} +static inline void pa_bluetooth_ofono_backend_free(pa_bluetooth_backend *b) {} +#endif + +#ifdef HAVE_BLUEZ_5_NATIVE_HEADSET +pa_bluetooth_backend *pa_bluetooth_native_backend_new(pa_core *c, pa_bluetooth_discovery *y, bool enable_hs_role); +void pa_bluetooth_native_backend_free(pa_bluetooth_backend *b); +void pa_bluetooth_native_backend_enable_hs_role(pa_bluetooth_backend *b, bool enable_hs_role); +#else +static inline pa_bluetooth_backend *pa_bluetooth_native_backend_new(pa_core *c, pa_bluetooth_discovery *y, bool enable_hs_role) { + return NULL; +} +static inline void pa_bluetooth_native_backend_free(pa_bluetooth_backend *b) {} +static inline void pa_bluetooth_native_backend_enable_hs_role(pa_bluetooth_backend *b, bool enable_hs_role) {} +#endif + +pa_bluetooth_transport *pa_bluetooth_transport_new(pa_bluetooth_device *d, const char *owner, const char *path, + pa_bluetooth_profile_t p, const uint8_t *config, size_t size); + +void pa_bluetooth_transport_set_state(pa_bluetooth_transport *t, pa_bluetooth_transport_state_t state); +void pa_bluetooth_transport_put(pa_bluetooth_transport *t); +void pa_bluetooth_transport_unlink(pa_bluetooth_transport *t); +void pa_bluetooth_transport_free(pa_bluetooth_transport *t); + +bool pa_bluetooth_device_any_transport_connected(const pa_bluetooth_device *d); + +pa_bluetooth_device* pa_bluetooth_discovery_get_device_by_path(pa_bluetooth_discovery *y, const char *path); +pa_bluetooth_device* pa_bluetooth_discovery_get_device_by_address(pa_bluetooth_discovery *y, const char *remote, const char *local); + +pa_hook* pa_bluetooth_discovery_hook(pa_bluetooth_discovery *y, pa_bluetooth_hook_t hook); + +const char *pa_bluetooth_profile_to_string(pa_bluetooth_profile_t profile); + +static inline bool pa_bluetooth_uuid_is_hsp_hs(const char *uuid) { + return pa_streq(uuid, PA_BLUETOOTH_UUID_HSP_HS) || pa_streq(uuid, PA_BLUETOOTH_UUID_HSP_HS_ALT); +} + +#define HEADSET_BACKEND_OFONO 0 +#define HEADSET_BACKEND_NATIVE 1 +#define HEADSET_BACKEND_AUTO 2 + +pa_bluetooth_discovery* pa_bluetooth_discovery_get(pa_core *core, int headset_backend); +pa_bluetooth_discovery* pa_bluetooth_discovery_ref(pa_bluetooth_discovery *y); +void pa_bluetooth_discovery_unref(pa_bluetooth_discovery *y); +void pa_bluetooth_discovery_set_ofono_running(pa_bluetooth_discovery *y, bool is_running); +#endif diff --git a/src/modules/bluetooth/meson.build b/src/modules/bluetooth/meson.build new file mode 100644 index 0000000..9982cba --- /dev/null +++ b/src/modules/bluetooth/meson.build @@ -0,0 +1,33 @@ +libbluez5_util_sources = [ + 'a2dp-codec-sbc.c', + 'a2dp-codec-util.c', + 'bluez5-util.c', +] + +libbluez5_util_headers = [ + 'a2dp-codec-api.h', + 'a2dp-codecs.h', + 'a2dp-codec-util.h', + 'bluez5-util.h', + 'rtp.h', +] + +if get_option('bluez5-native-headset') + libbluez5_util_sources += [ 'backend-native.c' ] +endif + +if get_option('bluez5-ofono-headset') + libbluez5_util_sources += [ 'backend-ofono.c' ] +endif + +libbluez5_util = shared_library('bluez5-util', + libbluez5_util_sources, + libbluez5_util_headers, + c_args : [pa_c_args, server_c_args], + link_args : [nodelete_link_args], + include_directories : [configinc, topinc], + dependencies : [libpulse_dep, libpulsecommon_dep, libpulsecore_dep, dbus_dep, sbc_dep, libintl_dep], + install : true, + install_rpath : privlibdir, + install_dir : modlibexecdir, +) diff --git a/src/modules/bluetooth/module-bluetooth-discover.c b/src/modules/bluetooth/module-bluetooth-discover.c new file mode 100644 index 0000000..cf8c7ee --- /dev/null +++ b/src/modules/bluetooth/module-bluetooth-discover.c @@ -0,0 +1,76 @@ +/*** + This file is part of PulseAudio. + + Copyright 2013 João Paulo Rechi Vita + + PulseAudio 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 2.1 of the + License, or (at your option) any later version. + + PulseAudio 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 Lesser General Public + License along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +PA_MODULE_AUTHOR("João Paulo Rechi Vita"); +PA_MODULE_DESCRIPTION("Detect available Bluetooth daemon and load the corresponding discovery module"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(true); +PA_MODULE_USAGE( + "headset=ofono|native|auto" + "autodetect_mtu=" +); + +struct userdata { + uint32_t bluez5_module_idx; +}; + +int pa__init(pa_module* m) { + struct userdata *u; + pa_module *mm; + + pa_assert(m); + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->bluez5_module_idx = PA_INVALID_INDEX; + + if (pa_module_exists("module-bluez5-discover")) { + pa_module_load(&mm, m->core, "module-bluez5-discover", m->argument); + if (mm) + u->bluez5_module_idx = mm->index; + } + + if (u->bluez5_module_idx == PA_INVALID_INDEX) { + pa_xfree(u); + return -1; + } + + return 0; +} + +void pa__done(pa_module* m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->bluez5_module_idx != PA_INVALID_INDEX) + pa_module_unload_by_index(m->core, u->bluez5_module_idx, true); + + pa_xfree(u); +} diff --git a/src/modules/bluetooth/module-bluetooth-policy.c b/src/modules/bluetooth/module-bluetooth-policy.c new file mode 100644 index 0000000..ffaa140 --- /dev/null +++ b/src/modules/bluetooth/module-bluetooth-policy.c @@ -0,0 +1,517 @@ +/*** + This file is part of PulseAudio. + + Copyright 2006 Lennart Poettering + Copyright 2009 Canonical Ltd + Copyright (C) 2012 Intel Corporation + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include +#include +#include +#include + +PA_MODULE_AUTHOR("Frédéric Dalleau, Pali Rohár"); +PA_MODULE_DESCRIPTION("Policy module to make using bluetooth devices out-of-the-box easier"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(true); +PA_MODULE_USAGE( + "auto_switch= " + "a2dp_source= " + "ag= "); + +static const char* const valid_modargs[] = { + "auto_switch", + "a2dp_source", + "ag", + NULL +}; + +struct userdata { + uint32_t auto_switch; + bool enable_a2dp_source; + bool enable_ag; + pa_hook_slot *source_put_slot; + pa_hook_slot *sink_put_slot; + pa_hook_slot *source_output_put_slot; + pa_hook_slot *source_output_unlink_slot; + pa_hook_slot *card_init_profile_slot; + pa_hook_slot *card_unlink_slot; + pa_hook_slot *profile_available_changed_slot; + pa_hashmap *will_need_revert_card_map; +}; + +/* When a source is created, loopback it to default sink */ +static pa_hook_result_t source_put_hook_callback(pa_core *c, pa_source *source, void *userdata) { + struct userdata *u = userdata; + const char *s; + const char *role; + char *args; + pa_module *m = NULL; + + pa_assert(c); + pa_assert(source); + + /* Only consider bluetooth sinks and sources */ + s = pa_proplist_gets(source->proplist, PA_PROP_DEVICE_BUS); + if (!s) + return PA_HOOK_OK; + + if (!pa_streq(s, "bluetooth")) + return PA_HOOK_OK; + + s = pa_proplist_gets(source->proplist, "bluetooth.protocol"); + if (!s) + return PA_HOOK_OK; + + if (u->enable_a2dp_source && pa_streq(s, "a2dp_source")) + role = "music"; + else if (u->enable_ag && pa_streq(s, "headset_audio_gateway")) + role = "phone"; + else { + pa_log_debug("Profile %s cannot be selected for loopback", s); + return PA_HOOK_OK; + } + + /* Load module-loopback */ + args = pa_sprintf_malloc("source=\"%s\" source_dont_move=\"true\" sink_input_properties=\"media.role=%s\"", source->name, + role); + (void) pa_module_load(&m, c, "module-loopback", args); + pa_xfree(args); + + return PA_HOOK_OK; +} + +/* When a sink is created, loopback it to default source */ +static pa_hook_result_t sink_put_hook_callback(pa_core *c, pa_sink *sink, void *userdata) { + struct userdata *u = userdata; + const char *s; + const char *role; + char *args; + pa_module *m = NULL; + + pa_assert(c); + pa_assert(sink); + + /* Only consider bluetooth sinks and sources */ + s = pa_proplist_gets(sink->proplist, PA_PROP_DEVICE_BUS); + if (!s) + return PA_HOOK_OK; + + if (!pa_streq(s, "bluetooth")) + return PA_HOOK_OK; + + s = pa_proplist_gets(sink->proplist, "bluetooth.protocol"); + if (!s) + return PA_HOOK_OK; + + if (u->enable_ag && pa_streq(s, "headset_audio_gateway")) + role = "phone"; + else { + pa_log_debug("Profile %s cannot be selected for loopback", s); + return PA_HOOK_OK; + } + + /* Load module-loopback */ + args = pa_sprintf_malloc("sink=\"%s\" sink_dont_move=\"true\" source_output_properties=\"media.role=%s\"", sink->name, + role); + (void) pa_module_load(&m, c, "module-loopback", args); + pa_xfree(args); + + return PA_HOOK_OK; +} + +static void card_set_profile(struct userdata *u, pa_card *card, bool revert_to_a2dp) +{ + pa_card_profile *profile; + void *state; + + /* Find available profile and activate it */ + PA_HASHMAP_FOREACH(profile, card->profiles, state) { + if (profile->available == PA_AVAILABLE_NO) + continue; + + /* Check for correct profile based on revert_to_a2dp */ + if (revert_to_a2dp) { + if (!pa_streq(profile->name, "a2dp_sink")) + continue; + } else { + if (!pa_streq(profile->name, "headset_head_unit")) + continue; + } + + pa_log_debug("Setting card '%s' to profile '%s'", card->name, profile->name); + + if (pa_card_set_profile(card, profile, false) != 0) { + pa_log_warn("Could not set profile '%s'", profile->name); + continue; + } + + /* When we are not in revert_to_a2dp phase flag this card for will_need_revert */ + if (!revert_to_a2dp) + pa_hashmap_put(u->will_need_revert_card_map, card, PA_INT_TO_PTR(1)); + + break; + } +} + +/* Switch profile for one card */ +static void switch_profile(pa_card *card, bool revert_to_a2dp, void *userdata) { + struct userdata *u = userdata; + const char *s; + + /* Only consider bluetooth cards */ + s = pa_proplist_gets(card->proplist, PA_PROP_DEVICE_BUS); + if (!s || !pa_streq(s, "bluetooth")) + return; + + if (revert_to_a2dp) { + /* In revert_to_a2dp phase only consider cards with will_need_revert flag and remove it */ + if (!pa_hashmap_remove(u->will_need_revert_card_map, card)) + return; + + /* Skip card if does not have active hsp profile */ + if (!pa_streq(card->active_profile->name, "headset_head_unit")) + return; + + /* Skip card if already has active a2dp profile */ + if (pa_streq(card->active_profile->name, "a2dp_sink")) + return; + } else { + /* Skip card if does not have active a2dp profile */ + if (!pa_streq(card->active_profile->name, "a2dp_sink")) + return; + + /* Skip card if already has active hsp profile */ + if (pa_streq(card->active_profile->name, "headset_head_unit")) + return; + } + + card_set_profile(u, card, revert_to_a2dp); +} + +/* Return true if we should ignore this source output */ +static bool ignore_output(pa_source_output *source_output, void *userdata) { + struct userdata *u = userdata; + const char *s; + + /* New applications could set media.role for identifying streams */ + /* We are interested only in media.role=phone */ + s = pa_proplist_gets(source_output->proplist, PA_PROP_MEDIA_ROLE); + if (s) + return !pa_streq(s, "phone"); + + /* If media.role is not set use some heuristic (if enabled) */ + if (u->auto_switch != 2) + return true; + + /* Ignore if resample method is peaks (used by desktop volume programs) */ + if (pa_source_output_get_resample_method(source_output) == PA_RESAMPLER_PEAKS) + return true; + + /* Ignore if there is no client/application assigned (used by virtual stream) */ + if (!source_output->client) + return true; + + /* Ignore if recording from monitor of sink */ + if (source_output->direct_on_input) + return true; + + return false; +} + +static unsigned source_output_count(pa_core *c, void *userdata) { + pa_source_output *source_output; + uint32_t idx; + unsigned count = 0; + + PA_IDXSET_FOREACH(source_output, c->source_outputs, idx) + if (!ignore_output(source_output, userdata)) + ++count; + + return count; +} + +/* Switch profile for all cards */ +static void switch_profile_all(pa_idxset *cards, bool revert_to_a2dp, void *userdata) { + pa_card *card; + uint32_t idx; + + PA_IDXSET_FOREACH(card, cards, idx) + switch_profile(card, revert_to_a2dp, userdata); +} + +/* When a source output is created, switch profile a2dp to profile hsp */ +static pa_hook_result_t source_output_put_hook_callback(pa_core *c, pa_source_output *source_output, void *userdata) { + pa_assert(c); + pa_assert(source_output); + + if (ignore_output(source_output, userdata)) + return PA_HOOK_OK; + + switch_profile_all(c->cards, false, userdata); + return PA_HOOK_OK; +} + +/* When all source outputs are unlinked, switch profile hsp back back to profile a2dp */ +static pa_hook_result_t source_output_unlink_hook_callback(pa_core *c, pa_source_output *source_output, void *userdata) { + pa_assert(c); + pa_assert(source_output); + + if (ignore_output(source_output, userdata)) + return PA_HOOK_OK; + + /* If there are still some source outputs do nothing. */ + if (source_output_count(c, userdata) > 0) + return PA_HOOK_OK; + + switch_profile_all(c->cards, true, userdata); + return PA_HOOK_OK; +} + +static pa_hook_result_t card_init_profile_hook_callback(pa_core *c, pa_card *card, void *userdata) { + struct userdata *u = userdata; + const char *s; + + pa_assert(c); + pa_assert(card); + + if (source_output_count(c, userdata) == 0) + return PA_HOOK_OK; + + /* Only consider bluetooth cards */ + s = pa_proplist_gets(card->proplist, PA_PROP_DEVICE_BUS); + if (!s || !pa_streq(s, "bluetooth")) + return PA_HOOK_OK; + + /* Ignore card if has already set other initial profile than a2dp */ + if (card->active_profile && + !pa_streq(card->active_profile->name, "a2dp_sink")) + return PA_HOOK_OK; + + /* Set initial profile to hsp */ + card_set_profile(u, card, false); + + /* Flag this card for will_need_revert */ + pa_hashmap_put(u->will_need_revert_card_map, card, PA_INT_TO_PTR(1)); + return PA_HOOK_OK; +} + +static pa_hook_result_t card_unlink_hook_callback(pa_core *c, pa_card *card, void *userdata) { + pa_assert(c); + pa_assert(card); + switch_profile(card, true, userdata); + return PA_HOOK_OK; +} + +static pa_card_profile *find_best_profile(pa_card *card) { + void *state; + pa_card_profile *profile; + pa_card_profile *result = card->active_profile; + + PA_HASHMAP_FOREACH(profile, card->profiles, state) { + if (profile->available == PA_AVAILABLE_NO) + continue; + + if (result == NULL || + (profile->available == PA_AVAILABLE_YES && result->available == PA_AVAILABLE_UNKNOWN) || + (profile->available == result->available && profile->priority > result->priority)) + result = profile; + } + + return result; +} + +static pa_hook_result_t profile_available_hook_callback(pa_core *c, pa_card_profile *profile, void *userdata) { + pa_card *card; + const char *s; + bool is_active_profile; + pa_card_profile *selected_profile; + + pa_assert(c); + pa_assert(profile); + pa_assert_se((card = profile->card)); + + /* Only consider bluetooth cards */ + s = pa_proplist_gets(card->proplist, PA_PROP_DEVICE_BUS); + if (!s || !pa_streq(s, "bluetooth")) + return PA_HOOK_OK; + + /* Do not automatically switch profiles for headsets, just in case */ + if (pa_streq(profile->name, "a2dp_sink") || pa_streq(profile->name, "headset_head_unit")) + return PA_HOOK_OK; + + is_active_profile = card->active_profile == profile; + + if (profile->available == PA_AVAILABLE_YES) { + if (is_active_profile) + return PA_HOOK_OK; + + if (card->active_profile->available == PA_AVAILABLE_YES && card->active_profile->priority >= profile->priority) + return PA_HOOK_OK; + + selected_profile = profile; + } else { + if (!is_active_profile) + return PA_HOOK_OK; + + pa_assert_se((selected_profile = find_best_profile(card))); + + if (selected_profile == card->active_profile) + return PA_HOOK_OK; + } + + pa_log_debug("Setting card '%s' to profile '%s'", card->name, selected_profile->name); + + if (pa_card_set_profile(card, selected_profile, false) != 0) + pa_log_warn("Could not set profile '%s'", selected_profile->name); + + return PA_HOOK_OK; +} + +static void handle_all_profiles(pa_core *core) { + pa_card *card; + uint32_t state; + + PA_IDXSET_FOREACH(card, core->cards, state) { + pa_card_profile *profile; + void *state2; + + PA_HASHMAP_FOREACH(profile, card->profiles, state2) + profile_available_hook_callback(core, profile, NULL); + } +} + +int pa__init(pa_module *m) { + pa_modargs *ma; + struct userdata *u; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log_error("Failed to parse module arguments"); + goto fail; + } + + m->userdata = u = pa_xnew0(struct userdata, 1); + + u->auto_switch = 1; + + if (pa_modargs_get_value(ma, "auto_switch", NULL)) { + bool auto_switch_bool; + + /* auto_switch originally took a boolean value, let's keep + * compatibility with configuration files that still pass a boolean. */ + if (pa_modargs_get_value_boolean(ma, "auto_switch", &auto_switch_bool) >= 0) { + if (auto_switch_bool) + u->auto_switch = 1; + else + u->auto_switch = 0; + + } else if (pa_modargs_get_value_u32(ma, "auto_switch", &u->auto_switch) < 0) { + pa_log("Failed to parse auto_switch argument."); + goto fail; + } + } + + u->enable_a2dp_source = true; + if (pa_modargs_get_value_boolean(ma, "a2dp_source", &u->enable_a2dp_source) < 0) { + pa_log("Failed to parse a2dp_source argument."); + goto fail; + } + + u->enable_ag = true; + if (pa_modargs_get_value_boolean(ma, "ag", &u->enable_ag) < 0) { + pa_log("Failed to parse ag argument."); + goto fail; + } + + u->will_need_revert_card_map = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + + u->source_put_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_PUT], PA_HOOK_NORMAL, + (pa_hook_cb_t) source_put_hook_callback, u); + + u->sink_put_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_PUT], PA_HOOK_NORMAL, + (pa_hook_cb_t) sink_put_hook_callback, u); + + if (u->auto_switch) { + u->source_output_put_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_PUT], PA_HOOK_NORMAL, + (pa_hook_cb_t) source_output_put_hook_callback, u); + + u->source_output_unlink_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_UNLINK_POST], PA_HOOK_NORMAL, + (pa_hook_cb_t) source_output_unlink_hook_callback, u); + + u->card_init_profile_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_CARD_CHOOSE_INITIAL_PROFILE], PA_HOOK_NORMAL, + (pa_hook_cb_t) card_init_profile_hook_callback, u); + + u->card_unlink_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_CARD_UNLINK], PA_HOOK_NORMAL, + (pa_hook_cb_t) card_unlink_hook_callback, u); + } + + u->profile_available_changed_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_CARD_PROFILE_AVAILABLE_CHANGED], + PA_HOOK_NORMAL, (pa_hook_cb_t) profile_available_hook_callback, u); + + handle_all_profiles(m->core); + + pa_modargs_free(ma); + return 0; + +fail: + if (ma) + pa_modargs_free(ma); + return -1; +} + +void pa__done(pa_module *m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->source_put_slot) + pa_hook_slot_free(u->source_put_slot); + + if (u->sink_put_slot) + pa_hook_slot_free(u->sink_put_slot); + + if (u->source_output_put_slot) + pa_hook_slot_free(u->source_output_put_slot); + + if (u->source_output_unlink_slot) + pa_hook_slot_free(u->source_output_unlink_slot); + + if (u->card_init_profile_slot) + pa_hook_slot_free(u->card_init_profile_slot); + + if (u->card_unlink_slot) + pa_hook_slot_free(u->card_unlink_slot); + + if (u->profile_available_changed_slot) + pa_hook_slot_free(u->profile_available_changed_slot); + + pa_hashmap_free(u->will_need_revert_card_map); + + pa_xfree(u); +} diff --git a/src/modules/bluetooth/module-bluez5-device.c b/src/modules/bluetooth/module-bluez5-device.c new file mode 100644 index 0000000..402053a --- /dev/null +++ b/src/modules/bluetooth/module-bluez5-device.c @@ -0,0 +1,2417 @@ +/*** + This file is part of PulseAudio. + + Copyright 2008-2013 João Paulo Rechi Vita + Copyright 2011-2013 BMW Car IT GmbH. + Copyright 2018-2019 Pali Rohár + + PulseAudio 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 2.1 of the + License, or (at your option) any later version. + + PulseAudio 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 Lesser General Public + License along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "a2dp-codecs.h" +#include "a2dp-codec-util.h" +#include "bluez5-util.h" + +PA_MODULE_AUTHOR("João Paulo Rechi Vita"); +PA_MODULE_DESCRIPTION("BlueZ 5 Bluetooth audio sink and source"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(false); +PA_MODULE_USAGE("path=" + "autodetect_mtu="); + +#define FIXED_LATENCY_PLAYBACK_A2DP (25 * PA_USEC_PER_MSEC) +#define FIXED_LATENCY_PLAYBACK_SCO (25 * PA_USEC_PER_MSEC) +#define FIXED_LATENCY_RECORD_A2DP (25 * PA_USEC_PER_MSEC) +#define FIXED_LATENCY_RECORD_SCO (25 * PA_USEC_PER_MSEC) + +#define HSP_MAX_GAIN 15 + +static const char* const valid_modargs[] = { + "path", + "autodetect_mtu", + NULL +}; + +enum { + BLUETOOTH_MESSAGE_IO_THREAD_FAILED, + BLUETOOTH_MESSAGE_STREAM_FD_HUP, + BLUETOOTH_MESSAGE_SET_TRANSPORT_PLAYING, + BLUETOOTH_MESSAGE_MAX +}; + +enum { + PA_SOURCE_MESSAGE_SETUP_STREAM = PA_SOURCE_MESSAGE_MAX, +}; + +enum { + PA_SINK_MESSAGE_SETUP_STREAM = PA_SINK_MESSAGE_MAX, +}; + +typedef struct bluetooth_msg { + pa_msgobject parent; + pa_card *card; +} bluetooth_msg; +PA_DEFINE_PRIVATE_CLASS(bluetooth_msg, pa_msgobject); +#define BLUETOOTH_MSG(o) (bluetooth_msg_cast(o)) + +struct userdata { + pa_module *module; + pa_core *core; + + pa_hook_slot *device_connection_changed_slot; + pa_hook_slot *transport_state_changed_slot; + pa_hook_slot *transport_speaker_gain_changed_slot; + pa_hook_slot *transport_microphone_gain_changed_slot; + + pa_bluetooth_discovery *discovery; + pa_bluetooth_device *device; + pa_bluetooth_transport *transport; + bool transport_acquired; + bool stream_setup_done; + + pa_card *card; + pa_sink *sink; + pa_source *source; + pa_bluetooth_profile_t profile; + char *output_port_name; + char *input_port_name; + + pa_thread *thread; + pa_thread_mq thread_mq; + pa_rtpoll *rtpoll; + pa_rtpoll_item *rtpoll_item; + bluetooth_msg *msg; + + int stream_fd; + int stream_write_type; + size_t read_link_mtu; + size_t write_link_mtu; + size_t read_block_size; + size_t write_block_size; + uint64_t read_index; + uint64_t write_index; + pa_usec_t started_at; + pa_smoother *read_smoother; + pa_memchunk write_memchunk; + + const pa_a2dp_codec *a2dp_codec; + + void *encoder_info; + pa_sample_spec encoder_sample_spec; + void *encoder_buffer; /* Codec transfer buffer */ + size_t encoder_buffer_size; /* Size of the buffer */ + + void *decoder_info; + pa_sample_spec decoder_sample_spec; + void *decoder_buffer; /* Codec transfer buffer */ + size_t decoder_buffer_size; /* Size of the buffer */ +}; + +typedef enum pa_bluetooth_form_factor { + PA_BLUETOOTH_FORM_FACTOR_UNKNOWN, + PA_BLUETOOTH_FORM_FACTOR_HEADSET, + PA_BLUETOOTH_FORM_FACTOR_HANDSFREE, + PA_BLUETOOTH_FORM_FACTOR_MICROPHONE, + PA_BLUETOOTH_FORM_FACTOR_SPEAKER, + PA_BLUETOOTH_FORM_FACTOR_HEADPHONE, + PA_BLUETOOTH_FORM_FACTOR_PORTABLE, + PA_BLUETOOTH_FORM_FACTOR_CAR, + PA_BLUETOOTH_FORM_FACTOR_HIFI, + PA_BLUETOOTH_FORM_FACTOR_PHONE, +} pa_bluetooth_form_factor_t; + +/* Run from main thread */ +static pa_bluetooth_form_factor_t form_factor_from_class(uint32_t class_of_device) { + unsigned major, minor; + pa_bluetooth_form_factor_t r; + + static const pa_bluetooth_form_factor_t table[] = { + [1] = PA_BLUETOOTH_FORM_FACTOR_HEADSET, + [2] = PA_BLUETOOTH_FORM_FACTOR_HANDSFREE, + [4] = PA_BLUETOOTH_FORM_FACTOR_MICROPHONE, + [5] = PA_BLUETOOTH_FORM_FACTOR_SPEAKER, + [6] = PA_BLUETOOTH_FORM_FACTOR_HEADPHONE, + [7] = PA_BLUETOOTH_FORM_FACTOR_PORTABLE, + [8] = PA_BLUETOOTH_FORM_FACTOR_CAR, + [10] = PA_BLUETOOTH_FORM_FACTOR_HIFI + }; + + /* + * See Bluetooth Assigned Numbers: + * https://www.bluetooth.org/Technical/AssignedNumbers/baseband.htm + */ + major = (class_of_device >> 8) & 0x1F; + minor = (class_of_device >> 2) & 0x3F; + + switch (major) { + case 2: + return PA_BLUETOOTH_FORM_FACTOR_PHONE; + case 4: + break; + default: + pa_log_debug("Unknown Bluetooth major device class %u", major); + return PA_BLUETOOTH_FORM_FACTOR_UNKNOWN; + } + + r = minor < PA_ELEMENTSOF(table) ? table[minor] : PA_BLUETOOTH_FORM_FACTOR_UNKNOWN; + + if (!r) + pa_log_debug("Unknown Bluetooth minor device class %u", minor); + + return r; +} + +/* Run from main thread */ +static const char *form_factor_to_string(pa_bluetooth_form_factor_t ff) { + switch (ff) { + case PA_BLUETOOTH_FORM_FACTOR_UNKNOWN: + return "unknown"; + case PA_BLUETOOTH_FORM_FACTOR_HEADSET: + return "headset"; + case PA_BLUETOOTH_FORM_FACTOR_HANDSFREE: + return "hands-free"; + case PA_BLUETOOTH_FORM_FACTOR_MICROPHONE: + return "microphone"; + case PA_BLUETOOTH_FORM_FACTOR_SPEAKER: + return "speaker"; + case PA_BLUETOOTH_FORM_FACTOR_HEADPHONE: + return "headphone"; + case PA_BLUETOOTH_FORM_FACTOR_PORTABLE: + return "portable"; + case PA_BLUETOOTH_FORM_FACTOR_CAR: + return "car"; + case PA_BLUETOOTH_FORM_FACTOR_HIFI: + return "hifi"; + case PA_BLUETOOTH_FORM_FACTOR_PHONE: + return "phone"; + } + + pa_assert_not_reached(); +} + +/* Run from main thread */ +static void connect_ports(struct userdata *u, void *new_data, pa_direction_t direction) { + pa_device_port *port; + + if (direction == PA_DIRECTION_OUTPUT) { + pa_sink_new_data *sink_new_data = new_data; + + pa_assert_se(port = pa_hashmap_get(u->card->ports, u->output_port_name)); + pa_assert_se(pa_hashmap_put(sink_new_data->ports, port->name, port) >= 0); + pa_device_port_ref(port); + } else { + pa_source_new_data *source_new_data = new_data; + + pa_assert_se(port = pa_hashmap_get(u->card->ports, u->input_port_name)); + pa_assert_se(pa_hashmap_put(source_new_data->ports, port->name, port) >= 0); + pa_device_port_ref(port); + } +} + +/* Run from IO thread */ +static int sco_process_render(struct userdata *u) { + ssize_t l; + pa_memchunk memchunk; + int saved_errno; + + pa_assert(u); + pa_assert(u->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT || + u->profile == PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY); + pa_assert(u->sink); + + pa_sink_render_full(u->sink, u->write_block_size, &memchunk); + + pa_assert(memchunk.length == u->write_block_size); + + for (;;) { + const void *p; + + /* Now write that data to the socket. The socket is of type + * SEQPACKET, and we generated the data of the MTU size, so this + * should just work. */ + + p = (const uint8_t *) pa_memblock_acquire_chunk(&memchunk); + l = pa_write(u->stream_fd, p, memchunk.length, &u->stream_write_type); + pa_memblock_release(memchunk.memblock); + + pa_assert(l != 0); + + if (l > 0) + break; + + saved_errno = errno; + + if (saved_errno == EINTR) + /* Retry right away if we got interrupted */ + continue; + + pa_memblock_unref(memchunk.memblock); + + if (saved_errno == EAGAIN) { + /* Hmm, apparently the socket was not writable, give up for now. + * Because the data was already rendered, let's discard the block. */ + pa_log_debug("Got EAGAIN on write() after POLLOUT, probably there is a temporary connection loss."); + return 1; + } + + pa_log_error("Failed to write data to SCO socket: %s", pa_cstrerror(saved_errno)); + return -1; + } + + pa_assert((size_t) l <= memchunk.length); + + if ((size_t) l != memchunk.length) { + pa_log_error("Wrote memory block to socket only partially! %llu written, wanted to write %llu.", + (unsigned long long) l, + (unsigned long long) memchunk.length); + + pa_memblock_unref(memchunk.memblock); + return -1; + } + + u->write_index += (uint64_t) memchunk.length; + pa_memblock_unref(memchunk.memblock); + + return 1; +} + +/* Run from IO thread */ +static int sco_process_push(struct userdata *u) { + ssize_t l; + pa_memchunk memchunk; + struct cmsghdr *cm; + struct msghdr m; + bool found_tstamp = false; + pa_usec_t tstamp = 0; + + pa_assert(u); + pa_assert(u->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT || + u->profile == PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY); + pa_assert(u->source); + pa_assert(u->read_smoother); + + memchunk.memblock = pa_memblock_new(u->core->mempool, u->read_block_size); + memchunk.index = memchunk.length = 0; + + for (;;) { + void *p; + uint8_t aux[1024]; + struct iovec iov; + + pa_zero(m); + pa_zero(aux); + pa_zero(iov); + + m.msg_iov = &iov; + m.msg_iovlen = 1; + m.msg_control = aux; + m.msg_controllen = sizeof(aux); + + p = pa_memblock_acquire(memchunk.memblock); + iov.iov_base = p; + iov.iov_len = pa_memblock_get_length(memchunk.memblock); + l = recvmsg(u->stream_fd, &m, 0); + pa_memblock_release(memchunk.memblock); + + if (l > 0) + break; + + if (l < 0 && errno == EINTR) + /* Retry right away if we got interrupted */ + continue; + + pa_memblock_unref(memchunk.memblock); + + if (l < 0 && errno == EAGAIN) + /* Hmm, apparently the socket was not readable, give up for now. */ + return 0; + + pa_log_error("Failed to read data from SCO socket: %s", l < 0 ? pa_cstrerror(errno) : "EOF"); + return -1; + } + + pa_assert((size_t) l <= pa_memblock_get_length(memchunk.memblock)); + + /* In some rare occasions, we might receive packets of a very strange + * size. This could potentially be possible if the SCO packet was + * received partially over-the-air, or more probably due to hardware + * issues in our Bluetooth adapter. In these cases, in order to avoid + * an assertion failure due to unaligned data, just discard the whole + * packet */ + if (!pa_frame_aligned(l, &u->decoder_sample_spec)) { + pa_log_warn("SCO packet received of unaligned size: %zu", l); + pa_memblock_unref(memchunk.memblock); + return -1; + } + + memchunk.length = (size_t) l; + u->read_index += (uint64_t) l; + + for (cm = CMSG_FIRSTHDR(&m); cm; cm = CMSG_NXTHDR(&m, cm)) + if (cm->cmsg_level == SOL_SOCKET && cm->cmsg_type == SO_TIMESTAMP) { + struct timeval *tv = (struct timeval*) CMSG_DATA(cm); + pa_rtclock_from_wallclock(tv); + tstamp = pa_timeval_load(tv); + found_tstamp = true; + break; + } + + if (!found_tstamp) { + PA_ONCE_BEGIN { + pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!"); + } PA_ONCE_END; + tstamp = pa_rtclock_now(); + } + + pa_smoother_put(u->read_smoother, tstamp, pa_bytes_to_usec(u->read_index, &u->decoder_sample_spec)); + pa_smoother_resume(u->read_smoother, tstamp, true); + + pa_source_post(u->source, &memchunk); + pa_memblock_unref(memchunk.memblock); + + return l; +} + +/* Run from IO thread */ +static void a2dp_prepare_encoder_buffer(struct userdata *u) { + pa_assert(u); + + if (u->encoder_buffer_size < u->write_link_mtu) { + pa_xfree(u->encoder_buffer); + u->encoder_buffer = pa_xmalloc(u->write_link_mtu); + } + + /* Encoder buffer cannot be larger then link MTU, otherwise + * encode method would produce larger packets then link MTU */ + u->encoder_buffer_size = u->write_link_mtu; +} + +/* Run from IO thread */ +static void a2dp_prepare_decoder_buffer(struct userdata *u) { + pa_assert(u); + + if (u->decoder_buffer_size < u->read_link_mtu) { + pa_xfree(u->decoder_buffer); + u->decoder_buffer = pa_xmalloc(u->read_link_mtu); + } + + /* Decoder buffer cannot be larger then link MTU, otherwise + * decode method would produce larger output then read_block_size */ + u->decoder_buffer_size = u->read_link_mtu; +} + +/* Run from IO thread */ +static int a2dp_write_buffer(struct userdata *u, size_t nbytes) { + int ret = 0; + + /* Encoder function of A2DP codec may provide empty buffer, in this case do + * not post any empty buffer via A2DP socket. It may be because of codec + * internal state, e.g. encoder is waiting for more samples so it can + * provide encoded data. */ + if (PA_UNLIKELY(!nbytes)) { + u->write_index += (uint64_t) u->write_memchunk.length; + pa_memblock_unref(u->write_memchunk.memblock); + pa_memchunk_reset(&u->write_memchunk); + return 0; + } + + for (;;) { + ssize_t l; + + l = pa_write(u->stream_fd, u->encoder_buffer, nbytes, &u->stream_write_type); + + pa_assert(l != 0); + + if (l < 0) { + + if (errno == EINTR) + /* Retry right away if we got interrupted */ + continue; + + else if (errno == EAGAIN) { + /* Hmm, apparently the socket was not writable, give up for now */ + pa_log_debug("Got EAGAIN on write() after POLLOUT, probably there is a temporary connection loss."); + break; + } + + pa_log_error("Failed to write data to socket: %s", pa_cstrerror(errno)); + ret = -1; + break; + } + + pa_assert((size_t) l <= nbytes); + + if ((size_t) l != nbytes) { + pa_log_warn("Wrote memory block to socket only partially! %llu written, wanted to write %llu.", + (unsigned long long) l, + (unsigned long long) nbytes); + ret = -1; + break; + } + + u->write_index += (uint64_t) u->write_memchunk.length; + pa_memblock_unref(u->write_memchunk.memblock); + pa_memchunk_reset(&u->write_memchunk); + + ret = 1; + + break; + } + + return ret; +} + +/* Run from IO thread */ +static int a2dp_process_render(struct userdata *u) { + const uint8_t *ptr; + size_t processed; + size_t length; + + pa_assert(u); + pa_assert(u->profile == PA_BLUETOOTH_PROFILE_A2DP_SINK); + pa_assert(u->sink); + pa_assert(u->a2dp_codec); + + /* First, render some data */ + if (!u->write_memchunk.memblock) + pa_sink_render_full(u->sink, u->write_block_size, &u->write_memchunk); + + pa_assert(u->write_memchunk.length == u->write_block_size); + + a2dp_prepare_encoder_buffer(u); + + /* Try to create a packet of the full MTU */ + ptr = (const uint8_t *) pa_memblock_acquire_chunk(&u->write_memchunk); + + length = u->a2dp_codec->encode_buffer(u->encoder_info, u->write_index / pa_frame_size(&u->encoder_sample_spec), ptr, u->write_memchunk.length, u->encoder_buffer, u->encoder_buffer_size, &processed); + + pa_memblock_release(u->write_memchunk.memblock); + + if (processed != u->write_memchunk.length) { + pa_log_error("Encoding error"); + return -1; + } + + return a2dp_write_buffer(u, length); +} + +/* Run from IO thread */ +static int a2dp_process_push(struct userdata *u) { + int ret = 0; + pa_memchunk memchunk; + + pa_assert(u); + pa_assert(u->profile == PA_BLUETOOTH_PROFILE_A2DP_SOURCE); + pa_assert(u->source); + pa_assert(u->read_smoother); + pa_assert(u->a2dp_codec); + + memchunk.memblock = pa_memblock_new(u->core->mempool, u->read_block_size); + memchunk.index = memchunk.length = 0; + + a2dp_prepare_decoder_buffer(u); + + for (;;) { + uint8_t aux[1024]; + struct iovec iov; + struct cmsghdr *cm; + struct msghdr m; + bool found_tstamp = false; + pa_usec_t tstamp; + uint8_t *ptr; + ssize_t l; + size_t processed; + + pa_zero(m); + pa_zero(aux); + pa_zero(iov); + + m.msg_iov = &iov; + m.msg_iovlen = 1; + m.msg_control = aux; + m.msg_controllen = sizeof(aux); + + iov.iov_base = u->decoder_buffer; + iov.iov_len = u->decoder_buffer_size; + + l = recvmsg(u->stream_fd, &m, 0); + + if (l <= 0) { + + if (l < 0 && errno == EINTR) + /* Retry right away if we got interrupted */ + continue; + + else if (l < 0 && errno == EAGAIN) + /* Hmm, apparently the socket was not readable, give up for now. */ + break; + + pa_log_error("Failed to read data from socket: %s", l < 0 ? pa_cstrerror(errno) : "EOF"); + ret = -1; + break; + } + + pa_assert((size_t) l <= u->decoder_buffer_size); + + /* TODO: get timestamp from rtp */ + + for (cm = CMSG_FIRSTHDR(&m); cm; cm = CMSG_NXTHDR(&m, cm)) { + if (cm->cmsg_level == SOL_SOCKET && cm->cmsg_type == SO_TIMESTAMP) { + struct timeval *tv = (struct timeval*) CMSG_DATA(cm); + pa_rtclock_from_wallclock(tv); + tstamp = pa_timeval_load(tv); + found_tstamp = true; + break; + } + } + + if (!found_tstamp) { + PA_ONCE_BEGIN { + pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!"); + } PA_ONCE_END; + tstamp = pa_rtclock_now(); + } + + ptr = pa_memblock_acquire(memchunk.memblock); + memchunk.length = pa_memblock_get_length(memchunk.memblock); + + memchunk.length = u->a2dp_codec->decode_buffer(u->decoder_info, u->decoder_buffer, l, ptr, memchunk.length, &processed); + + pa_memblock_release(memchunk.memblock); + + if (processed != (size_t) l) { + pa_log_error("Decoding error"); + ret = -1; + break; + } + + u->read_index += (uint64_t) memchunk.length; + pa_smoother_put(u->read_smoother, tstamp, pa_bytes_to_usec(u->read_index, &u->decoder_sample_spec)); + pa_smoother_resume(u->read_smoother, tstamp, true); + + /* Decoding of A2DP codec data may result in empty buffer, in this case + * do not post empty audio samples. It may happen due to algorithmic + * delay of audio codec. */ + if (PA_LIKELY(memchunk.length)) + pa_source_post(u->source, &memchunk); + + ret = l; + break; + } + + pa_memblock_unref(memchunk.memblock); + + return ret; +} + +static void update_sink_buffer_size(struct userdata *u) { + int old_bufsize; + socklen_t len = sizeof(int); + int ret; + + ret = getsockopt(u->stream_fd, SOL_SOCKET, SO_SNDBUF, &old_bufsize, &len); + if (ret == -1) { + pa_log_warn("Changing bluetooth buffer size: Failed to getsockopt(SO_SNDBUF): %s", pa_cstrerror(errno)); + } else { + int new_bufsize; + + /* Set send buffer size as small as possible. The minimum value is 1024 according to the + * socket man page. The data is written to the socket in chunks of write_block_size, so + * there should at least be room for two chunks in the buffer. Generally, write_block_size + * is larger than 512. If not, use the next multiple of write_block_size which is larger + * than 1024. */ + new_bufsize = 2 * u->write_block_size; + if (new_bufsize < 1024) + new_bufsize = (1024 / u->write_block_size + 1) * u->write_block_size; + + /* The kernel internally doubles the buffer size that was set by setsockopt and getsockopt + * returns the doubled value. */ + if (new_bufsize != old_bufsize / 2) { + ret = setsockopt(u->stream_fd, SOL_SOCKET, SO_SNDBUF, &new_bufsize, len); + if (ret == -1) + pa_log_warn("Changing bluetooth buffer size: Failed to change from %d to %d: %s", old_bufsize / 2, new_bufsize, pa_cstrerror(errno)); + else + pa_log_info("Changing bluetooth buffer size: Changed from %d to %d", old_bufsize / 2, new_bufsize); + } + } +} + +static void teardown_stream(struct userdata *u) { + if (u->rtpoll_item) { + pa_rtpoll_item_free(u->rtpoll_item); + u->rtpoll_item = NULL; + } + + if (u->stream_fd >= 0) { + pa_close(u->stream_fd); + u->stream_fd = -1; + } + + if (u->read_smoother) { + pa_smoother_free(u->read_smoother); + u->read_smoother = NULL; + } + + if (u->write_memchunk.memblock) { + pa_memblock_unref(u->write_memchunk.memblock); + pa_memchunk_reset(&u->write_memchunk); + } + + pa_log_debug("Audio stream torn down"); + u->stream_setup_done = false; +} + +static int transport_acquire(struct userdata *u, bool optional) { + pa_assert(u->transport); + + if (u->transport_acquired) + return 0; + + pa_log_debug("Acquiring transport %s", u->transport->path); + + u->stream_fd = u->transport->acquire(u->transport, optional, &u->read_link_mtu, &u->write_link_mtu); + if (u->stream_fd < 0) + return u->stream_fd; + + /* transport_acquired must be set before calling + * pa_bluetooth_transport_set_state() */ + u->transport_acquired = true; + pa_log_info("Transport %s acquired: fd %d", u->transport->path, u->stream_fd); + + if (u->transport->state == PA_BLUETOOTH_TRANSPORT_STATE_IDLE) { + if (pa_thread_mq_get() != NULL) + pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(u->msg), BLUETOOTH_MESSAGE_SET_TRANSPORT_PLAYING, NULL, 0, NULL, NULL); + else + pa_bluetooth_transport_set_state(u->transport, PA_BLUETOOTH_TRANSPORT_STATE_PLAYING); + } + + return 0; +} + +static void transport_release(struct userdata *u) { + pa_assert(u->transport); + + /* Ignore if already released */ + if (!u->transport_acquired) + return; + + pa_log_debug("Releasing transport %s", u->transport->path); + + u->transport->release(u->transport); + + u->transport_acquired = false; + + teardown_stream(u); + + /* Set transport state to idle if this was not already done by the remote end closing + * the file descriptor. Only do this when called from the I/O thread */ + if (pa_thread_mq_get() != NULL && u->transport->state == PA_BLUETOOTH_TRANSPORT_STATE_PLAYING) + pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(u->msg), BLUETOOTH_MESSAGE_STREAM_FD_HUP, NULL, 0, NULL, NULL); +} + +/* Run from I/O thread */ +static void handle_sink_block_size_change(struct userdata *u) { + pa_sink_set_max_request_within_thread(u->sink, u->write_block_size); + pa_sink_set_fixed_latency_within_thread(u->sink, + (u->profile == PA_BLUETOOTH_PROFILE_A2DP_SINK ? + FIXED_LATENCY_PLAYBACK_A2DP : FIXED_LATENCY_PLAYBACK_SCO) + + pa_bytes_to_usec(u->write_block_size, &u->encoder_sample_spec)); + + /* If there is still data in the memchunk, we have to discard it + * because the write_block_size may have changed. */ + if (u->write_memchunk.memblock) { + pa_memblock_unref(u->write_memchunk.memblock); + pa_memchunk_reset(&u->write_memchunk); + } + + update_sink_buffer_size(u); +} + +/* Run from I/O thread */ +static void transport_config_mtu(struct userdata *u) { + if (u->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT || u->profile == PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY) { + u->read_block_size = u->read_link_mtu; + u->write_block_size = u->write_link_mtu; + + if (!pa_frame_aligned(u->read_block_size, &u->source->sample_spec)) { + pa_log_debug("Got invalid read MTU: %lu, rounding down", u->read_block_size); + u->read_block_size = pa_frame_align(u->read_block_size, &u->source->sample_spec); + } + + if (!pa_frame_aligned(u->write_block_size, &u->sink->sample_spec)) { + pa_log_debug("Got invalid write MTU: %lu, rounding down", u->write_block_size); + u->write_block_size = pa_frame_align(u->write_block_size, &u->sink->sample_spec); + } + } else { + pa_assert(u->a2dp_codec); + if (u->profile == PA_BLUETOOTH_PROFILE_A2DP_SINK) { + u->write_block_size = u->a2dp_codec->get_write_block_size(u->encoder_info, u->write_link_mtu); + } else { + u->read_block_size = u->a2dp_codec->get_read_block_size(u->decoder_info, u->read_link_mtu); + } + } + + if (u->sink) + handle_sink_block_size_change(u); + + if (u->source) + pa_source_set_fixed_latency_within_thread(u->source, + (u->profile == PA_BLUETOOTH_PROFILE_A2DP_SOURCE ? + FIXED_LATENCY_RECORD_A2DP : FIXED_LATENCY_RECORD_SCO) + + pa_bytes_to_usec(u->read_block_size, &u->decoder_sample_spec)); +} + +/* Run from I/O thread */ +static int setup_stream(struct userdata *u) { + struct pollfd *pollfd; + int one; + + pa_assert(u->stream_fd >= 0); + + /* return if stream is already set up */ + if (u->stream_setup_done) + return 0; + + pa_log_info("Transport %s resuming", u->transport->path); + + if (u->profile == PA_BLUETOOTH_PROFILE_A2DP_SINK) { + pa_assert(u->a2dp_codec); + if (u->a2dp_codec->reset(u->encoder_info) < 0) + return -1; + } else if (u->profile == PA_BLUETOOTH_PROFILE_A2DP_SOURCE) { + pa_assert(u->a2dp_codec); + if (u->a2dp_codec->reset(u->decoder_info) < 0) + return -1; + } + + transport_config_mtu(u); + + pa_make_fd_nonblock(u->stream_fd); + pa_make_socket_low_delay(u->stream_fd); + + one = 1; + if (setsockopt(u->stream_fd, SOL_SOCKET, SO_TIMESTAMP, &one, sizeof(one)) < 0) + pa_log_warn("Failed to enable SO_TIMESTAMP: %s", pa_cstrerror(errno)); + + pa_log_debug("Stream properly set up, we're ready to roll!"); + + u->rtpoll_item = pa_rtpoll_item_new(u->rtpoll, PA_RTPOLL_NEVER, 1); + pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL); + pollfd->fd = u->stream_fd; + pollfd->events = pollfd->revents = 0; + + u->read_index = u->write_index = 0; + u->started_at = 0; + u->stream_setup_done = true; + + if (u->source) + u->read_smoother = pa_smoother_new(PA_USEC_PER_SEC, 2*PA_USEC_PER_SEC, true, true, 10, pa_rtclock_now(), true); + + return 0; +} + +/* Called from I/O thread, returns true if the transport was acquired or + * a connection was requested successfully. */ +static bool setup_transport_and_stream(struct userdata *u) { + int transport_error; + + transport_error = transport_acquire(u, false); + if (transport_error < 0) { + if (transport_error != -EAGAIN) + return false; + } else { + if (setup_stream(u) < 0) + return false; + } + return true; +} + +/* Run from IO thread */ +static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SOURCE(o)->userdata; + + pa_assert(u->source == PA_SOURCE(o)); + pa_assert(u->transport); + + switch (code) { + + case PA_SOURCE_MESSAGE_GET_LATENCY: { + int64_t wi, ri; + + if (u->read_smoother) { + wi = pa_smoother_get(u->read_smoother, pa_rtclock_now()); + ri = pa_bytes_to_usec(u->read_index, &u->decoder_sample_spec); + + *((int64_t*) data) = u->source->thread_info.fixed_latency + wi - ri; + } else + *((int64_t*) data) = 0; + + return 0; + } + + case PA_SOURCE_MESSAGE_SETUP_STREAM: + /* Skip stream setup if stream_fd has been invalidated. + This can occur if the stream has already been set up and + then immediately received POLLHUP. If the stream has + already been set up earlier, then this setup_stream() + call is redundant anyway, but currently the code + is such that this kind of unnecessary setup_stream() + calls can happen. */ + if (u->stream_fd < 0) + pa_log_debug("Skip source stream setup while closing"); + else + setup_stream(u); + return 0; + + } + + return pa_source_process_msg(o, code, data, offset, chunk); +} + +/* Called from the IO thread. */ +static int source_set_state_in_io_thread_cb(pa_source *s, pa_source_state_t new_state, pa_suspend_cause_t new_suspend_cause) { + struct userdata *u; + + pa_assert(s); + pa_assert_se(u = s->userdata); + + switch (new_state) { + + case PA_SOURCE_SUSPENDED: + /* Ignore if transition is PA_SOURCE_INIT->PA_SOURCE_SUSPENDED */ + if (!PA_SOURCE_IS_OPENED(s->thread_info.state)) + break; + + /* Stop the device if the sink is suspended as well */ + if (!u->sink || u->sink->state == PA_SINK_SUSPENDED) + transport_release(u); + + if (u->read_smoother) + pa_smoother_pause(u->read_smoother, pa_rtclock_now()); + + break; + + case PA_SOURCE_IDLE: + case PA_SOURCE_RUNNING: + if (s->thread_info.state != PA_SOURCE_SUSPENDED) + break; + + /* Resume the device if the sink was suspended as well */ + if (!u->sink || !PA_SINK_IS_OPENED(u->sink->thread_info.state)) + if (!setup_transport_and_stream(u)) + return -1; + + /* We don't resume the smoother here. Instead we + * wait until the first packet arrives */ + + break; + + case PA_SOURCE_UNLINKED: + case PA_SOURCE_INIT: + case PA_SOURCE_INVALID_STATE: + break; + } + + return 0; +} + +/* Run from main thread */ +static void source_set_volume_cb(pa_source *s) { + uint16_t gain; + pa_volume_t volume; + struct userdata *u; + + pa_assert(s); + pa_assert(s->core); + + u = s->userdata; + + pa_assert(u); + pa_assert(u->source == s); + + if (u->transport->set_microphone_gain == NULL) + return; + + gain = (pa_cvolume_max(&s->real_volume) * HSP_MAX_GAIN) / PA_VOLUME_NORM; + + if (gain > HSP_MAX_GAIN) + gain = HSP_MAX_GAIN; + + volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN); + + /* increment volume by one to correct rounding errors */ + if (volume < PA_VOLUME_NORM) + volume++; + + pa_cvolume_set(&s->real_volume, u->decoder_sample_spec.channels, volume); + + /* Set soft volume when in headset role */ + if (u->profile == PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY) + pa_cvolume_set(&s->soft_volume, u->decoder_sample_spec.channels, volume); + + /* If we are in the AG role, we send a command to the head set to change + * the microphone gain. In the HS role, source and sink are swapped, so + * in this case we notify the AG that the speaker gain has changed */ + u->transport->set_microphone_gain(u->transport, gain); +} + +/* Run from main thread */ +static int add_source(struct userdata *u) { + pa_source_new_data data; + + pa_assert(u->transport); + + pa_source_new_data_init(&data); + data.module = u->module; + data.card = u->card; + data.driver = __FILE__; + data.name = pa_sprintf_malloc("bluez_source.%s.%s", u->device->address, pa_bluetooth_profile_to_string(u->profile)); + data.namereg_fail = false; + pa_proplist_sets(data.proplist, "bluetooth.protocol", pa_bluetooth_profile_to_string(u->profile)); + pa_source_new_data_set_sample_spec(&data, &u->decoder_sample_spec); + if (u->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT) + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_INTENDED_ROLES, "phone"); + + connect_ports(u, &data, PA_DIRECTION_INPUT); + + if (!u->transport_acquired) + switch (u->profile) { + case PA_BLUETOOTH_PROFILE_A2DP_SOURCE: + case PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY: + data.suspend_cause = PA_SUSPEND_USER; + break; + case PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT: + /* u->stream_fd contains the error returned by the last transport_acquire() + * EAGAIN means we are waiting for a NewConnection signal */ + if (u->stream_fd == -EAGAIN) + data.suspend_cause = PA_SUSPEND_USER; + else + pa_assert_not_reached(); + break; + case PA_BLUETOOTH_PROFILE_A2DP_SINK: + case PA_BLUETOOTH_PROFILE_OFF: + pa_assert_not_reached(); + break; + } + + u->source = pa_source_new(u->core, &data, PA_SOURCE_HARDWARE|PA_SOURCE_LATENCY); + pa_source_new_data_done(&data); + if (!u->source) { + pa_log_error("Failed to create source"); + return -1; + } + + u->source->userdata = u; + u->source->parent.process_msg = source_process_msg; + u->source->set_state_in_io_thread = source_set_state_in_io_thread_cb; + + if (u->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT || u->profile == PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY) { + pa_source_set_set_volume_callback(u->source, source_set_volume_cb); + u->source->n_volume_steps = 16; + } + return 0; +} + +/* Run from IO thread */ +static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SINK(o)->userdata; + + pa_assert(u->sink == PA_SINK(o)); + pa_assert(u->transport); + + switch (code) { + + case PA_SINK_MESSAGE_GET_LATENCY: { + int64_t wi = 0, ri = 0; + + if (u->read_smoother) { + ri = pa_smoother_get(u->read_smoother, pa_rtclock_now()); + wi = pa_bytes_to_usec(u->write_index + u->write_block_size, &u->encoder_sample_spec); + } else if (u->started_at) { + ri = pa_rtclock_now() - u->started_at; + wi = pa_bytes_to_usec(u->write_index, &u->encoder_sample_spec); + } + + *((int64_t*) data) = u->sink->thread_info.fixed_latency + wi - ri; + + return 0; + } + + case PA_SINK_MESSAGE_SETUP_STREAM: + /* Skip stream setup if stream_fd has been invalidated. + This can occur if the stream has already been set up and + then immediately received POLLHUP. If the stream has + already been set up earlier, then this setup_stream() + call is redundant anyway, but currently the code + is such that this kind of unnecessary setup_stream() + calls can happen. */ + if (u->stream_fd < 0) + pa_log_debug("Skip sink stream setup while closing"); + else + setup_stream(u); + return 0; + } + + return pa_sink_process_msg(o, code, data, offset, chunk); +} + +/* Called from the IO thread. */ +static int sink_set_state_in_io_thread_cb(pa_sink *s, pa_sink_state_t new_state, pa_suspend_cause_t new_suspend_cause) { + struct userdata *u; + + pa_assert(s); + pa_assert_se(u = s->userdata); + + switch (new_state) { + + case PA_SINK_SUSPENDED: + /* Ignore if transition is PA_SINK_INIT->PA_SINK_SUSPENDED */ + if (!PA_SINK_IS_OPENED(s->thread_info.state)) + break; + + /* Stop the device if the source is suspended as well */ + if (!u->source || u->source->state == PA_SOURCE_SUSPENDED) + /* We deliberately ignore whether stopping + * actually worked. Since the stream_fd is + * closed it doesn't really matter */ + transport_release(u); + + break; + + case PA_SINK_IDLE: + case PA_SINK_RUNNING: + if (s->thread_info.state != PA_SINK_SUSPENDED) + break; + + /* Resume the device if the source was suspended as well */ + if (!u->source || !PA_SOURCE_IS_OPENED(u->source->thread_info.state)) + if (!setup_transport_and_stream(u)) + return -1; + + break; + + case PA_SINK_UNLINKED: + case PA_SINK_INIT: + case PA_SINK_INVALID_STATE: + break; + } + + return 0; +} + +/* Run from main thread */ +static void sink_set_volume_cb(pa_sink *s) { + uint16_t gain; + pa_volume_t volume; + struct userdata *u; + + pa_assert(s); + pa_assert(s->core); + + u = s->userdata; + + pa_assert(u); + pa_assert(u->sink == s); + + if (u->transport->set_speaker_gain == NULL) + return; + + gain = (pa_cvolume_max(&s->real_volume) * HSP_MAX_GAIN) / PA_VOLUME_NORM; + + if (gain > HSP_MAX_GAIN) + gain = HSP_MAX_GAIN; + + volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN); + + /* increment volume by one to correct rounding errors */ + if (volume < PA_VOLUME_NORM) + volume++; + + pa_cvolume_set(&s->real_volume, u->encoder_sample_spec.channels, volume); + + /* Set soft volume when in headset role */ + if (u->profile == PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY) + pa_cvolume_set(&s->soft_volume, u->encoder_sample_spec.channels, volume); + + /* If we are in the AG role, we send a command to the head set to change + * the speaker gain. In the HS role, source and sink are swapped, so + * in this case we notify the AG that the microphone gain has changed */ + u->transport->set_speaker_gain(u->transport, gain); +} + +/* Run from main thread */ +static int add_sink(struct userdata *u) { + pa_sink_new_data data; + + pa_assert(u->transport); + + pa_sink_new_data_init(&data); + data.module = u->module; + data.card = u->card; + data.driver = __FILE__; + data.name = pa_sprintf_malloc("bluez_sink.%s.%s", u->device->address, pa_bluetooth_profile_to_string(u->profile)); + data.namereg_fail = false; + pa_proplist_sets(data.proplist, "bluetooth.protocol", pa_bluetooth_profile_to_string(u->profile)); + pa_sink_new_data_set_sample_spec(&data, &u->encoder_sample_spec); + if (u->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT) + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_INTENDED_ROLES, "phone"); + + connect_ports(u, &data, PA_DIRECTION_OUTPUT); + + if (!u->transport_acquired) + switch (u->profile) { + case PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY: + data.suspend_cause = PA_SUSPEND_USER; + break; + case PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT: + /* u->stream_fd contains the error returned by the last transport_acquire() + * EAGAIN means we are waiting for a NewConnection signal */ + if (u->stream_fd == -EAGAIN) + data.suspend_cause = PA_SUSPEND_USER; + else + pa_assert_not_reached(); + break; + case PA_BLUETOOTH_PROFILE_A2DP_SINK: + /* Profile switch should have failed */ + case PA_BLUETOOTH_PROFILE_A2DP_SOURCE: + case PA_BLUETOOTH_PROFILE_OFF: + pa_assert_not_reached(); + break; + } + + u->sink = pa_sink_new(u->core, &data, PA_SINK_HARDWARE|PA_SINK_LATENCY); + pa_sink_new_data_done(&data); + if (!u->sink) { + pa_log_error("Failed to create sink"); + return -1; + } + + u->sink->userdata = u; + u->sink->parent.process_msg = sink_process_msg; + u->sink->set_state_in_io_thread = sink_set_state_in_io_thread_cb; + + if (u->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT || u->profile == PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY) { + pa_sink_set_set_volume_callback(u->sink, sink_set_volume_cb); + u->sink->n_volume_steps = 16; + } + return 0; +} + +/* Run from main thread */ +static int transport_config(struct userdata *u) { + if (u->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT || u->profile == PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY) { + u->encoder_sample_spec.format = PA_SAMPLE_S16LE; + u->encoder_sample_spec.channels = 1; + u->encoder_sample_spec.rate = 8000; + u->decoder_sample_spec.format = PA_SAMPLE_S16LE; + u->decoder_sample_spec.channels = 1; + u->decoder_sample_spec.rate = 8000; + return 0; + } else { + bool is_a2dp_sink = u->profile == PA_BLUETOOTH_PROFILE_A2DP_SINK; + void *info; + + pa_assert(u->transport); + + pa_assert(!u->a2dp_codec); + pa_assert(!u->encoder_info); + pa_assert(!u->decoder_info); + + u->a2dp_codec = u->transport->a2dp_codec; + pa_assert(u->a2dp_codec); + + info = u->a2dp_codec->init(is_a2dp_sink, false, u->transport->config, u->transport->config_size, is_a2dp_sink ? &u->encoder_sample_spec : &u->decoder_sample_spec); + if (is_a2dp_sink) + u->encoder_info = info; + else + u->decoder_info = info; + + if (!info) + return -1; + + return 0; + } +} + +/* Run from main thread */ +static int setup_transport(struct userdata *u) { + pa_bluetooth_transport *t; + + pa_assert(u); + pa_assert(!u->transport); + pa_assert(u->profile != PA_BLUETOOTH_PROFILE_OFF); + + /* check if profile has a transport */ + t = u->device->transports[u->profile]; + if (!t || t->state <= PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED) { + pa_log_warn("Profile %s has no transport", pa_bluetooth_profile_to_string(u->profile)); + return -1; + } + + u->transport = t; + + if (u->profile == PA_BLUETOOTH_PROFILE_A2DP_SOURCE || u->profile == PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY) + transport_acquire(u, true); /* In case of error, the sink/sources will be created suspended */ + else { + int transport_error; + + transport_error = transport_acquire(u, false); + if (transport_error < 0 && transport_error != -EAGAIN) + return -1; /* We need to fail here until the interactions with module-suspend-on-idle and alike get improved */ + } + + return transport_config(u); +} + +/* Run from main thread */ +static pa_direction_t get_profile_direction(pa_bluetooth_profile_t p) { + static const pa_direction_t profile_direction[] = { + [PA_BLUETOOTH_PROFILE_A2DP_SINK] = PA_DIRECTION_OUTPUT, + [PA_BLUETOOTH_PROFILE_A2DP_SOURCE] = PA_DIRECTION_INPUT, + [PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT] = PA_DIRECTION_INPUT | PA_DIRECTION_OUTPUT, + [PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY] = PA_DIRECTION_INPUT | PA_DIRECTION_OUTPUT, + [PA_BLUETOOTH_PROFILE_OFF] = 0 + }; + + return profile_direction[p]; +} + +/* Run from main thread */ +static int init_profile(struct userdata *u) { + int r = 0; + pa_assert(u); + pa_assert(u->profile != PA_BLUETOOTH_PROFILE_OFF); + + if (setup_transport(u) < 0) + return -1; + + pa_assert(u->transport); + + if (get_profile_direction (u->profile) & PA_DIRECTION_OUTPUT) + if (add_sink(u) < 0) + r = -1; + + if (get_profile_direction (u->profile) & PA_DIRECTION_INPUT) + if (add_source(u) < 0) + r = -1; + + return r; +} + +static int write_block(struct userdata *u) { + int n_written; + + if (u->write_index <= 0) + u->started_at = pa_rtclock_now(); + + if (u->profile == PA_BLUETOOTH_PROFILE_A2DP_SINK) { + if ((n_written = a2dp_process_render(u)) < 0) + return -1; + } else { + if ((n_written = sco_process_render(u)) < 0) + return -1; + } + + return n_written; +} + + +/* I/O thread function */ +static void thread_func(void *userdata) { + struct userdata *u = userdata; + unsigned blocks_to_write = 0; + unsigned bytes_to_write = 0; + + pa_assert(u); + pa_assert(u->transport); + + pa_log_debug("IO Thread starting up"); + + if (u->core->realtime_scheduling) + pa_thread_make_realtime(u->core->realtime_priority); + + pa_thread_mq_install(&u->thread_mq); + + /* Setup the stream only if the transport was already acquired */ + if (u->transport_acquired) + setup_stream(u); + + for (;;) { + struct pollfd *pollfd; + int ret; + bool disable_timer = true; + bool writable = false; + bool have_source = u->source ? PA_SOURCE_IS_LINKED(u->source->thread_info.state) : false; + bool have_sink = u->sink ? PA_SINK_IS_LINKED(u->sink->thread_info.state) : false; + + pollfd = u->rtpoll_item ? pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL) : NULL; + + /* Check for stream error or close */ + if (pollfd && (pollfd->revents & ~(POLLOUT|POLLIN))) { + pa_log_info("FD error: %s%s%s%s", + pollfd->revents & POLLERR ? "POLLERR " :"", + pollfd->revents & POLLHUP ? "POLLHUP " :"", + pollfd->revents & POLLPRI ? "POLLPRI " :"", + pollfd->revents & POLLNVAL ? "POLLNVAL " :""); + + if (pollfd->revents & POLLHUP) { + pollfd = NULL; + teardown_stream(u); + blocks_to_write = 0; + bytes_to_write = 0; + pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(u->msg), BLUETOOTH_MESSAGE_STREAM_FD_HUP, NULL, 0, NULL, NULL); + } else + goto fail; + } + + /* If there is a pollfd, the stream is set up and we need to do something */ + if (pollfd) { + + /* Handle source if present */ + if (have_source) { + + /* We should send two blocks to the device before we expect a response. */ + if (have_sink && u->write_index == 0 && u->read_index <= 0) + blocks_to_write = 2; + + /* If we got woken up by POLLIN let's do some reading */ + if (pollfd->revents & POLLIN) { + int n_read; + + if (u->profile == PA_BLUETOOTH_PROFILE_A2DP_SOURCE) + n_read = a2dp_process_push(u); + else + n_read = sco_process_push(u); + + if (n_read < 0) + goto fail; + + if (have_sink && n_read > 0) { + /* We just read something, so we are supposed to write something, too */ + bytes_to_write += n_read; + blocks_to_write += bytes_to_write / u->write_block_size; + bytes_to_write = bytes_to_write % u->write_block_size; + } + } + } + + /* Handle sink if present */ + if (have_sink) { + + /* Process rewinds */ + if (PA_UNLIKELY(u->sink->thread_info.rewind_requested)) + pa_sink_process_rewind(u->sink, 0); + + /* Test if the stream is writable */ + if (pollfd->revents & POLLOUT) + writable = true; + + /* If we have a source, we let the source determine the timing + * for the sink */ + if (have_source) { + + if (writable && blocks_to_write > 0) { + int result; + + if ((result = write_block(u)) < 0) + goto fail; + + blocks_to_write -= result; + + /* writable controls whether we set POLLOUT when polling - we set it to + * false to enable POLLOUT. If there are more blocks to write, we want to + * be woken up immediately when the socket becomes writable. If there + * aren't currently any more blocks to write, then we'll have to wait + * until we've received more data, so in that case we only want to set + * POLLIN. Note that when we are woken up the next time, POLLOUT won't be + * set in revents even if the socket has meanwhile become writable, which + * may seem bad, but in that case we'll set POLLOUT in the subsequent + * poll, and the poll will return immediately, so our writes won't be + * delayed. */ + if (blocks_to_write > 0) + writable = false; + } + + /* There is no source, we have to use the system clock for timing */ + } else { + bool have_written = false; + pa_usec_t time_passed = 0; + pa_usec_t audio_sent = 0; + + if (u->started_at) { + time_passed = pa_rtclock_now() - u->started_at; + audio_sent = pa_bytes_to_usec(u->write_index, &u->encoder_sample_spec); + } + + /* A new block needs to be sent. */ + if (audio_sent <= time_passed) { + size_t bytes_to_send = pa_usec_to_bytes(time_passed - audio_sent, &u->encoder_sample_spec); + + /* There are more than two blocks that need to be written. It seems that + * the socket has not been accepting data fast enough (could be due to + * hiccups in the wireless transmission). We need to discard everything + * older than two block sizes to keep the latency from growing. */ + if (bytes_to_send > 2 * u->write_block_size) { + uint64_t skip_bytes; + pa_memchunk tmp; + size_t mempool_max_block_size = pa_mempool_block_size_max(u->core->mempool); + pa_usec_t skip_usec; + + skip_bytes = bytes_to_send - 2 * u->write_block_size; + skip_usec = pa_bytes_to_usec(skip_bytes, &u->encoder_sample_spec); + + pa_log_debug("Skipping %llu us (= %llu bytes) in audio stream", + (unsigned long long) skip_usec, + (unsigned long long) skip_bytes); + + while (skip_bytes > 0) { + size_t bytes_to_render; + + if (skip_bytes > mempool_max_block_size) + bytes_to_render = mempool_max_block_size; + else + bytes_to_render = skip_bytes; + + pa_sink_render_full(u->sink, bytes_to_render, &tmp); + pa_memblock_unref(tmp.memblock); + u->write_index += bytes_to_render; + skip_bytes -= bytes_to_render; + } + + if (u->write_index > 0 && u->profile == PA_BLUETOOTH_PROFILE_A2DP_SINK) { + size_t new_write_block_size = u->a2dp_codec->reduce_encoder_bitrate(u->encoder_info, u->write_link_mtu); + if (new_write_block_size) { + u->write_block_size = new_write_block_size; + handle_sink_block_size_change(u); + } + } + } + + blocks_to_write = 1; + } + + /* If the stream is writable, send some data if necessary */ + if (writable && blocks_to_write > 0) { + int result; + + if ((result = write_block(u)) < 0) + goto fail; + + blocks_to_write -= result; + writable = false; + if (result) + have_written = true; + } + + /* If nothing was written during this iteration, either the stream + * is not writable or there was no write pending. Set up a timer that + * will wake up the thread when the next data needs to be written. */ + if (!have_written) { + pa_usec_t sleep_for; + pa_usec_t next_write_at; + + if (writable) { + /* There was no write pending on this iteration of the loop. + * Let's estimate when we need to wake up next */ + next_write_at = pa_bytes_to_usec(u->write_index, &u->encoder_sample_spec); + sleep_for = time_passed < next_write_at ? next_write_at - time_passed : 0; + /* pa_log("Sleeping for %lu; time passed %lu, next write at %lu", (unsigned long) sleep_for, (unsigned long) time_passed, (unsigned long)next_write_at); */ + } else + /* We could not write because the stream was not ready. Let's try + * again in 500 ms and drop audio if we still can't write. The + * thread will also be woken up when we can write again. */ + sleep_for = PA_USEC_PER_MSEC * 500; + + pa_rtpoll_set_timer_relative(u->rtpoll, sleep_for); + disable_timer = false; + } + } + } + + /* Set events to wake up the thread */ + pollfd->events = (short) (((have_sink && !writable) ? POLLOUT : 0) | (have_source ? POLLIN : 0)); + + } + + if (disable_timer) + pa_rtpoll_set_timer_disabled(u->rtpoll); + + if ((ret = pa_rtpoll_run(u->rtpoll)) < 0) { + pa_log_debug("pa_rtpoll_run failed with: %d", ret); + goto fail; + } + + if (ret == 0) { + pa_log_debug("IO thread shutdown requested, stopping cleanly"); + transport_release(u); + goto finish; + } + } + +fail: + /* If this was no regular exit from the loop we have to continue processing messages until we receive PA_MESSAGE_SHUTDOWN */ + pa_log_debug("IO thread failed"); + pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(u->msg), BLUETOOTH_MESSAGE_IO_THREAD_FAILED, NULL, 0, NULL, NULL); + pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN); + +finish: + pa_log_debug("IO thread shutting down"); +} + +/* Run from main thread */ +static int start_thread(struct userdata *u) { + pa_assert(u); + pa_assert(!u->thread); + pa_assert(!u->rtpoll); + pa_assert(!u->rtpoll_item); + + u->rtpoll = pa_rtpoll_new(); + + if (pa_thread_mq_init(&u->thread_mq, u->core->mainloop, u->rtpoll) < 0) { + pa_log("pa_thread_mq_init() failed."); + return -1; + } + + if (!(u->thread = pa_thread_new("bluetooth", thread_func, u))) { + pa_log_error("Failed to create IO thread"); + return -1; + } + + if (u->sink) { + pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq); + pa_sink_set_rtpoll(u->sink, u->rtpoll); + + /* If we are in the headset role, the sink should not become default + * unless there is no other sound device available. */ + if (u->profile == PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY) + u->sink->priority = 1500; + + pa_sink_put(u->sink); + + if (u->sink->set_volume) + u->sink->set_volume(u->sink); + } + + if (u->source) { + pa_source_set_asyncmsgq(u->source, u->thread_mq.inq); + pa_source_set_rtpoll(u->source, u->rtpoll); + + /* If we are in the headset role or the device is an a2dp source, + * the source should not become default unless there is no other + * sound device available. */ + if (u->profile == PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY || u->profile == PA_BLUETOOTH_PROFILE_A2DP_SOURCE) + u->source->priority = 1500; + + pa_source_put(u->source); + + if (u->source->set_volume) + u->source->set_volume(u->source); + } + + return 0; +} + +/* Run from main thread */ +static void stop_thread(struct userdata *u) { + pa_assert(u); + + if (u->sink) + pa_sink_unlink(u->sink); + + if (u->source) + pa_source_unlink(u->source); + + if (u->thread) { + pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL); + pa_thread_free(u->thread); + u->thread = NULL; + } + + if (u->rtpoll_item) { + pa_rtpoll_item_free(u->rtpoll_item); + u->rtpoll_item = NULL; + } + + if (u->rtpoll) { + pa_rtpoll_free(u->rtpoll); + u->rtpoll = NULL; + pa_thread_mq_done(&u->thread_mq); + } + + if (u->transport) { + transport_release(u); + u->transport = NULL; + } + + if (u->sink) { + pa_sink_unref(u->sink); + u->sink = NULL; + } + + if (u->source) { + pa_source_unref(u->source); + u->source = NULL; + } + + if (u->read_smoother) { + pa_smoother_free(u->read_smoother); + u->read_smoother = NULL; + } + + if (u->profile == PA_BLUETOOTH_PROFILE_A2DP_SINK || u->profile == PA_BLUETOOTH_PROFILE_A2DP_SOURCE) { + if (u->encoder_info) { + u->a2dp_codec->deinit(u->encoder_info); + u->encoder_info = NULL; + } + + if (u->decoder_info) { + u->a2dp_codec->deinit(u->decoder_info); + u->decoder_info = NULL; + } + + u->a2dp_codec = NULL; + } +} + +/* Run from main thread */ +static pa_available_t get_port_availability(struct userdata *u, pa_direction_t direction) { + pa_available_t result = PA_AVAILABLE_NO; + unsigned i; + + pa_assert(u); + pa_assert(u->device); + + for (i = 0; i < PA_BLUETOOTH_PROFILE_COUNT; i++) { + pa_bluetooth_transport *transport; + + if (!(get_profile_direction(i) & direction)) + continue; + + if (!(transport = u->device->transports[i])) + continue; + + switch(transport->state) { + case PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED: + continue; + + case PA_BLUETOOTH_TRANSPORT_STATE_IDLE: + if (result == PA_AVAILABLE_NO) + result = PA_AVAILABLE_UNKNOWN; + + break; + + case PA_BLUETOOTH_TRANSPORT_STATE_PLAYING: + return PA_AVAILABLE_YES; + } + } + + return result; +} + +/* Run from main thread */ +static pa_available_t transport_state_to_availability(pa_bluetooth_transport_state_t state) { + switch (state) { + case PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED: + return PA_AVAILABLE_NO; + case PA_BLUETOOTH_TRANSPORT_STATE_PLAYING: + return PA_AVAILABLE_YES; + default: + return PA_AVAILABLE_UNKNOWN; + } +} + +/* Run from main thread */ +static void create_card_ports(struct userdata *u, pa_hashmap *ports) { + pa_device_port *port; + pa_device_port_new_data port_data; + pa_device_port_type_t input_type, output_type; + const char *name_prefix, *input_description, *output_description; + + pa_assert(u); + pa_assert(ports); + pa_assert(u->device); + + name_prefix = "unknown"; + input_description = _("Bluetooth Input"); + output_description = _("Bluetooth Output"); + input_type = output_type = PA_DEVICE_PORT_TYPE_BLUETOOTH; + + switch (form_factor_from_class(u->device->class_of_device)) { + case PA_BLUETOOTH_FORM_FACTOR_HEADSET: + name_prefix = "headset"; + input_description = output_description = _("Headset"); + input_type = output_type = PA_DEVICE_PORT_TYPE_HEADSET; + break; + + case PA_BLUETOOTH_FORM_FACTOR_HANDSFREE: + name_prefix = "handsfree"; + input_description = output_description = _("Handsfree"); + input_type = output_type = PA_DEVICE_PORT_TYPE_HANDSFREE; + break; + + case PA_BLUETOOTH_FORM_FACTOR_MICROPHONE: + name_prefix = "microphone"; + input_description = _("Microphone"); + output_description = _("Bluetooth Output"); + input_type = PA_DEVICE_PORT_TYPE_MIC; + break; + + case PA_BLUETOOTH_FORM_FACTOR_SPEAKER: + name_prefix = "speaker"; + input_description = _("Bluetooth Input"); + output_description = _("Speaker"); + output_type = PA_DEVICE_PORT_TYPE_SPEAKER; + break; + + case PA_BLUETOOTH_FORM_FACTOR_HEADPHONE: + name_prefix = "headphone"; + input_description = _("Bluetooth Input"); + output_description = _("Headphone"); + output_type = PA_DEVICE_PORT_TYPE_HEADPHONES; + break; + + case PA_BLUETOOTH_FORM_FACTOR_PORTABLE: + name_prefix = "portable"; + input_description = output_description = _("Portable"); + input_type = output_type = PA_DEVICE_PORT_TYPE_PORTABLE; + break; + + case PA_BLUETOOTH_FORM_FACTOR_CAR: + name_prefix = "car"; + input_description = output_description = _("Car"); + input_type = output_type = PA_DEVICE_PORT_TYPE_CAR; + break; + + case PA_BLUETOOTH_FORM_FACTOR_HIFI: + name_prefix = "hifi"; + input_description = output_description = _("HiFi"); + input_type = output_type = PA_DEVICE_PORT_TYPE_HIFI; + break; + + case PA_BLUETOOTH_FORM_FACTOR_PHONE: + name_prefix = "phone"; + input_description = output_description = _("Phone"); + input_type = output_type = PA_DEVICE_PORT_TYPE_PHONE; + break; + + case PA_BLUETOOTH_FORM_FACTOR_UNKNOWN: + break; + } + + u->output_port_name = pa_sprintf_malloc("%s-output", name_prefix); + pa_device_port_new_data_init(&port_data); + pa_device_port_new_data_set_name(&port_data, u->output_port_name); + pa_device_port_new_data_set_description(&port_data, output_description); + pa_device_port_new_data_set_direction(&port_data, PA_DIRECTION_OUTPUT); + pa_device_port_new_data_set_type(&port_data, output_type); + pa_device_port_new_data_set_available(&port_data, get_port_availability(u, PA_DIRECTION_OUTPUT)); + pa_assert_se(port = pa_device_port_new(u->core, &port_data, 0)); + pa_assert_se(pa_hashmap_put(ports, port->name, port) >= 0); + pa_device_port_new_data_done(&port_data); + + u->input_port_name = pa_sprintf_malloc("%s-input", name_prefix); + pa_device_port_new_data_init(&port_data); + pa_device_port_new_data_set_name(&port_data, u->input_port_name); + pa_device_port_new_data_set_description(&port_data, input_description); + pa_device_port_new_data_set_direction(&port_data, PA_DIRECTION_INPUT); + pa_device_port_new_data_set_type(&port_data, input_type); + pa_device_port_new_data_set_available(&port_data, get_port_availability(u, PA_DIRECTION_INPUT)); + pa_assert_se(port = pa_device_port_new(u->core, &port_data, 0)); + pa_assert_se(pa_hashmap_put(ports, port->name, port) >= 0); + pa_device_port_new_data_done(&port_data); +} + +/* Run from main thread */ +static pa_card_profile *create_card_profile(struct userdata *u, pa_bluetooth_profile_t profile, pa_hashmap *ports) { + pa_device_port *input_port, *output_port; + const char *name; + pa_card_profile *cp = NULL; + pa_bluetooth_profile_t *p; + + pa_assert(u->input_port_name); + pa_assert(u->output_port_name); + pa_assert_se(input_port = pa_hashmap_get(ports, u->input_port_name)); + pa_assert_se(output_port = pa_hashmap_get(ports, u->output_port_name)); + + name = pa_bluetooth_profile_to_string(profile); + + switch (profile) { + case PA_BLUETOOTH_PROFILE_A2DP_SINK: + cp = pa_card_profile_new(name, _("High Fidelity Playback (A2DP Sink)"), sizeof(pa_bluetooth_profile_t)); + cp->priority = 40; + cp->n_sinks = 1; + cp->n_sources = 0; + cp->max_sink_channels = 2; + cp->max_source_channels = 0; + pa_hashmap_put(output_port->profiles, cp->name, cp); + + p = PA_CARD_PROFILE_DATA(cp); + break; + + case PA_BLUETOOTH_PROFILE_A2DP_SOURCE: + cp = pa_card_profile_new(name, _("High Fidelity Capture (A2DP Source)"), sizeof(pa_bluetooth_profile_t)); + cp->priority = 20; + cp->n_sinks = 0; + cp->n_sources = 1; + cp->max_sink_channels = 0; + cp->max_source_channels = 2; + pa_hashmap_put(input_port->profiles, cp->name, cp); + + p = PA_CARD_PROFILE_DATA(cp); + break; + + case PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT: + cp = pa_card_profile_new(name, _("Headset Head Unit (HSP/HFP)"), sizeof(pa_bluetooth_profile_t)); + cp->priority = 30; + cp->n_sinks = 1; + cp->n_sources = 1; + cp->max_sink_channels = 1; + cp->max_source_channels = 1; + pa_hashmap_put(input_port->profiles, cp->name, cp); + pa_hashmap_put(output_port->profiles, cp->name, cp); + + p = PA_CARD_PROFILE_DATA(cp); + break; + + case PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY: + cp = pa_card_profile_new(name, _("Headset Audio Gateway (HSP/HFP)"), sizeof(pa_bluetooth_profile_t)); + cp->priority = 10; + cp->n_sinks = 1; + cp->n_sources = 1; + cp->max_sink_channels = 1; + cp->max_source_channels = 1; + pa_hashmap_put(input_port->profiles, cp->name, cp); + pa_hashmap_put(output_port->profiles, cp->name, cp); + + p = PA_CARD_PROFILE_DATA(cp); + break; + + case PA_BLUETOOTH_PROFILE_OFF: + pa_assert_not_reached(); + } + + *p = profile; + + if (u->device->transports[*p]) + cp->available = transport_state_to_availability(u->device->transports[*p]->state); + else + cp->available = PA_AVAILABLE_NO; + + return cp; +} + +/* Run from main thread */ +static int set_profile_cb(pa_card *c, pa_card_profile *new_profile) { + struct userdata *u; + pa_bluetooth_profile_t *p; + + pa_assert(c); + pa_assert(new_profile); + pa_assert_se(u = c->userdata); + + p = PA_CARD_PROFILE_DATA(new_profile); + + if (*p != PA_BLUETOOTH_PROFILE_OFF) { + const pa_bluetooth_device *d = u->device; + + if (!d->transports[*p] || d->transports[*p]->state <= PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED) { + pa_log_warn("Refused to switch profile to %s: Not connected", new_profile->name); + return -PA_ERR_IO; + } + } + + stop_thread(u); + + u->profile = *p; + + if (u->profile != PA_BLUETOOTH_PROFILE_OFF) + if (init_profile(u) < 0) + goto off; + + if (u->sink || u->source) + if (start_thread(u) < 0) + goto off; + + return 0; + +off: + stop_thread(u); + + pa_assert_se(pa_card_set_profile(u->card, pa_hashmap_get(u->card->profiles, "off"), false) >= 0); + + return -PA_ERR_IO; +} + +static int uuid_to_profile(const char *uuid, pa_bluetooth_profile_t *_r) { + if (pa_streq(uuid, PA_BLUETOOTH_UUID_A2DP_SINK)) + *_r = PA_BLUETOOTH_PROFILE_A2DP_SINK; + else if (pa_streq(uuid, PA_BLUETOOTH_UUID_A2DP_SOURCE)) + *_r = PA_BLUETOOTH_PROFILE_A2DP_SOURCE; + else if (pa_bluetooth_uuid_is_hsp_hs(uuid) || pa_streq(uuid, PA_BLUETOOTH_UUID_HFP_HF)) + *_r = PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT; + else if (pa_streq(uuid, PA_BLUETOOTH_UUID_HSP_AG) || pa_streq(uuid, PA_BLUETOOTH_UUID_HFP_AG)) + *_r = PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY; + else + return -PA_ERR_INVALID; + + return 0; +} + +/* Run from main thread */ +static int add_card(struct userdata *u) { + const pa_bluetooth_device *d; + pa_card_new_data data; + char *alias; + pa_bluetooth_form_factor_t ff; + pa_card_profile *cp; + pa_bluetooth_profile_t *p; + const char *uuid; + void *state; + + pa_assert(u); + pa_assert(u->device); + + d = u->device; + + pa_card_new_data_init(&data); + data.driver = __FILE__; + data.module = u->module; + + alias = pa_utf8_filter(d->alias); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_DESCRIPTION, alias); + pa_xfree(alias); + + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, d->address); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_API, "bluez"); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_CLASS, "sound"); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_BUS, "bluetooth"); + + if ((ff = form_factor_from_class(d->class_of_device)) != PA_BLUETOOTH_FORM_FACTOR_UNKNOWN) + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_FORM_FACTOR, form_factor_to_string(ff)); + + pa_proplist_sets(data.proplist, "bluez.path", d->path); + pa_proplist_setf(data.proplist, "bluez.class", "0x%06x", d->class_of_device); + pa_proplist_sets(data.proplist, "bluez.alias", d->alias); + data.name = pa_sprintf_malloc("bluez_card.%s", d->address); + data.namereg_fail = false; + + create_card_ports(u, data.ports); + + PA_HASHMAP_FOREACH(uuid, d->uuids, state) { + pa_bluetooth_profile_t profile; + + if (uuid_to_profile(uuid, &profile) < 0) + continue; + + if (pa_hashmap_get(data.profiles, pa_bluetooth_profile_to_string(profile))) + continue; + + cp = create_card_profile(u, profile, data.ports); + pa_hashmap_put(data.profiles, cp->name, cp); + } + + pa_assert(!pa_hashmap_isempty(data.profiles)); + + cp = pa_card_profile_new("off", _("Off"), sizeof(pa_bluetooth_profile_t)); + cp->available = PA_AVAILABLE_YES; + p = PA_CARD_PROFILE_DATA(cp); + *p = PA_BLUETOOTH_PROFILE_OFF; + pa_hashmap_put(data.profiles, cp->name, cp); + + u->card = pa_card_new(u->core, &data); + pa_card_new_data_done(&data); + if (!u->card) { + pa_log("Failed to allocate card."); + return -1; + } + + u->card->userdata = u; + u->card->set_profile = set_profile_cb; + pa_card_choose_initial_profile(u->card); + pa_card_put(u->card); + + p = PA_CARD_PROFILE_DATA(u->card->active_profile); + u->profile = *p; + + return 0; +} + +/* Run from main thread */ +static void handle_transport_state_change(struct userdata *u, struct pa_bluetooth_transport *t) { + bool acquire = false; + bool release = false; + pa_card_profile *cp; + pa_device_port *port; + pa_available_t oldavail; + + pa_assert(u); + pa_assert(t); + pa_assert_se(cp = pa_hashmap_get(u->card->profiles, pa_bluetooth_profile_to_string(t->profile))); + + oldavail = cp->available; + pa_card_profile_set_available(cp, transport_state_to_availability(t->state)); + + /* Update port availability */ + pa_assert_se(port = pa_hashmap_get(u->card->ports, u->output_port_name)); + pa_device_port_set_available(port, get_port_availability(u, PA_DIRECTION_OUTPUT)); + pa_assert_se(port = pa_hashmap_get(u->card->ports, u->input_port_name)); + pa_device_port_set_available(port, get_port_availability(u, PA_DIRECTION_INPUT)); + + /* Acquire or release transport as needed */ + acquire = (t->state == PA_BLUETOOTH_TRANSPORT_STATE_PLAYING && u->profile == t->profile); + release = (oldavail != PA_AVAILABLE_NO && t->state != PA_BLUETOOTH_TRANSPORT_STATE_PLAYING && u->profile == t->profile); + + if (acquire && transport_acquire(u, true) >= 0) { + if (u->source) { + pa_log_debug("Resuming source %s because its transport state changed to playing", u->source->name); + + /* When the ofono backend resumes source or sink when in the audio gateway role, the + * state of source or sink may already be RUNNING before the transport is acquired via + * hf_audio_agent_new_connection(), so the pa_source_suspend() call will not lead to a + * state change message. In this case we explicitly need to signal the I/O thread to + * set up the stream. */ + if (PA_SOURCE_IS_OPENED(u->source->state)) + pa_asyncmsgq_send(u->source->asyncmsgq, PA_MSGOBJECT(u->source), PA_SOURCE_MESSAGE_SETUP_STREAM, NULL, 0, NULL); + + /* We remove the IDLE suspend cause, because otherwise + * module-loopback doesn't uncork its streams. FIXME: Messing with + * the IDLE suspend cause here is wrong, the correct way to handle + * this would probably be to uncork the loopback streams not only + * when the other end is unsuspended, but also when the other end's + * suspend cause changes to IDLE only (currently there's no + * notification mechanism for suspend cause changes, though). */ + pa_source_suspend(u->source, false, PA_SUSPEND_IDLE|PA_SUSPEND_USER); + } + + if (u->sink) { + pa_log_debug("Resuming sink %s because its transport state changed to playing", u->sink->name); + + /* Same comment as above */ + if (PA_SINK_IS_OPENED(u->sink->state)) + pa_asyncmsgq_send(u->sink->asyncmsgq, PA_MSGOBJECT(u->sink), PA_SINK_MESSAGE_SETUP_STREAM, NULL, 0, NULL); + + /* FIXME: See the previous comment. */ + pa_sink_suspend(u->sink, false, PA_SUSPEND_IDLE|PA_SUSPEND_USER); + } + } + + if (release && u->transport_acquired) { + /* FIXME: this release is racy, since the audio stream might have + * been set up again in the meantime (but not processed yet by PA). + * BlueZ should probably release the transport automatically, and in + * that case we would just mark the transport as released */ + + /* Remote side closed the stream so we consider it PA_SUSPEND_USER */ + if (u->source) { + pa_log_debug("Suspending source %s because the remote end closed the stream", u->source->name); + pa_source_suspend(u->source, true, PA_SUSPEND_USER); + } + + if (u->sink) { + pa_log_debug("Suspending sink %s because the remote end closed the stream", u->sink->name); + pa_sink_suspend(u->sink, true, PA_SUSPEND_USER); + } + } +} + +/* Run from main thread */ +static pa_hook_result_t device_connection_changed_cb(pa_bluetooth_discovery *y, const pa_bluetooth_device *d, struct userdata *u) { + pa_assert(d); + pa_assert(u); + + if (d != u->device || pa_bluetooth_device_any_transport_connected(d)) + return PA_HOOK_OK; + + pa_log_debug("Unloading module for device %s", d->path); + pa_module_unload(u->module, true); + + return PA_HOOK_OK; +} + +/* Run from main thread */ +static pa_hook_result_t transport_state_changed_cb(pa_bluetooth_discovery *y, pa_bluetooth_transport *t, struct userdata *u) { + pa_assert(t); + pa_assert(u); + + if (t == u->transport && t->state <= PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED) + pa_assert_se(pa_card_set_profile(u->card, pa_hashmap_get(u->card->profiles, "off"), false) >= 0); + + if (t->device == u->device) + handle_transport_state_change(u, t); + + return PA_HOOK_OK; +} + +static pa_hook_result_t transport_speaker_gain_changed_cb(pa_bluetooth_discovery *y, pa_bluetooth_transport *t, struct userdata *u) { + pa_volume_t volume; + pa_cvolume v; + uint16_t gain; + + pa_assert(t); + pa_assert(u); + + if (t != u->transport) + return PA_HOOK_OK; + + gain = t->speaker_gain; + volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN); + + /* increment volume by one to correct rounding errors */ + if (volume < PA_VOLUME_NORM) + volume++; + + pa_cvolume_set(&v, u->encoder_sample_spec.channels, volume); + if (t->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT) + pa_sink_volume_changed(u->sink, &v); + else + pa_sink_set_volume(u->sink, &v, true, true); + + return PA_HOOK_OK; +} + +static pa_hook_result_t transport_microphone_gain_changed_cb(pa_bluetooth_discovery *y, pa_bluetooth_transport *t, struct userdata *u) { + pa_volume_t volume; + pa_cvolume v; + uint16_t gain; + + pa_assert(t); + pa_assert(u); + + if (t != u->transport) + return PA_HOOK_OK; + + gain = t->microphone_gain; + volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN); + + /* increment volume by one to correct rounding errors */ + if (volume < PA_VOLUME_NORM) + volume++; + + pa_cvolume_set(&v, u->decoder_sample_spec.channels, volume); + + if (t->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT) + pa_source_volume_changed(u->source, &v); + else + pa_source_set_volume(u->source, &v, true, true); + + return PA_HOOK_OK; +} + +/* Run from main thread context */ +static int device_process_msg(pa_msgobject *obj, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct bluetooth_msg *m = BLUETOOTH_MSG(obj); + struct userdata *u = m->card->userdata; + + switch (code) { + case BLUETOOTH_MESSAGE_IO_THREAD_FAILED: + if (m->card->module->unload_requested) + break; + + pa_log_debug("Switching the profile to off due to IO thread failure."); + pa_assert_se(pa_card_set_profile(m->card, pa_hashmap_get(m->card->profiles, "off"), false) >= 0); + break; + case BLUETOOTH_MESSAGE_STREAM_FD_HUP: + if (u->transport->state > PA_BLUETOOTH_TRANSPORT_STATE_IDLE) + pa_bluetooth_transport_set_state(u->transport, PA_BLUETOOTH_TRANSPORT_STATE_IDLE); + break; + case BLUETOOTH_MESSAGE_SET_TRANSPORT_PLAYING: + /* transport_acquired needs to be checked here, because a message could have been + * pending when the profile was switched. If the new transport has been acquired + * correctly, the call below will have no effect because the transport state is + * already PLAYING. If transport_acquire() failed for the new profile, the transport + * state should not be changed. If the transport has been released for other reasons + * (I/O thread shutdown), transport_acquired will also be false. */ + if (u->transport_acquired) + pa_bluetooth_transport_set_state(u->transport, PA_BLUETOOTH_TRANSPORT_STATE_PLAYING); + break; + } + + return 0; +} + +int pa__init(pa_module* m) { + struct userdata *u; + const char *path; + pa_modargs *ma; + bool autodetect_mtu; + + pa_assert(m); + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->module = m; + u->core = m->core; + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log_error("Failed to parse module arguments"); + goto fail_free_modargs; + } + + if (!(path = pa_modargs_get_value(ma, "path", NULL))) { + pa_log_error("Failed to get device path from module arguments"); + goto fail_free_modargs; + } + + if ((u->discovery = pa_shared_get(u->core, "bluetooth-discovery"))) + pa_bluetooth_discovery_ref(u->discovery); + else { + pa_log_error("module-bluez5-discover doesn't seem to be loaded, refusing to load module-bluez5-device"); + goto fail_free_modargs; + } + + if (!(u->device = pa_bluetooth_discovery_get_device_by_path(u->discovery, path))) { + pa_log_error("%s is unknown", path); + goto fail_free_modargs; + } + + autodetect_mtu = false; + if (pa_modargs_get_value_boolean(ma, "autodetect_mtu", &autodetect_mtu) < 0) { + pa_log("Invalid boolean value for autodetect_mtu parameter"); + goto fail_free_modargs; + } + + u->device->autodetect_mtu = autodetect_mtu; + + pa_modargs_free(ma); + + u->device_connection_changed_slot = + pa_hook_connect(pa_bluetooth_discovery_hook(u->discovery, PA_BLUETOOTH_HOOK_DEVICE_CONNECTION_CHANGED), + PA_HOOK_NORMAL, (pa_hook_cb_t) device_connection_changed_cb, u); + + u->transport_state_changed_slot = + pa_hook_connect(pa_bluetooth_discovery_hook(u->discovery, PA_BLUETOOTH_HOOK_TRANSPORT_STATE_CHANGED), + PA_HOOK_NORMAL, (pa_hook_cb_t) transport_state_changed_cb, u); + + u->transport_speaker_gain_changed_slot = + pa_hook_connect(pa_bluetooth_discovery_hook(u->discovery, PA_BLUETOOTH_HOOK_TRANSPORT_SPEAKER_GAIN_CHANGED), PA_HOOK_NORMAL, (pa_hook_cb_t) transport_speaker_gain_changed_cb, u); + + u->transport_microphone_gain_changed_slot = + pa_hook_connect(pa_bluetooth_discovery_hook(u->discovery, PA_BLUETOOTH_HOOK_TRANSPORT_MICROPHONE_GAIN_CHANGED), PA_HOOK_NORMAL, (pa_hook_cb_t) transport_microphone_gain_changed_cb, u); + + if (add_card(u) < 0) + goto fail; + + if (!(u->msg = pa_msgobject_new(bluetooth_msg))) + goto fail; + + u->msg->parent.process_msg = device_process_msg; + u->msg->card = u->card; + u->stream_setup_done = false; + + if (u->profile != PA_BLUETOOTH_PROFILE_OFF) + if (init_profile(u) < 0) + goto off; + + if (u->sink || u->source) + if (start_thread(u) < 0) + goto off; + + return 0; + +off: + stop_thread(u); + + pa_assert_se(pa_card_set_profile(u->card, pa_hashmap_get(u->card->profiles, "off"), false) >= 0); + + return 0; + +fail_free_modargs: + + if (ma) + pa_modargs_free(ma); + +fail: + + pa__done(m); + + return -1; +} + +void pa__done(pa_module *m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + stop_thread(u); + + if (u->device_connection_changed_slot) + pa_hook_slot_free(u->device_connection_changed_slot); + + if (u->transport_state_changed_slot) + pa_hook_slot_free(u->transport_state_changed_slot); + + if (u->transport_speaker_gain_changed_slot) + pa_hook_slot_free(u->transport_speaker_gain_changed_slot); + + if (u->transport_microphone_gain_changed_slot) + pa_hook_slot_free(u->transport_microphone_gain_changed_slot); + + if (u->encoder_buffer) + pa_xfree(u->encoder_buffer); + + if (u->decoder_buffer) + pa_xfree(u->decoder_buffer); + + if (u->msg) + pa_xfree(u->msg); + + if (u->card) + pa_card_free(u->card); + + if (u->discovery) + pa_bluetooth_discovery_unref(u->discovery); + + pa_xfree(u->output_port_name); + pa_xfree(u->input_port_name); + + pa_xfree(u); +} + +int pa__get_n_used(pa_module *m) { + struct userdata *u; + + pa_assert(m); + pa_assert_se(u = m->userdata); + + return (u->sink ? pa_sink_linked_by(u->sink) : 0) + (u->source ? pa_source_linked_by(u->source) : 0); +} diff --git a/src/modules/bluetooth/module-bluez5-discover.c b/src/modules/bluetooth/module-bluez5-discover.c new file mode 100644 index 0000000..47b5761 --- /dev/null +++ b/src/modules/bluetooth/module-bluez5-discover.c @@ -0,0 +1,173 @@ +/*** + This file is part of PulseAudio. + + Copyright 2008-2013 João Paulo Rechi Vita + + PulseAudio 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 2.1 of the + License, or (at your option) any later version. + + PulseAudio 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 Lesser General Public + License along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include + +#include "bluez5-util.h" + +PA_MODULE_AUTHOR("João Paulo Rechi Vita"); +PA_MODULE_DESCRIPTION("Detect available BlueZ 5 Bluetooth audio devices and load BlueZ 5 Bluetooth audio drivers"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(true); +PA_MODULE_USAGE( + "headset=ofono|native|auto" + "autodetect_mtu=" +); + +static const char* const valid_modargs[] = { + "headset", + "autodetect_mtu", + NULL +}; + +struct userdata { + pa_module *module; + pa_core *core; + pa_hashmap *loaded_device_paths; + pa_hook_slot *device_connection_changed_slot; + pa_bluetooth_discovery *discovery; + bool autodetect_mtu; +}; + +static pa_hook_result_t device_connection_changed_cb(pa_bluetooth_discovery *y, const pa_bluetooth_device *d, struct userdata *u) { + bool module_loaded; + + pa_assert(d); + pa_assert(u); + + module_loaded = pa_hashmap_get(u->loaded_device_paths, d->path) ? true : false; + + if (module_loaded && !pa_bluetooth_device_any_transport_connected(d)) { + /* disconnection, the module unloads itself */ + pa_log_debug("Unregistering module for %s", d->path); + pa_hashmap_remove(u->loaded_device_paths, d->path); + return PA_HOOK_OK; + } + + if (!module_loaded && pa_bluetooth_device_any_transport_connected(d)) { + /* a new device has been connected */ + pa_module *m; + char *args = pa_sprintf_malloc("path=%s autodetect_mtu=%i", d->path, (int)u->autodetect_mtu); + + pa_log_debug("Loading module-bluez5-device %s", args); + pa_module_load(&m, u->module->core, "module-bluez5-device", args); + pa_xfree(args); + + if (m) + /* No need to duplicate the path here since the device object will + * exist for the whole hashmap entry lifespan */ + pa_hashmap_put(u->loaded_device_paths, d->path, d->path); + else + pa_log_warn("Failed to load module for device %s", d->path); + + return PA_HOOK_OK; + } + + return PA_HOOK_OK; +} + +#ifdef HAVE_BLUEZ_5_NATIVE_HEADSET +const char *default_headset_backend = "auto"; +#else +const char *default_headset_backend = "ofono"; +#endif + +int pa__init(pa_module *m) { + struct userdata *u; + pa_modargs *ma; + const char *headset_str; + int headset_backend; + bool autodetect_mtu; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("failed to parse module arguments."); + goto fail; + } + + pa_assert_se(headset_str = pa_modargs_get_value(ma, "headset", default_headset_backend)); + if (pa_streq(headset_str, "ofono")) + headset_backend = HEADSET_BACKEND_OFONO; + else if (pa_streq(headset_str, "native")) + headset_backend = HEADSET_BACKEND_NATIVE; + else if (pa_streq(headset_str, "auto")) + headset_backend = HEADSET_BACKEND_AUTO; + else { + pa_log("headset parameter must be either ofono, native or auto (found %s)", headset_str); + goto fail; + } + + autodetect_mtu = false; + if (pa_modargs_get_value_boolean(ma, "autodetect_mtu", &autodetect_mtu) < 0) { + pa_log("Invalid boolean value for autodetect_mtu parameter"); + goto fail; + } + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->module = m; + u->core = m->core; + u->autodetect_mtu = autodetect_mtu; + u->loaded_device_paths = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + + if (!(u->discovery = pa_bluetooth_discovery_get(u->core, headset_backend))) + goto fail; + + u->device_connection_changed_slot = + pa_hook_connect(pa_bluetooth_discovery_hook(u->discovery, PA_BLUETOOTH_HOOK_DEVICE_CONNECTION_CHANGED), + PA_HOOK_NORMAL, (pa_hook_cb_t) device_connection_changed_cb, u); + + pa_modargs_free(ma); + return 0; + +fail: + if (ma) + pa_modargs_free(ma); + pa__done(m); + return -1; +} + +void pa__done(pa_module *m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->device_connection_changed_slot) + pa_hook_slot_free(u->device_connection_changed_slot); + + if (u->loaded_device_paths) + pa_hashmap_free(u->loaded_device_paths); + + if (u->discovery) + pa_bluetooth_discovery_unref(u->discovery); + + pa_xfree(u); +} diff --git a/src/modules/bluetooth/rtp.h b/src/modules/bluetooth/rtp.h new file mode 100644 index 0000000..813d9e3 --- /dev/null +++ b/src/modules/bluetooth/rtp.h @@ -0,0 +1,80 @@ +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2004-2010 Marcel Holtmann + * Copyright (C) 2019 Pali Rohár + * + * + * This library 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 2.1 of the License, or (at your option) any later version. + * + * This library 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 library; if not, see . + */ + +#include +#include + +#if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \ + __BYTE_ORDER == __LITTLE_ENDIAN + +struct rtp_header { + uint8_t cc:4; + uint8_t x:1; + uint8_t p:1; + uint8_t v:2; + + uint8_t pt:7; + uint8_t m:1; + + uint16_t sequence_number; + uint32_t timestamp; + uint32_t ssrc; + uint32_t csrc[0]; +} __attribute__ ((packed)); + +struct rtp_sbc_payload { + uint8_t frame_count:4; + uint8_t rfa0:1; + uint8_t is_last_fragment:1; + uint8_t is_first_fragment:1; + uint8_t is_fragmented:1; +} __attribute__ ((packed)); + +#elif defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && \ + __BYTE_ORDER == __BIG_ENDIAN + +struct rtp_header { + uint8_t v:2; + uint8_t p:1; + uint8_t x:1; + uint8_t cc:4; + + uint8_t m:1; + uint8_t pt:7; + + uint16_t sequence_number; + uint32_t timestamp; + uint32_t ssrc; + uint32_t csrc[0]; +} __attribute__ ((packed)); + +struct rtp_sbc_payload { + uint8_t is_fragmented:1; + uint8_t is_first_fragment:1; + uint8_t is_last_fragment:1; + uint8_t rfa0:1; + uint8_t frame_count:4; +} __attribute__ ((packed)); + +#else +#error "Unknown byte order" +#endif diff --git a/src/modules/dbus/iface-card-profile.c b/src/modules/dbus/iface-card-profile.c new file mode 100644 index 0000000..bb8b642 --- /dev/null +++ b/src/modules/dbus/iface-card-profile.c @@ -0,0 +1,251 @@ +/*** + This file is part of PulseAudio. + + Copyright 2009 Tanu Kaskinen + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include + +#include "iface-card-profile.h" + +#define OBJECT_NAME "profile" + +static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_description(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_sinks(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_sources(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_priority(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_available(DBusConnection *conn, DBusMessage *msg, void *userdata); + +static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata); + +struct pa_dbusiface_card_profile { + uint32_t index; + pa_card_profile *profile; + char *path; + pa_dbus_protocol *dbus_protocol; +}; + +enum property_handler_index { + PROPERTY_HANDLER_INDEX, + PROPERTY_HANDLER_NAME, + PROPERTY_HANDLER_DESCRIPTION, + PROPERTY_HANDLER_SINKS, + PROPERTY_HANDLER_SOURCES, + PROPERTY_HANDLER_PRIORITY, + PROPERTY_HANDLER_AVAILABLE, + PROPERTY_HANDLER_MAX +}; + +static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = { + [PROPERTY_HANDLER_INDEX] = { .property_name = "Index", .type = "u", .get_cb = handle_get_index, .set_cb = NULL }, + [PROPERTY_HANDLER_NAME] = { .property_name = "Name", .type = "s", .get_cb = handle_get_name, .set_cb = NULL }, + [PROPERTY_HANDLER_DESCRIPTION] = { .property_name = "Description", .type = "s", .get_cb = handle_get_description, .set_cb = NULL }, + [PROPERTY_HANDLER_SINKS] = { .property_name = "Sinks", .type = "u", .get_cb = handle_get_sinks, .set_cb = NULL }, + [PROPERTY_HANDLER_SOURCES] = { .property_name = "Sources", .type = "u", .get_cb = handle_get_sources, .set_cb = NULL }, + [PROPERTY_HANDLER_PRIORITY] = { .property_name = "Priority", .type = "u", .get_cb = handle_get_priority, .set_cb = NULL }, + [PROPERTY_HANDLER_AVAILABLE] = { .property_name = "Available", .type = "b", .get_cb = handle_get_available, .set_cb = NULL }, +}; + +static pa_dbus_interface_info profile_interface_info = { + .name = PA_DBUSIFACE_CARD_PROFILE_INTERFACE, + .method_handlers = NULL, + .n_method_handlers = 0, + .property_handlers = property_handlers, + .n_property_handlers = PROPERTY_HANDLER_MAX, + .get_all_properties_cb = handle_get_all, + .signals = NULL, + .n_signals = 0 +}; + +static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_card_profile *p = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(p); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &p->index); +} + +static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_card_profile *p = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(p); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &p->profile->name); +} + +static void handle_get_description(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_card_profile *p = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(p); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &p->profile->description); +} + +static void handle_get_sinks(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_card_profile *p = userdata; + dbus_uint32_t sinks = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(p); + + sinks = p->profile->n_sinks; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &sinks); +} + +static void handle_get_sources(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_card_profile *p = userdata; + dbus_uint32_t sources = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(p); + + sources = p->profile->n_sources; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &sources); +} + +static void handle_get_priority(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_card_profile *p = userdata; + dbus_uint32_t priority = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(p); + + priority = p->profile->priority; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &priority); +} + +static void handle_get_available(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_card_profile *p = userdata; + dbus_bool_t available; + + pa_assert(conn); + pa_assert(msg); + pa_assert(p); + + available = p->profile->available != PA_AVAILABLE_NO; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &available); +} + +static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_card_profile *p = userdata; + DBusMessage *reply = NULL; + DBusMessageIter msg_iter; + DBusMessageIter dict_iter; + dbus_uint32_t sinks = 0; + dbus_uint32_t sources = 0; + dbus_uint32_t priority = 0; + dbus_bool_t available; + + pa_assert(conn); + pa_assert(msg); + pa_assert(p); + + sinks = p->profile->n_sinks; + sources = p->profile->n_sources; + priority = p->profile->priority; + available = p->profile->available != PA_AVAILABLE_NO; + + pa_assert_se((reply = dbus_message_new_method_return(msg))); + + dbus_message_iter_init_append(reply, &msg_iter); + pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter)); + + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_INDEX].property_name, DBUS_TYPE_UINT32, &p->index); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_NAME].property_name, DBUS_TYPE_STRING, &p->profile->name); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DESCRIPTION].property_name, DBUS_TYPE_STRING, &p->profile->description); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SINKS].property_name, DBUS_TYPE_UINT32, &sinks); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SOURCES].property_name, DBUS_TYPE_UINT32, &sources); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PRIORITY].property_name, DBUS_TYPE_UINT32, &priority); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_AVAILABLE].property_name, DBUS_TYPE_BOOLEAN, &available); + + pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter)); + + pa_assert_se(dbus_connection_send(conn, reply, NULL)); + dbus_message_unref(reply); +} + +pa_dbusiface_card_profile *pa_dbusiface_card_profile_new( + pa_dbusiface_card *card, + pa_core *core, + pa_card_profile *profile, + uint32_t idx) { + pa_dbusiface_card_profile *p = NULL; + + pa_assert(card); + pa_assert(core); + pa_assert(profile); + + p = pa_xnew(pa_dbusiface_card_profile, 1); + p->index = idx; + p->profile = profile; + p->path = pa_sprintf_malloc("%s/%s%u", pa_dbusiface_card_get_path(card), OBJECT_NAME, idx); + p->dbus_protocol = pa_dbus_protocol_get(core); + + pa_assert_se(pa_dbus_protocol_add_interface(p->dbus_protocol, p->path, &profile_interface_info, p) >= 0); + + return p; +} + +void pa_dbusiface_card_profile_free(pa_dbusiface_card_profile *p) { + pa_assert(p); + + pa_assert_se(pa_dbus_protocol_remove_interface(p->dbus_protocol, p->path, profile_interface_info.name) >= 0); + + pa_dbus_protocol_unref(p->dbus_protocol); + + pa_xfree(p->path); + pa_xfree(p); +} + +const char *pa_dbusiface_card_profile_get_path(pa_dbusiface_card_profile *p) { + pa_assert(p); + + return p->path; +} + +const char *pa_dbusiface_card_profile_get_name(pa_dbusiface_card_profile *p) { + pa_assert(p); + + return p->profile->name; +} + +pa_card_profile *pa_dbusiface_card_profile_get_profile(pa_dbusiface_card_profile *p) { + pa_assert(p); + + return p->profile; +} diff --git a/src/modules/dbus/iface-card-profile.h b/src/modules/dbus/iface-card-profile.h new file mode 100644 index 0000000..443d790 --- /dev/null +++ b/src/modules/dbus/iface-card-profile.h @@ -0,0 +1,48 @@ +#ifndef foodbusifacecardprofilehfoo +#define foodbusifacecardprofilehfoo + +/*** + This file is part of PulseAudio. + + Copyright 2009 Tanu Kaskinen + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +/* This object implements the D-Bus interface org.PulseAudio.Core1.CardProfile. + * + * See http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/Developer/Clients/DBus/CardProfile/ + * for the CardProfile interface documentation. + */ + +#include + +#include "iface-card.h" + +#define PA_DBUSIFACE_CARD_PROFILE_INTERFACE PA_DBUS_CORE_INTERFACE ".CardProfile" + +typedef struct pa_dbusiface_card_profile pa_dbusiface_card_profile; + +pa_dbusiface_card_profile *pa_dbusiface_card_profile_new( + pa_dbusiface_card *card, + pa_core *core, + pa_card_profile *profile, + uint32_t idx); +void pa_dbusiface_card_profile_free(pa_dbusiface_card_profile *p); + +const char *pa_dbusiface_card_profile_get_path(pa_dbusiface_card_profile *p); +const char *pa_dbusiface_card_profile_get_name(pa_dbusiface_card_profile *p); +pa_card_profile *pa_dbusiface_card_profile_get_profile(pa_dbusiface_card_profile *p); + +#endif diff --git a/src/modules/dbus/iface-card.c b/src/modules/dbus/iface-card.c new file mode 100644 index 0000000..32e892a --- /dev/null +++ b/src/modules/dbus/iface-card.c @@ -0,0 +1,612 @@ +/*** + This file is part of PulseAudio. + + Copyright 2009 Tanu Kaskinen + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include +#include + +#include "iface-card-profile.h" + +#include "iface-card.h" + +#define OBJECT_NAME "card" + +static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_driver(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_owner_module(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_sinks(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_sources(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_profiles(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_active_profile(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_set_active_profile(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata); +static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata); + +static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata); + +static void handle_get_profile_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata); + +struct pa_dbusiface_card { + pa_dbusiface_core *core; + + pa_card *card; + char *path; + pa_hashmap *profiles; + uint32_t next_profile_index; + pa_card_profile *active_profile; + pa_proplist *proplist; + + pa_hook_slot *card_profile_added_slot; + pa_hook_slot *card_profile_changed_slot; + pa_hook_slot *card_profile_available_slot; + + pa_dbus_protocol *dbus_protocol; +}; + +enum property_handler_index { + PROPERTY_HANDLER_INDEX, + PROPERTY_HANDLER_NAME, + PROPERTY_HANDLER_DRIVER, + PROPERTY_HANDLER_OWNER_MODULE, + PROPERTY_HANDLER_SINKS, + PROPERTY_HANDLER_SOURCES, + PROPERTY_HANDLER_PROFILES, + PROPERTY_HANDLER_ACTIVE_PROFILE, + PROPERTY_HANDLER_PROPERTY_LIST, + PROPERTY_HANDLER_MAX +}; + +static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = { + [PROPERTY_HANDLER_INDEX] = { .property_name = "Index", .type = "u", .get_cb = handle_get_index, .set_cb = NULL }, + [PROPERTY_HANDLER_NAME] = { .property_name = "Name", .type = "s", .get_cb = handle_get_name, .set_cb = NULL }, + [PROPERTY_HANDLER_DRIVER] = { .property_name = "Driver", .type = "s", .get_cb = handle_get_driver, .set_cb = NULL }, + [PROPERTY_HANDLER_OWNER_MODULE] = { .property_name = "OwnerModule", .type = "o", .get_cb = handle_get_owner_module, .set_cb = NULL }, + [PROPERTY_HANDLER_SINKS] = { .property_name = "Sinks", .type = "ao", .get_cb = handle_get_sinks, .set_cb = NULL }, + [PROPERTY_HANDLER_SOURCES] = { .property_name = "Sources", .type = "ao", .get_cb = handle_get_sources, .set_cb = NULL }, + [PROPERTY_HANDLER_PROFILES] = { .property_name = "Profiles", .type = "ao", .get_cb = handle_get_profiles, .set_cb = NULL }, + [PROPERTY_HANDLER_ACTIVE_PROFILE] = { .property_name = "ActiveProfile", .type = "o", .get_cb = handle_get_active_profile, .set_cb = handle_set_active_profile }, + [PROPERTY_HANDLER_PROPERTY_LIST] = { .property_name = "PropertyList", .type = "a{say}", .get_cb = handle_get_property_list, .set_cb = NULL } +}; + +enum method_handler_index { + METHOD_HANDLER_GET_PROFILE_BY_NAME, + METHOD_HANDLER_MAX +}; + +static pa_dbus_arg_info get_profile_by_name_args[] = { { "name", "s", "in" }, { "profile", "o", "out" } }; + +static pa_dbus_method_handler method_handlers[METHOD_HANDLER_MAX] = { + [METHOD_HANDLER_GET_PROFILE_BY_NAME] = { + .method_name = "GetProfileByName", + .arguments = get_profile_by_name_args, + .n_arguments = sizeof(get_profile_by_name_args) / sizeof(pa_dbus_arg_info), + .receive_cb = handle_get_profile_by_name } +}; + +enum signal_index { + SIGNAL_ACTIVE_PROFILE_UPDATED, + SIGNAL_NEW_PROFILE, + SIGNAL_PROFILE_AVAILABLE_CHANGED, + SIGNAL_PROPERTY_LIST_UPDATED, + SIGNAL_MAX +}; + +static pa_dbus_arg_info active_profile_updated_args[] = { { "profile", "o", NULL } }; +static pa_dbus_arg_info new_profile_args[] = { { "profile", "o", NULL } }; +static pa_dbus_arg_info profile_available_changed_args[] = { { "profile", "o", NULL }, + { "available", "b", NULL } }; +static pa_dbus_arg_info property_list_updated_args[] = { { "property_list", "a{say}", NULL } }; + +static pa_dbus_signal_info signals[SIGNAL_MAX] = { + [SIGNAL_ACTIVE_PROFILE_UPDATED] = { .name = "ActiveProfileUpdated", .arguments = active_profile_updated_args, .n_arguments = 1 }, + [SIGNAL_NEW_PROFILE] = { .name = "NewProfile", .arguments = new_profile_args, .n_arguments = 1 }, + [SIGNAL_PROFILE_AVAILABLE_CHANGED] = { .name = "ProfileAvailableChanged", .arguments = profile_available_changed_args, .n_arguments = 2 }, + [SIGNAL_PROPERTY_LIST_UPDATED] = { .name = "PropertyListUpdated", .arguments = property_list_updated_args, .n_arguments = 1 } +}; + +static pa_dbus_interface_info card_interface_info = { + .name = PA_DBUSIFACE_CARD_INTERFACE, + .method_handlers = method_handlers, + .n_method_handlers = METHOD_HANDLER_MAX, + .property_handlers = property_handlers, + .n_property_handlers = PROPERTY_HANDLER_MAX, + .get_all_properties_cb = handle_get_all, + .signals = signals, + .n_signals = SIGNAL_MAX +}; + +static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_card *c = userdata; + dbus_uint32_t idx; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + idx = c->card->index; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &idx); +} + +static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_card *c = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &c->card->name); +} + +static void handle_get_driver(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_card *c = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &c->card->driver); +} + +static void handle_get_owner_module(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_card *c = userdata; + const char *owner_module; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + if (!c->card->module) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Card %s doesn't have an owner module.", c->card->name); + return; + } + + owner_module = pa_dbusiface_core_get_module_path(c->core, c->card->module); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &owner_module); +} + +/* The caller frees the array, but not the strings. */ +static const char **get_sinks(pa_dbusiface_card *c, unsigned *n) { + const char **sinks = NULL; + unsigned i = 0; + uint32_t idx = 0; + pa_sink *sink = NULL; + + pa_assert(c); + pa_assert(n); + + *n = pa_idxset_size(c->card->sinks); + + if (*n == 0) + return NULL; + + sinks = pa_xnew(const char *, *n); + + PA_IDXSET_FOREACH(sink, c->card->sinks, idx) { + sinks[i] = pa_dbusiface_core_get_sink_path(c->core, sink); + ++i; + } + + return sinks; +} + +static void handle_get_sinks(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_card *c = userdata; + const char **sinks; + unsigned n_sinks; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + sinks = get_sinks(c, &n_sinks); + + pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, sinks, n_sinks); + + pa_xfree(sinks); +} + +/* The caller frees the array, but not the strings. */ +static const char **get_sources(pa_dbusiface_card *c, unsigned *n) { + const char **sources = NULL; + unsigned i = 0; + uint32_t idx = 0; + pa_source *source = NULL; + + pa_assert(c); + pa_assert(n); + + *n = pa_idxset_size(c->card->sources); + + if (*n == 0) + return NULL; + + sources = pa_xnew(const char *, *n); + + PA_IDXSET_FOREACH(source, c->card->sources, idx) { + sources[i] = pa_dbusiface_core_get_source_path(c->core, source); + ++i; + } + + return sources; +} + +static void handle_get_sources(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_card *c = userdata; + const char **sources; + unsigned n_sources; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + sources = get_sources(c, &n_sources); + + pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, sources, n_sources); + + pa_xfree(sources); +} + +/* The caller frees the array, but not the strings. */ +static const char **get_profiles(pa_dbusiface_card *c, unsigned *n) { + const char **profiles; + unsigned i = 0; + void *state = NULL; + pa_dbusiface_card_profile *profile; + + pa_assert(c); + pa_assert(n); + + *n = pa_hashmap_size(c->profiles); + + if (*n == 0) + return NULL; + + profiles = pa_xnew(const char *, *n); + + PA_HASHMAP_FOREACH(profile, c->profiles, state) + profiles[i++] = pa_dbusiface_card_profile_get_path(profile); + + return profiles; +} + +static void handle_get_profiles(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_card *c = userdata; + const char **profiles; + unsigned n_profiles; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + profiles = get_profiles(c, &n_profiles); + + pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, profiles, n_profiles); + + pa_xfree(profiles); +} + +static void handle_get_active_profile(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_card *c = userdata; + const char *active_profile; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + active_profile = pa_dbusiface_card_profile_get_path(pa_hashmap_get(c->profiles, c->active_profile->name)); + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &active_profile); +} + +static void handle_set_active_profile(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) { + pa_dbusiface_card *c = userdata; + const char *new_active_path; + pa_dbusiface_card_profile *profile; + void *state; + pa_dbusiface_card_profile *new_active = NULL; + int r; + + pa_assert(conn); + pa_assert(msg); + pa_assert(iter); + pa_assert(c); + + dbus_message_iter_get_basic(iter, &new_active_path); + + PA_HASHMAP_FOREACH(profile, c->profiles, state) { + if (pa_streq(pa_dbusiface_card_profile_get_path(profile), new_active_path)) { + new_active = profile; + break; + } + } + + if (!new_active) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such profile.", new_active_path); + return; + } + + if ((r = pa_card_set_profile(c->card, pa_dbusiface_card_profile_get_profile(new_active), true)) < 0) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, + "Internal error in PulseAudio: pa_card_set_profile() failed with error code %i.", r); + return; + } + + pa_dbus_send_empty_reply(conn, msg); +} + +static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_card *c = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + pa_dbus_send_proplist_variant_reply(conn, msg, c->proplist); +} + +static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_card *c = userdata; + DBusMessage *reply = NULL; + DBusMessageIter msg_iter; + DBusMessageIter dict_iter; + dbus_uint32_t idx; + const char *owner_module = NULL; + const char **sinks = NULL; + unsigned n_sinks = 0; + const char **sources = NULL; + unsigned n_sources = 0; + const char **profiles = NULL; + unsigned n_profiles = 0; + const char *active_profile = NULL; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + idx = c->card->index; + if (c->card->module) + owner_module = pa_dbusiface_core_get_module_path(c->core, c->card->module); + sinks = get_sinks(c, &n_sinks); + sources = get_sources(c, &n_sources); + profiles = get_profiles(c, &n_profiles); + active_profile = pa_dbusiface_card_profile_get_path(pa_hashmap_get(c->profiles, c->active_profile->name)); + + pa_assert_se((reply = dbus_message_new_method_return(msg))); + + dbus_message_iter_init_append(reply, &msg_iter); + pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter)); + + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_INDEX].property_name, DBUS_TYPE_UINT32, &idx); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_NAME].property_name, DBUS_TYPE_STRING, &c->card->name); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DRIVER].property_name, DBUS_TYPE_STRING, &c->card->driver); + + if (owner_module) + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_OWNER_MODULE].property_name, DBUS_TYPE_OBJECT_PATH, &owner_module); + + pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SINKS].property_name, DBUS_TYPE_OBJECT_PATH, sinks, n_sinks); + pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SOURCES].property_name, DBUS_TYPE_OBJECT_PATH, sources, n_sources); + pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PROFILES].property_name, DBUS_TYPE_OBJECT_PATH, profiles, n_profiles); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_ACTIVE_PROFILE].property_name, DBUS_TYPE_OBJECT_PATH, &active_profile); + + pa_dbus_append_proplist_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PROPERTY_LIST].property_name, c->proplist); + + pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter)); + + pa_assert_se(dbus_connection_send(conn, reply, NULL)); + + dbus_message_unref(reply); + + pa_xfree(sinks); + pa_xfree(sources); + pa_xfree(profiles); +} + +static void handle_get_profile_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_card *c = userdata; + const char *profile_name = NULL; + pa_dbusiface_card_profile *profile = NULL; + const char *profile_path = NULL; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + pa_assert_se(dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &profile_name, DBUS_TYPE_INVALID)); + + if (!(profile = pa_hashmap_get(c->profiles, profile_name))) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such profile on card %s.", profile_name, c->card->name); + return; + } + + profile_path = pa_dbusiface_card_profile_get_path(profile); + + pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &profile_path); +} + +static void check_card_proplist(pa_dbusiface_card *c) { + DBusMessage *signal_msg; + + if (!pa_proplist_equal(c->proplist, c->card->proplist)) { + DBusMessageIter msg_iter; + + pa_proplist_update(c->proplist, PA_UPDATE_SET, c->card->proplist); + + pa_assert_se(signal_msg = dbus_message_new_signal(c->path, + PA_DBUSIFACE_CARD_INTERFACE, + signals[SIGNAL_PROPERTY_LIST_UPDATED].name)); + dbus_message_iter_init_append(signal_msg, &msg_iter); + pa_dbus_append_proplist(&msg_iter, c->proplist); + + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + } +} + +static pa_hook_result_t card_profile_changed_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_card *dbus_card = slot_data; + pa_card *core_card = call_data; + const char *object_path; + DBusMessage *signal_msg; + + if (dbus_card->card != core_card) + return PA_HOOK_OK; + + dbus_card->active_profile = dbus_card->card->active_profile; + + object_path = pa_dbusiface_card_profile_get_path(pa_hashmap_get(dbus_card->profiles, dbus_card->active_profile->name)); + + pa_assert_se(signal_msg = dbus_message_new_signal(dbus_card->path, + PA_DBUSIFACE_CARD_INTERFACE, + signals[SIGNAL_ACTIVE_PROFILE_UPDATED].name)); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(dbus_card->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + check_card_proplist(dbus_card); + + return PA_HOOK_OK; +} + +static pa_hook_result_t card_profile_added_cb(void *hook_data, void *call_data, void *slot_data) { + pa_core *core = hook_data; + pa_dbusiface_card *c = slot_data; + pa_card_profile *profile = call_data; + pa_dbusiface_card_profile *p; + const char *object_path; + DBusMessage *signal_msg; + + if (profile->card != c->card) + return PA_HOOK_OK; + + p = pa_dbusiface_card_profile_new(c, core, profile, c->next_profile_index++); + pa_assert_se(pa_hashmap_put(c->profiles, (char *) pa_dbusiface_card_profile_get_name(p), p) >= 0); + + /* Send D-Bus signal */ + object_path = pa_dbusiface_card_profile_get_path(p); + + pa_assert_se(signal_msg = dbus_message_new_signal(c->path, + PA_DBUSIFACE_CARD_INTERFACE, + signals[SIGNAL_NEW_PROFILE].name)); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + check_card_proplist(c); + + return PA_HOOK_OK; +} + +static pa_hook_result_t card_profile_available_changed_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_card *c = slot_data; + pa_card_profile *profile = call_data; + pa_dbusiface_card_profile *p; + const char *object_path; + dbus_bool_t available; + DBusMessage *signal_msg; + + if (profile->card != c->card) + return PA_HOOK_OK; + + pa_assert_se((p = pa_hashmap_get(c->profiles, profile->name))); + + object_path = pa_dbusiface_card_profile_get_path(p); + available = profile->available != PA_AVAILABLE_NO; + + pa_assert_se(signal_msg = dbus_message_new_signal(c->path, + PA_DBUSIFACE_CARD_INTERFACE, + signals[SIGNAL_PROFILE_AVAILABLE_CHANGED].name)); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, + DBUS_TYPE_BOOLEAN, &available, + DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + check_card_proplist(c); + + return PA_HOOK_OK; +} + +pa_dbusiface_card *pa_dbusiface_card_new(pa_dbusiface_core *core, pa_card *card) { + pa_dbusiface_card *c = NULL; + pa_card_profile *profile; + void *state; + + pa_assert(core); + pa_assert(card); + + c = pa_xnew0(pa_dbusiface_card, 1); + c->core = core; + c->card = card; + c->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, OBJECT_NAME, card->index); + c->profiles = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, + (pa_free_cb_t) pa_dbusiface_card_profile_free); + c->next_profile_index = 0; + c->active_profile = card->active_profile; + c->proplist = pa_proplist_copy(card->proplist); + c->dbus_protocol = pa_dbus_protocol_get(card->core); + + PA_HASHMAP_FOREACH(profile, card->profiles, state) { + pa_dbusiface_card_profile *p = pa_dbusiface_card_profile_new(c, card->core, profile, c->next_profile_index++); + pa_hashmap_put(c->profiles, (char *) pa_dbusiface_card_profile_get_name(p), p); + } + + pa_assert_se(pa_dbus_protocol_add_interface(c->dbus_protocol, c->path, &card_interface_info, c) >= 0); + + c->card_profile_changed_slot = pa_hook_connect(&card->core->hooks[PA_CORE_HOOK_CARD_PROFILE_CHANGED], PA_HOOK_NORMAL, + card_profile_changed_cb, c); + c->card_profile_added_slot = pa_hook_connect(&card->core->hooks[PA_CORE_HOOK_CARD_PROFILE_ADDED], PA_HOOK_NORMAL, + card_profile_added_cb, c); + c->card_profile_available_slot = pa_hook_connect(&card->core->hooks[PA_CORE_HOOK_CARD_PROFILE_AVAILABLE_CHANGED], PA_HOOK_NORMAL, + card_profile_available_changed_cb, c); + + return c; +} + +void pa_dbusiface_card_free(pa_dbusiface_card *c) { + pa_assert(c); + + pa_assert_se(pa_dbus_protocol_remove_interface(c->dbus_protocol, c->path, card_interface_info.name) >= 0); + + pa_hook_slot_free(c->card_profile_added_slot); + pa_hook_slot_free(c->card_profile_changed_slot); + pa_hook_slot_free(c->card_profile_available_slot); + + pa_hashmap_free(c->profiles); + pa_proplist_free(c->proplist); + pa_dbus_protocol_unref(c->dbus_protocol); + + pa_xfree(c->path); + pa_xfree(c); +} + +const char *pa_dbusiface_card_get_path(pa_dbusiface_card *c) { + pa_assert(c); + + return c->path; +} diff --git a/src/modules/dbus/iface-card.h b/src/modules/dbus/iface-card.h new file mode 100644 index 0000000..5896724 --- /dev/null +++ b/src/modules/dbus/iface-card.h @@ -0,0 +1,43 @@ +#ifndef foodbusifacecardhfoo +#define foodbusifacecardhfoo + +/*** + This file is part of PulseAudio. + + Copyright 2009 Tanu Kaskinen + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +/* This object implements the D-Bus interface org.PulseAudio.Core1.Card. + * + * See http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/Developer/Clients/DBus/Card/ + * for the Card interface documentation. + */ + +#include +#include + +#include "iface-core.h" + +#define PA_DBUSIFACE_CARD_INTERFACE PA_DBUS_CORE_INTERFACE ".Card" + +typedef struct pa_dbusiface_card pa_dbusiface_card; + +pa_dbusiface_card *pa_dbusiface_card_new(pa_dbusiface_core *core, pa_card *card); +void pa_dbusiface_card_free(pa_dbusiface_card *c); + +const char *pa_dbusiface_card_get_path(pa_dbusiface_card *c); + +#endif diff --git a/src/modules/dbus/iface-client.c b/src/modules/dbus/iface-client.c new file mode 100644 index 0000000..455ea45 --- /dev/null +++ b/src/modules/dbus/iface-client.c @@ -0,0 +1,459 @@ +/*** + This file is part of PulseAudio. + + Copyright 2009 Tanu Kaskinen + Copyright 2009 Vincent Filali-Ansary + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include +#include + +#include "iface-client.h" + +#define OBJECT_NAME "client" + +struct pa_dbusiface_client { + pa_dbusiface_core *core; + + pa_client *client; + char *path; + pa_proplist *proplist; + + pa_hook_slot *client_proplist_changed_slot; + + pa_dbus_protocol *dbus_protocol; +}; + +static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_driver(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_owner_module(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_playback_streams(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_record_streams(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata); + +static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata); + +static void handle_kill(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_update_properties(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_remove_properties(DBusConnection *conn, DBusMessage *msg, void *userdata); + +enum property_handler_index { + PROPERTY_HANDLER_INDEX, + PROPERTY_HANDLER_DRIVER, + PROPERTY_HANDLER_OWNER_MODULE, + PROPERTY_HANDLER_PLAYBACK_STREAMS, + PROPERTY_HANDLER_RECORD_STREAMS, + PROPERTY_HANDLER_PROPERTY_LIST, + PROPERTY_HANDLER_MAX +}; + +static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = { + [PROPERTY_HANDLER_INDEX] = { .property_name = "Index", .type = "u", .get_cb = handle_get_index, .set_cb = NULL }, + [PROPERTY_HANDLER_DRIVER] = { .property_name = "Driver", .type = "s", .get_cb = handle_get_driver, .set_cb = NULL }, + [PROPERTY_HANDLER_OWNER_MODULE] = { .property_name = "OwnerModule", .type = "o", .get_cb = handle_get_owner_module, .set_cb = NULL }, + [PROPERTY_HANDLER_PLAYBACK_STREAMS] = { .property_name = "PlaybackStreams", .type = "ao", .get_cb = handle_get_playback_streams, .set_cb = NULL }, + [PROPERTY_HANDLER_RECORD_STREAMS] = { .property_name = "RecordStreams", .type = "ao", .get_cb = handle_get_record_streams, .set_cb = NULL }, + [PROPERTY_HANDLER_PROPERTY_LIST] = { .property_name = "PropertyList", .type = "a{say}", .get_cb = handle_get_property_list, .set_cb = NULL } +}; + +enum method_handler_index { + METHOD_HANDLER_KILL, + METHOD_HANDLER_UPDATE_PROPERTIES, + METHOD_HANDLER_REMOVE_PROPERTIES, + METHOD_HANDLER_MAX +}; + +static pa_dbus_arg_info update_properties_args[] = { { "property_list", "a{say}", "in" }, { "update_mode", "u", "in" } }; +static pa_dbus_arg_info remove_properties_args[] = { { "keys", "as", "in" } }; + +static pa_dbus_method_handler method_handlers[METHOD_HANDLER_MAX] = { + [METHOD_HANDLER_KILL] = { + .method_name = "Kill", + .arguments = NULL, + .n_arguments = 0, + .receive_cb = handle_kill }, + [METHOD_HANDLER_UPDATE_PROPERTIES] = { + .method_name = "UpdateProperties", + .arguments = update_properties_args, + .n_arguments = sizeof(update_properties_args) / sizeof(pa_dbus_arg_info), + .receive_cb = handle_update_properties }, + [METHOD_HANDLER_REMOVE_PROPERTIES] = { + .method_name = "RemoveProperties", + .arguments = remove_properties_args, + .n_arguments = sizeof(remove_properties_args) / sizeof(pa_dbus_arg_info), + .receive_cb = handle_remove_properties } +}; + +enum signal_index { + SIGNAL_PROPERTY_LIST_UPDATED, + SIGNAL_CLIENT_EVENT, + SIGNAL_MAX +}; + +static pa_dbus_arg_info property_list_updated_args[] = { { "property_list", "a{say}", NULL } }; +static pa_dbus_arg_info client_event_args[] = { { "name", "s", NULL }, + { "property_list", "a{say}", NULL } }; + +static pa_dbus_signal_info signals[SIGNAL_MAX] = { + [SIGNAL_PROPERTY_LIST_UPDATED] = { .name = "PropertyListUpdated", .arguments = property_list_updated_args, .n_arguments = 1 }, + /* ClientEvent is sent from module-dbus-protocol.c. */ + [SIGNAL_CLIENT_EVENT] = { .name = "ClientEvent", .arguments = client_event_args, .n_arguments = 1 } +}; + +static pa_dbus_interface_info client_interface_info = { + .name = PA_DBUSIFACE_CLIENT_INTERFACE, + .method_handlers = method_handlers, + .n_method_handlers = METHOD_HANDLER_MAX, + .property_handlers = property_handlers, + .n_property_handlers = PROPERTY_HANDLER_MAX, + .get_all_properties_cb = handle_get_all, + .signals = signals, + .n_signals = SIGNAL_MAX +}; + +static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_client *c = userdata; + dbus_uint32_t idx = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + idx = c->client->index; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &idx); +} + +static void handle_get_driver(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_client *c = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &c->client->driver); +} + +static void handle_get_owner_module(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_client *c = userdata; + const char *owner_module = NULL; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + if (!c->client->module) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Client %d doesn't have an owner module.", c->client->index); + return; + } + + owner_module = pa_dbusiface_core_get_module_path(c->core, c->client->module); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &owner_module); +} + +/* The caller frees the array, but not the strings. */ +static const char **get_playback_streams(pa_dbusiface_client *c, unsigned *n) { + const char **playback_streams = NULL; + unsigned i = 0; + uint32_t idx = 0; + pa_sink_input *sink_input = NULL; + + pa_assert(c); + pa_assert(n); + + *n = pa_idxset_size(c->client->sink_inputs); + + if (*n == 0) + return NULL; + + playback_streams = pa_xnew(const char *, *n); + + PA_IDXSET_FOREACH(sink_input, c->client->sink_inputs, idx) + playback_streams[i++] = pa_dbusiface_core_get_playback_stream_path(c->core, sink_input); + + return playback_streams; +} + +static void handle_get_playback_streams(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_client *c = userdata; + const char **playback_streams = NULL; + unsigned n_playback_streams = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + playback_streams = get_playback_streams(c, &n_playback_streams); + + pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, playback_streams, n_playback_streams); + + pa_xfree(playback_streams); +} + +/* The caller frees the array, but not the strings. */ +static const char **get_record_streams(pa_dbusiface_client *c, unsigned *n) { + const char **record_streams = NULL; + unsigned i = 0; + uint32_t idx = 0; + pa_source_output *source_output = NULL; + + pa_assert(c); + pa_assert(n); + + *n = pa_idxset_size(c->client->source_outputs); + + if (*n == 0) + return NULL; + + record_streams = pa_xnew(const char *, *n); + + PA_IDXSET_FOREACH(source_output, c->client->source_outputs, idx) + record_streams[i++] = pa_dbusiface_core_get_record_stream_path(c->core, source_output); + + return record_streams; +} + +static void handle_get_record_streams(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_client *c = userdata; + const char **record_streams = NULL; + unsigned n_record_streams = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + record_streams = get_record_streams(c, &n_record_streams); + + pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, record_streams, n_record_streams); + + pa_xfree(record_streams); +} + +static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_client *c = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + pa_dbus_send_proplist_variant_reply(conn, msg, c->client->proplist); +} + +static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_client *c = userdata; + DBusMessage *reply = NULL; + DBusMessageIter msg_iter; + DBusMessageIter dict_iter; + dbus_uint32_t idx = 0; + const char *owner_module = NULL; + const char **playback_streams = NULL; + unsigned n_playback_streams = 0; + const char **record_streams = NULL; + unsigned n_record_streams = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + idx = c->client->index; + if (c->client->module) + owner_module = pa_dbusiface_core_get_module_path(c->core, c->client->module); + playback_streams = get_playback_streams(c, &n_playback_streams); + record_streams = get_record_streams(c, &n_record_streams); + + pa_assert_se((reply = dbus_message_new_method_return(msg))); + + dbus_message_iter_init_append(reply, &msg_iter); + pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter)); + + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_INDEX].property_name, DBUS_TYPE_UINT32, &idx); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DRIVER].property_name, DBUS_TYPE_STRING, &c->client->driver); + + if (owner_module) + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_OWNER_MODULE].property_name, DBUS_TYPE_OBJECT_PATH, &owner_module); + + pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PLAYBACK_STREAMS].property_name, DBUS_TYPE_OBJECT_PATH, playback_streams, n_playback_streams); + pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_RECORD_STREAMS].property_name, DBUS_TYPE_OBJECT_PATH, record_streams, n_record_streams); + pa_dbus_append_proplist_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PROPERTY_LIST].property_name, c->client->proplist); + + pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter)); + + pa_assert_se(dbus_connection_send(conn, reply, NULL)); + + dbus_message_unref(reply); + + pa_xfree(playback_streams); + pa_xfree(record_streams); +} + +static void handle_kill(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_client *c = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + dbus_connection_ref(conn); + + pa_client_kill(c->client); + + pa_dbus_send_empty_reply(conn, msg); + + dbus_connection_unref(conn); +} + +static void handle_update_properties(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_client *c = userdata; + DBusMessageIter msg_iter; + pa_proplist *property_list = NULL; + dbus_uint32_t update_mode = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + if (pa_dbus_protocol_get_client(c->dbus_protocol, conn) != c->client) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_ACCESS_DENIED, "Client tried to modify the property list of another client."); + return; + } + + pa_assert_se(dbus_message_iter_init(msg, &msg_iter)); + + if (!(property_list = pa_dbus_get_proplist_arg(conn, msg, &msg_iter))) + return; + + dbus_message_iter_get_basic(&msg_iter, &update_mode); + + if (!(update_mode == PA_UPDATE_SET || update_mode == PA_UPDATE_MERGE || update_mode == PA_UPDATE_REPLACE)) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid update mode: %u", update_mode); + goto finish; + } + + pa_client_update_proplist(c->client, update_mode, property_list); + + pa_dbus_send_empty_reply(conn, msg); + +finish: + if (property_list) + pa_proplist_free(property_list); +} + +static void handle_remove_properties(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_client *c = userdata; + char **keys = NULL; + int n_keys = 0; + bool changed = false; + int i = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + if (pa_dbus_protocol_get_client(c->dbus_protocol, conn) != c->client) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_ACCESS_DENIED, "Client tried to modify the property list of another client."); + return; + } + + pa_assert_se(dbus_message_get_args(msg, NULL, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &keys, &n_keys, DBUS_TYPE_INVALID)); + + for (i = 0; i < n_keys; ++i) + changed |= pa_proplist_unset(c->client->proplist, keys[i]) >= 0; + + pa_dbus_send_empty_reply(conn, msg); + + if (changed) { + pa_hook_fire(&c->client->core->hooks[PA_CORE_HOOK_CLIENT_PROPLIST_CHANGED], c->client); + pa_subscription_post(c->client->core, PA_SUBSCRIPTION_EVENT_CLIENT|PA_SUBSCRIPTION_EVENT_CHANGE, c->client->index); + } + + dbus_free_string_array(keys); +} + +static pa_hook_result_t client_proplist_changed_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_client *c = slot_data; + pa_client *client = call_data; + DBusMessage *signal_msg; + + pa_assert(c); + pa_assert(client); + + if (c->client != client) + return PA_HOOK_OK; + + if (!pa_proplist_equal(c->proplist, c->client->proplist)) { + DBusMessageIter msg_iter; + + pa_proplist_update(c->proplist, PA_UPDATE_SET, c->client->proplist); + + pa_assert_se(signal_msg = dbus_message_new_signal(c->path, + PA_DBUSIFACE_CLIENT_INTERFACE, + signals[SIGNAL_PROPERTY_LIST_UPDATED].name)); + dbus_message_iter_init_append(signal_msg, &msg_iter); + pa_dbus_append_proplist(&msg_iter, c->proplist); + + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + } + + return PA_HOOK_OK; +} + +pa_dbusiface_client *pa_dbusiface_client_new(pa_dbusiface_core *core, pa_client *client) { + pa_dbusiface_client *c = NULL; + + pa_assert(core); + pa_assert(client); + + c = pa_xnew(pa_dbusiface_client, 1); + c->core = core; + c->client = client; + c->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, OBJECT_NAME, client->index); + c->proplist = pa_proplist_copy(client->proplist); + c->dbus_protocol = pa_dbus_protocol_get(client->core); + c->client_proplist_changed_slot = pa_hook_connect(&client->core->hooks[PA_CORE_HOOK_CLIENT_PROPLIST_CHANGED], + PA_HOOK_NORMAL, client_proplist_changed_cb, c); + + pa_assert_se(pa_dbus_protocol_add_interface(c->dbus_protocol, c->path, &client_interface_info, c) >= 0); + + return c; +} + +void pa_dbusiface_client_free(pa_dbusiface_client *c) { + pa_assert(c); + + pa_assert_se(pa_dbus_protocol_remove_interface(c->dbus_protocol, c->path, client_interface_info.name) >= 0); + + pa_hook_slot_free(c->client_proplist_changed_slot); + pa_proplist_free(c->proplist); + pa_dbus_protocol_unref(c->dbus_protocol); + + pa_xfree(c->path); + pa_xfree(c); +} + +const char *pa_dbusiface_client_get_path(pa_dbusiface_client *c) { + pa_assert(c); + + return c->path; +} diff --git a/src/modules/dbus/iface-client.h b/src/modules/dbus/iface-client.h new file mode 100644 index 0000000..7fef3f5 --- /dev/null +++ b/src/modules/dbus/iface-client.h @@ -0,0 +1,43 @@ +#ifndef foodbusifaceclienthfoo +#define foodbusifaceclienthfoo + +/*** + This file is part of PulseAudio. + + Copyright 2009 Tanu Kaskinen + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +/* This object implements the D-Bus interface org.PulseAudio.Core1.Client. + * + * See http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/Developer/Clients/DBus/Client/ + * for the Client interface documentation. + */ + +#include +#include + +#include "iface-core.h" + +#define PA_DBUSIFACE_CLIENT_INTERFACE PA_DBUS_CORE_INTERFACE ".Client" + +typedef struct pa_dbusiface_client pa_dbusiface_client; + +pa_dbusiface_client *pa_dbusiface_client_new(pa_dbusiface_core *core, pa_client *client); +void pa_dbusiface_client_free(pa_dbusiface_client *c); + +const char *pa_dbusiface_client_get_path(pa_dbusiface_client *c); + +#endif diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c new file mode 100644 index 0000000..5229c04 --- /dev/null +++ b/src/modules/dbus/iface-core.c @@ -0,0 +1,2413 @@ +/*** + This file is part of PulseAudio. + + Copyright 2009 Tanu Kaskinen + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "iface-card.h" +#include "iface-client.h" +#include "iface-device.h" +#include "iface-memstats.h" +#include "iface-module.h" +#include "iface-sample.h" +#include "iface-stream.h" + +#include "iface-core.h" + +#define INTERFACE_REVISION 0 + +static void handle_get_interface_revision(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_version(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_is_local(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_username(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_hostname(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_default_channels(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_set_default_channels(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata); +static void handle_get_default_sample_format(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_set_default_sample_format(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata); +static void handle_get_default_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_set_default_sample_rate(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata); +static void handle_get_alternate_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_set_alternate_sample_rate(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata); +static void handle_get_cards(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_sinks(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_fallback_sink(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_set_fallback_sink(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata); +static void handle_get_sources(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_fallback_source(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_set_fallback_source(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata); +static void handle_get_playback_streams(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_record_streams(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_samples(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_modules(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_clients(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_my_client(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_extensions(DBusConnection *conn, DBusMessage *msg, void *userdata); + +static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata); + +static void handle_get_card_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_sink_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_source_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_sample_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_upload_sample(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_load_module(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_exit(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_listen_for_signal(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_stop_listening_for_signal(DBusConnection *conn, DBusMessage *msg, void *userdata); + +struct pa_dbusiface_core { + pa_core *core; + + pa_dbus_protocol *dbus_protocol; + + pa_hashmap *cards; + pa_hashmap *sinks_by_index; + pa_hashmap *sinks_by_path; + pa_hashmap *sources_by_index; + pa_hashmap *sources_by_path; + pa_hashmap *playback_streams; + pa_hashmap *record_streams; + pa_hashmap *samples; + pa_hashmap *modules; + pa_hashmap *clients; + + pa_sink *fallback_sink; + pa_source *fallback_source; + + pa_hook_slot *module_new_slot; + pa_hook_slot *module_removed_slot; + pa_hook_slot *default_sink_changed_slot; + pa_hook_slot *default_source_changed_slot; + pa_hook_slot *sample_cache_new_slot; + pa_hook_slot *sample_cache_removed_slot; + pa_hook_slot *card_put_slot; + pa_hook_slot *card_unlink_slot; + pa_hook_slot *sink_input_put_slot; + pa_hook_slot *sink_input_unlink_slot; + pa_hook_slot *source_output_put_slot; + pa_hook_slot *source_output_unlink_slot; + pa_hook_slot *client_put_slot; + pa_hook_slot *client_unlink_slot; + pa_hook_slot *sink_put_slot; + pa_hook_slot *sink_unlink_slot; + pa_hook_slot *source_put_slot; + pa_hook_slot *source_unlink_slot; + pa_hook_slot *extension_registered_slot; + pa_hook_slot *extension_unregistered_slot; + + pa_dbusiface_memstats *memstats; +}; + +enum property_handler_index { + PROPERTY_HANDLER_INTERFACE_REVISION, + PROPERTY_HANDLER_NAME, + PROPERTY_HANDLER_VERSION, + PROPERTY_HANDLER_IS_LOCAL, + PROPERTY_HANDLER_USERNAME, + PROPERTY_HANDLER_HOSTNAME, + PROPERTY_HANDLER_DEFAULT_CHANNELS, + PROPERTY_HANDLER_DEFAULT_SAMPLE_FORMAT, + PROPERTY_HANDLER_DEFAULT_SAMPLE_RATE, + PROPERTY_HANDLER_ALTERNATE_SAMPLE_RATE, + PROPERTY_HANDLER_CARDS, + PROPERTY_HANDLER_SINKS, + PROPERTY_HANDLER_FALLBACK_SINK, + PROPERTY_HANDLER_SOURCES, + PROPERTY_HANDLER_FALLBACK_SOURCE, + PROPERTY_HANDLER_PLAYBACK_STREAMS, + PROPERTY_HANDLER_RECORD_STREAMS, + PROPERTY_HANDLER_SAMPLES, + PROPERTY_HANDLER_MODULES, + PROPERTY_HANDLER_CLIENTS, + PROPERTY_HANDLER_MY_CLIENT, + PROPERTY_HANDLER_EXTENSIONS, + PROPERTY_HANDLER_MAX +}; + +static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = { + [PROPERTY_HANDLER_INTERFACE_REVISION] = { .property_name = "InterfaceRevision", .type = "u", .get_cb = handle_get_interface_revision, .set_cb = NULL }, + [PROPERTY_HANDLER_NAME] = { .property_name = "Name", .type = "s", .get_cb = handle_get_name, .set_cb = NULL }, + [PROPERTY_HANDLER_VERSION] = { .property_name = "Version", .type = "s", .get_cb = handle_get_version, .set_cb = NULL }, + [PROPERTY_HANDLER_IS_LOCAL] = { .property_name = "IsLocal", .type = "b", .get_cb = handle_get_is_local, .set_cb = NULL }, + [PROPERTY_HANDLER_USERNAME] = { .property_name = "Username", .type = "s", .get_cb = handle_get_username, .set_cb = NULL }, + [PROPERTY_HANDLER_HOSTNAME] = { .property_name = "Hostname", .type = "s", .get_cb = handle_get_hostname, .set_cb = NULL }, + [PROPERTY_HANDLER_DEFAULT_CHANNELS] = { .property_name = "DefaultChannels", .type = "au", .get_cb = handle_get_default_channels, .set_cb = handle_set_default_channels }, + [PROPERTY_HANDLER_DEFAULT_SAMPLE_FORMAT] = { .property_name = "DefaultSampleFormat", .type = "u", .get_cb = handle_get_default_sample_format, .set_cb = handle_set_default_sample_format }, + [PROPERTY_HANDLER_DEFAULT_SAMPLE_RATE] = { .property_name = "DefaultSampleRate", .type = "u", .get_cb = handle_get_default_sample_rate, .set_cb = handle_set_default_sample_rate }, + [PROPERTY_HANDLER_ALTERNATE_SAMPLE_RATE] = { .property_name = "AlternateSampleRate", .type = "u", .get_cb = handle_get_alternate_sample_rate, .set_cb = handle_set_alternate_sample_rate }, + [PROPERTY_HANDLER_CARDS] = { .property_name = "Cards", .type = "ao", .get_cb = handle_get_cards, .set_cb = NULL }, + [PROPERTY_HANDLER_SINKS] = { .property_name = "Sinks", .type = "ao", .get_cb = handle_get_sinks, .set_cb = NULL }, + [PROPERTY_HANDLER_FALLBACK_SINK] = { .property_name = "FallbackSink", .type = "o", .get_cb = handle_get_fallback_sink, .set_cb = handle_set_fallback_sink }, + [PROPERTY_HANDLER_SOURCES] = { .property_name = "Sources", .type = "ao", .get_cb = handle_get_sources, .set_cb = NULL }, + [PROPERTY_HANDLER_FALLBACK_SOURCE] = { .property_name = "FallbackSource", .type = "o", .get_cb = handle_get_fallback_source, .set_cb = handle_set_fallback_source }, + [PROPERTY_HANDLER_PLAYBACK_STREAMS] = { .property_name = "PlaybackStreams", .type = "ao", .get_cb = handle_get_playback_streams, .set_cb = NULL }, + [PROPERTY_HANDLER_RECORD_STREAMS] = { .property_name = "RecordStreams", .type = "ao", .get_cb = handle_get_record_streams, .set_cb = NULL }, + [PROPERTY_HANDLER_SAMPLES] = { .property_name = "Samples", .type = "ao", .get_cb = handle_get_samples, .set_cb = NULL }, + [PROPERTY_HANDLER_MODULES] = { .property_name = "Modules", .type = "ao", .get_cb = handle_get_modules, .set_cb = NULL }, + [PROPERTY_HANDLER_CLIENTS] = { .property_name = "Clients", .type = "ao", .get_cb = handle_get_clients, .set_cb = NULL }, + [PROPERTY_HANDLER_MY_CLIENT] = { .property_name = "MyClient", .type = "o", .get_cb = handle_get_my_client, .set_cb = NULL }, + [PROPERTY_HANDLER_EXTENSIONS] = { .property_name = "Extensions", .type = "as", .get_cb = handle_get_extensions, .set_cb = NULL } +}; + +enum method_handler_index { + METHOD_HANDLER_GET_CARD_BY_NAME, + METHOD_HANDLER_GET_SINK_BY_NAME, + METHOD_HANDLER_GET_SOURCE_BY_NAME, + METHOD_HANDLER_GET_SAMPLE_BY_NAME, + METHOD_HANDLER_UPLOAD_SAMPLE, + METHOD_HANDLER_LOAD_MODULE, + METHOD_HANDLER_EXIT, + METHOD_HANDLER_LISTEN_FOR_SIGNAL, + METHOD_HANDLER_STOP_LISTENING_FOR_SIGNAL, + METHOD_HANDLER_MAX +}; + +static pa_dbus_arg_info get_card_by_name_args[] = { { "name", "s", "in" }, { "card", "o", "out" } }; +static pa_dbus_arg_info get_sink_by_name_args[] = { { "name", "s", "in" }, { "sink", "o", "out" } }; +static pa_dbus_arg_info get_source_by_name_args[] = { { "name", "s", "in" }, { "source", "o", "out" } }; +static pa_dbus_arg_info get_sample_by_name_args[] = { { "name", "s", "in" }, { "sample", "o", "out" } }; +static pa_dbus_arg_info upload_sample_args[] = { { "name", "s", "in" }, + { "sample_format", "u", "in" }, + { "sample_rate", "u", "in" }, + { "channels", "au", "in" }, + { "default_volume", "au", "in" }, + { "property_list", "a{say}", "in" }, + { "data", "ay", "in" }, + { "sample", "o", "out" } }; +static pa_dbus_arg_info load_module_args[] = { { "name", "s", "in" }, { "arguments", "a{ss}", "in" }, { "module", "o", "out" } }; +static pa_dbus_arg_info listen_for_signal_args[] = { { "signal", "s", "in" }, { "objects", "ao", "in" } }; +static pa_dbus_arg_info stop_listening_for_signal_args[] = { { "signal", "s", "in" } }; + +static pa_dbus_method_handler method_handlers[METHOD_HANDLER_MAX] = { + [METHOD_HANDLER_GET_CARD_BY_NAME] = { + .method_name = "GetCardByName", + .arguments = get_card_by_name_args, + .n_arguments = sizeof(get_card_by_name_args) / sizeof(pa_dbus_arg_info), + .receive_cb = handle_get_card_by_name }, + [METHOD_HANDLER_GET_SINK_BY_NAME] = { + .method_name = "GetSinkByName", + .arguments = get_sink_by_name_args, + .n_arguments = sizeof(get_sink_by_name_args) / sizeof(pa_dbus_arg_info), + .receive_cb = handle_get_sink_by_name }, + [METHOD_HANDLER_GET_SOURCE_BY_NAME] = { + .method_name = "GetSourceByName", + .arguments = get_source_by_name_args, + .n_arguments = sizeof(get_source_by_name_args) / sizeof(pa_dbus_arg_info), + .receive_cb = handle_get_source_by_name }, + [METHOD_HANDLER_GET_SAMPLE_BY_NAME] = { + .method_name = "GetSampleByName", + .arguments = get_sample_by_name_args, + .n_arguments = sizeof(get_sample_by_name_args) / sizeof(pa_dbus_arg_info), + .receive_cb = handle_get_sample_by_name }, + [METHOD_HANDLER_UPLOAD_SAMPLE] = { + .method_name = "UploadSample", + .arguments = upload_sample_args, + .n_arguments = sizeof(upload_sample_args) / sizeof(pa_dbus_arg_info), + .receive_cb = handle_upload_sample }, + [METHOD_HANDLER_LOAD_MODULE] = { + .method_name = "LoadModule", + .arguments = load_module_args, + .n_arguments = sizeof(load_module_args) / sizeof(pa_dbus_arg_info), + .receive_cb = handle_load_module }, + [METHOD_HANDLER_EXIT] = { + .method_name = "Exit", + .arguments = NULL, + .n_arguments = 0, + .receive_cb = handle_exit }, + [METHOD_HANDLER_LISTEN_FOR_SIGNAL] = { + .method_name = "ListenForSignal", + .arguments = listen_for_signal_args, + .n_arguments = sizeof(listen_for_signal_args) / sizeof(pa_dbus_arg_info), + .receive_cb = handle_listen_for_signal }, + [METHOD_HANDLER_STOP_LISTENING_FOR_SIGNAL] = { + .method_name = "StopListeningForSignal", + .arguments = stop_listening_for_signal_args, + .n_arguments = sizeof(stop_listening_for_signal_args) / sizeof(pa_dbus_arg_info), + .receive_cb = handle_stop_listening_for_signal } +}; + +enum signal_index { + SIGNAL_NEW_CARD, + SIGNAL_CARD_REMOVED, + SIGNAL_NEW_SINK, + SIGNAL_SINK_REMOVED, + SIGNAL_FALLBACK_SINK_UPDATED, + SIGNAL_FALLBACK_SINK_UNSET, + SIGNAL_NEW_SOURCE, + SIGNAL_SOURCE_REMOVED, + SIGNAL_FALLBACK_SOURCE_UPDATED, + SIGNAL_FALLBACK_SOURCE_UNSET, + SIGNAL_NEW_PLAYBACK_STREAM, + SIGNAL_PLAYBACK_STREAM_REMOVED, + SIGNAL_NEW_RECORD_STREAM, + SIGNAL_RECORD_STREAM_REMOVED, + SIGNAL_NEW_SAMPLE, + SIGNAL_SAMPLE_REMOVED, + SIGNAL_NEW_MODULE, + SIGNAL_MODULE_REMOVED, + SIGNAL_NEW_CLIENT, + SIGNAL_CLIENT_REMOVED, + SIGNAL_NEW_EXTENSION, + SIGNAL_EXTENSION_REMOVED, + SIGNAL_MAX +}; + +static pa_dbus_arg_info new_card_args[] = { { "card", "o", NULL } }; +static pa_dbus_arg_info card_removed_args[] = { { "card", "o", NULL } }; +static pa_dbus_arg_info new_sink_args[] = { { "sink", "o", NULL } }; +static pa_dbus_arg_info sink_removed_args[] = { { "sink", "o", NULL } }; +static pa_dbus_arg_info fallback_sink_updated_args[] = { { "sink", "o", NULL } }; +static pa_dbus_arg_info new_source_args[] = { { "source", "o", NULL } }; +static pa_dbus_arg_info source_removed_args[] = { { "source", "o", NULL } }; +static pa_dbus_arg_info fallback_source_updated_args[] = { { "source", "o", NULL } }; +static pa_dbus_arg_info new_playback_stream_args[] = { { "playback_stream", "o", NULL } }; +static pa_dbus_arg_info playback_stream_removed_args[] = { { "playback_stream", "o", NULL } }; +static pa_dbus_arg_info new_record_stream_args[] = { { "record_stream", "o", NULL } }; +static pa_dbus_arg_info record_stream_removed_args[] = { { "record_stream", "o", NULL } }; +static pa_dbus_arg_info new_sample_args[] = { { "sample", "o", NULL } }; +static pa_dbus_arg_info sample_removed_args[] = { { "sample", "o", NULL } }; +static pa_dbus_arg_info new_module_args[] = { { "module", "o", NULL } }; +static pa_dbus_arg_info module_removed_args[] = { { "module", "o", NULL } }; +static pa_dbus_arg_info new_client_args[] = { { "client", "o", NULL } }; +static pa_dbus_arg_info client_removed_args[] = { { "client", "o", NULL } }; +static pa_dbus_arg_info new_extension_args[] = { { "extension", "s", NULL } }; +static pa_dbus_arg_info extension_removed_args[] = { { "extension", "s", NULL } }; + +static pa_dbus_signal_info signals[SIGNAL_MAX] = { + [SIGNAL_NEW_CARD] = { .name = "NewCard", .arguments = new_card_args, .n_arguments = 1 }, + [SIGNAL_CARD_REMOVED] = { .name = "CardRemoved", .arguments = card_removed_args, .n_arguments = 1 }, + [SIGNAL_NEW_SINK] = { .name = "NewSink", .arguments = new_sink_args, .n_arguments = 1 }, + [SIGNAL_SINK_REMOVED] = { .name = "SinkRemoved", .arguments = sink_removed_args, .n_arguments = 1 }, + [SIGNAL_FALLBACK_SINK_UPDATED] = { .name = "FallbackSinkUpdated", .arguments = fallback_sink_updated_args, .n_arguments = 1 }, + [SIGNAL_FALLBACK_SINK_UNSET] = { .name = "FallbackSinkUnset", .arguments = NULL, .n_arguments = 0 }, + [SIGNAL_NEW_SOURCE] = { .name = "NewSource", .arguments = new_source_args, .n_arguments = 1 }, + [SIGNAL_SOURCE_REMOVED] = { .name = "SourceRemoved", .arguments = source_removed_args, .n_arguments = 1 }, + [SIGNAL_FALLBACK_SOURCE_UPDATED] = { .name = "FallbackSourceUpdated", .arguments = fallback_source_updated_args, .n_arguments = 1 }, + [SIGNAL_FALLBACK_SOURCE_UNSET] = { .name = "FallbackSourceUnset", .arguments = NULL, .n_arguments = 0 }, + [SIGNAL_NEW_PLAYBACK_STREAM] = { .name = "NewPlaybackStream", .arguments = new_playback_stream_args, .n_arguments = 1 }, + [SIGNAL_PLAYBACK_STREAM_REMOVED] = { .name = "PlaybackStreamRemoved", .arguments = playback_stream_removed_args, .n_arguments = 1 }, + [SIGNAL_NEW_RECORD_STREAM] = { .name = "NewRecordStream", .arguments = new_record_stream_args, .n_arguments = 1 }, + [SIGNAL_RECORD_STREAM_REMOVED] = { .name = "RecordStreamRemoved", .arguments = record_stream_removed_args, .n_arguments = 1 }, + [SIGNAL_NEW_SAMPLE] = { .name = "NewSample", .arguments = new_sample_args, .n_arguments = 1 }, + [SIGNAL_SAMPLE_REMOVED] = { .name = "SampleRemoved", .arguments = sample_removed_args, .n_arguments = 1 }, + [SIGNAL_NEW_MODULE] = { .name = "NewModule", .arguments = new_module_args, .n_arguments = 1 }, + [SIGNAL_MODULE_REMOVED] = { .name = "ModuleRemoved", .arguments = module_removed_args, .n_arguments = 1 }, + [SIGNAL_NEW_CLIENT] = { .name = "NewClient", .arguments = new_client_args, .n_arguments = 1 }, + [SIGNAL_CLIENT_REMOVED] = { .name = "ClientRemoved", .arguments = client_removed_args, .n_arguments = 1 }, + [SIGNAL_NEW_EXTENSION] = { .name = "NewExtension", .arguments = new_extension_args, .n_arguments = 1 }, + [SIGNAL_EXTENSION_REMOVED] = { .name = "ExtensionRemoved", .arguments = extension_removed_args, .n_arguments = 1 } +}; + +static pa_dbus_interface_info core_interface_info = { + .name = PA_DBUS_CORE_INTERFACE, + .method_handlers = method_handlers, + .n_method_handlers = METHOD_HANDLER_MAX, + .property_handlers = property_handlers, + .n_property_handlers = PROPERTY_HANDLER_MAX, + .get_all_properties_cb = handle_get_all, + .signals = signals, + .n_signals = SIGNAL_MAX +}; + +static void handle_get_interface_revision(DBusConnection *conn, DBusMessage *msg, void *userdata) { + dbus_uint32_t interface_revision = INTERFACE_REVISION; + + pa_assert(conn); + pa_assert(msg); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &interface_revision); +} + +static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata) { + const char *server_name = PACKAGE_NAME; + + pa_assert(conn); + pa_assert(msg); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &server_name); +} + +static void handle_get_version(DBusConnection *conn, DBusMessage *msg, void *userdata) { + const char *version = PACKAGE_VERSION; + + pa_assert(conn); + pa_assert(msg); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &version); +} + +static dbus_bool_t get_is_local(DBusConnection *conn) { + int conn_fd; + + pa_assert(conn); + + if (!dbus_connection_get_socket(conn, &conn_fd)) + return FALSE; + + return pa_socket_is_local(conn_fd); +} + +static void handle_get_is_local(DBusConnection *conn, DBusMessage *msg, void *userdata) { + dbus_bool_t is_local; + + pa_assert(conn); + pa_assert(msg); + + is_local = get_is_local(conn); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &is_local); +} + +static void handle_get_username(DBusConnection *conn, DBusMessage *msg, void *userdata) { + char *username = NULL; + + pa_assert(conn); + pa_assert(msg); + + username = pa_get_user_name_malloc(); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &username); + + pa_xfree(username); +} + +static void handle_get_hostname(DBusConnection *conn, DBusMessage *msg, void *userdata) { + char *hostname = NULL; + + pa_assert(conn); + pa_assert(msg); + + hostname = pa_get_host_name_malloc(); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &hostname); + + pa_xfree(hostname); +} + +/* Caller frees the returned array. */ +static dbus_uint32_t *get_default_channels(pa_dbusiface_core *c, unsigned *n) { + dbus_uint32_t *default_channels = NULL; + unsigned i; + + pa_assert(c); + pa_assert(n); + + *n = c->core->default_channel_map.channels; + default_channels = pa_xnew(dbus_uint32_t, *n); + + for (i = 0; i < *n; ++i) + default_channels[i] = c->core->default_channel_map.map[i]; + + return default_channels; +} + +static void handle_get_default_channels(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + dbus_uint32_t *default_channels = NULL; + unsigned n; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + default_channels = get_default_channels(c, &n); + + pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_UINT32, default_channels, n); + + pa_xfree(default_channels); +} + +static void handle_set_default_channels(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) { + pa_dbusiface_core *c = userdata; + DBusMessageIter array_iter; + pa_channel_map new_channel_map; + const dbus_uint32_t *default_channels; + int n_channels; + unsigned i; + + pa_assert(conn); + pa_assert(msg); + pa_assert(iter); + pa_assert(c); + + pa_channel_map_init(&new_channel_map); + + dbus_message_iter_recurse(iter, &array_iter); + dbus_message_iter_get_fixed_array(&array_iter, &default_channels, &n_channels); + + if (n_channels <= 0) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Empty channel array."); + return; + } + + if (n_channels > (int) PA_CHANNELS_MAX) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, + "Too many channels: %i. The maximum number of channels is %u.", n_channels, PA_CHANNELS_MAX); + return; + } + + new_channel_map.channels = n_channels; + + for (i = 0; i < new_channel_map.channels; ++i) { + if (default_channels[i] >= PA_CHANNEL_POSITION_MAX) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid channel position: %u.", default_channels[i]); + return; + } + + new_channel_map.map[i] = default_channels[i]; + } + + c->core->default_channel_map = new_channel_map; + c->core->default_sample_spec.channels = n_channels; + + pa_dbus_send_empty_reply(conn, msg); +} + +static void handle_get_default_sample_format(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + dbus_uint32_t default_sample_format; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + default_sample_format = c->core->default_sample_spec.format; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &default_sample_format); +} + +static void handle_set_default_sample_format(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) { + pa_dbusiface_core *c = userdata; + dbus_uint32_t default_sample_format; + + pa_assert(conn); + pa_assert(msg); + pa_assert(iter); + pa_assert(c); + + dbus_message_iter_get_basic(iter, &default_sample_format); + + if (!pa_sample_format_valid(default_sample_format)) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid sample format."); + return; + } + + c->core->default_sample_spec.format = default_sample_format; + + pa_dbus_send_empty_reply(conn, msg); +} + +static void handle_get_default_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + dbus_uint32_t default_sample_rate; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + default_sample_rate = c->core->default_sample_spec.rate; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &default_sample_rate); +} + +static void handle_set_default_sample_rate(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) { + pa_dbusiface_core *c = userdata; + dbus_uint32_t default_sample_rate; + + pa_assert(conn); + pa_assert(msg); + pa_assert(iter); + pa_assert(c); + + dbus_message_iter_get_basic(iter, &default_sample_rate); + + if (!pa_sample_rate_valid(default_sample_rate)) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid sample rate."); + return; + } + + c->core->default_sample_spec.rate = default_sample_rate; + + pa_dbus_send_empty_reply(conn, msg); +} + +static void handle_get_alternate_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + dbus_uint32_t alternate_sample_rate; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + alternate_sample_rate = c->core->alternate_sample_rate; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &alternate_sample_rate); +} + +static void handle_set_alternate_sample_rate(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) { + pa_dbusiface_core *c = userdata; + dbus_uint32_t alternate_sample_rate; + + pa_assert(conn); + pa_assert(msg); + pa_assert(iter); + pa_assert(c); + + dbus_message_iter_get_basic(iter, &alternate_sample_rate); + + if (!pa_sample_rate_valid(alternate_sample_rate)) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid sample rate."); + return; + } + + c->core->alternate_sample_rate = alternate_sample_rate; + + pa_dbus_send_empty_reply(conn, msg); +} + +/* The caller frees the array, but not the strings. */ +static const char **get_cards(pa_dbusiface_core *c, unsigned *n) { + const char **cards; + unsigned i = 0; + void *state = NULL; + pa_dbusiface_card *card; + + pa_assert(c); + pa_assert(n); + + *n = pa_hashmap_size(c->cards); + + if (*n == 0) + return NULL; + + cards = pa_xnew(const char *, *n); + + PA_HASHMAP_FOREACH(card, c->cards, state) + cards[i++] = pa_dbusiface_card_get_path(card); + + return cards; +} + +static void handle_get_cards(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + const char **cards; + unsigned n; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + cards = get_cards(c, &n); + + pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, cards, n); + + pa_xfree(cards); +} + +/* The caller frees the array, but not the strings. */ +static const char **get_sinks(pa_dbusiface_core *c, unsigned *n) { + const char **sinks; + unsigned i = 0; + void *state = NULL; + pa_dbusiface_device *sink; + + pa_assert(c); + pa_assert(n); + + *n = pa_hashmap_size(c->sinks_by_index); + + if (*n == 0) + return NULL; + + sinks = pa_xnew(const char *, *n); + + PA_HASHMAP_FOREACH(sink, c->sinks_by_index, state) + sinks[i++] = pa_dbusiface_device_get_path(sink); + + return sinks; +} + +static void handle_get_sinks(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + const char **sinks; + unsigned n; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + sinks = get_sinks(c, &n); + + pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, sinks, n); + + pa_xfree(sinks); +} + +static void handle_get_fallback_sink(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + pa_dbusiface_device *fallback_sink; + const char *object_path; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + if (!c->fallback_sink) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, + "There are no sinks, and therefore no fallback sink either."); + return; + } + + pa_assert_se((fallback_sink = pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(c->fallback_sink->index)))); + object_path = pa_dbusiface_device_get_path(fallback_sink); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path); +} + +static void handle_set_fallback_sink(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) { + pa_dbusiface_core *c = userdata; + pa_dbusiface_device *fallback_sink; + const char *object_path; + + pa_assert(conn); + pa_assert(msg); + pa_assert(iter); + pa_assert(c); + + if (!c->fallback_sink) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, + "There are no sinks, and therefore no fallback sink either."); + return; + } + + dbus_message_iter_get_basic(iter, &object_path); + + if (!(fallback_sink = pa_hashmap_get(c->sinks_by_path, object_path))) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such sink.", object_path); + return; + } + + pa_core_set_configured_default_sink(c->core, pa_dbusiface_device_get_sink(fallback_sink)->name); + + pa_dbus_send_empty_reply(conn, msg); +} + +/* The caller frees the array, but not the strings. */ +static const char **get_sources(pa_dbusiface_core *c, unsigned *n) { + const char **sources; + unsigned i = 0; + void *state = NULL; + pa_dbusiface_device *source; + + pa_assert(c); + pa_assert(n); + + *n = pa_hashmap_size(c->sources_by_index); + + if (*n == 0) + return NULL; + + sources = pa_xnew(const char *, *n); + + PA_HASHMAP_FOREACH(source, c->sources_by_index, state) + sources[i++] = pa_dbusiface_device_get_path(source); + + return sources; +} + +static void handle_get_sources(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + const char **sources; + unsigned n; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + sources = get_sources(c, &n); + + pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, sources, n); + + pa_xfree(sources); +} + +static void handle_get_fallback_source(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + pa_dbusiface_device *fallback_source; + const char *object_path; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + if (!c->fallback_source) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, + "There are no sources, and therefore no fallback source either."); + return; + } + + pa_assert_se((fallback_source = pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(c->fallback_source->index)))); + object_path = pa_dbusiface_device_get_path(fallback_source); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path); +} + +static void handle_set_fallback_source(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) { + pa_dbusiface_core *c = userdata; + pa_dbusiface_device *fallback_source; + const char *object_path; + + pa_assert(conn); + pa_assert(msg); + pa_assert(iter); + pa_assert(c); + + if (!c->fallback_source) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, + "There are no sources, and therefore no fallback source either."); + return; + } + + dbus_message_iter_get_basic(iter, &object_path); + + if (!(fallback_source = pa_hashmap_get(c->sources_by_path, object_path))) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such source.", object_path); + return; + } + + pa_core_set_configured_default_source(c->core, pa_dbusiface_device_get_source(fallback_source)->name); + + pa_dbus_send_empty_reply(conn, msg); +} + +/* The caller frees the array, but not the strings. */ +static const char **get_playback_streams(pa_dbusiface_core *c, unsigned *n) { + const char **streams; + unsigned i = 0; + void *state = NULL; + pa_dbusiface_stream *stream; + + pa_assert(c); + pa_assert(n); + + *n = pa_hashmap_size(c->playback_streams); + + if (*n == 0) + return NULL; + + streams = pa_xnew(const char *, *n); + + PA_HASHMAP_FOREACH(stream, c->playback_streams, state) + streams[i++] = pa_dbusiface_stream_get_path(stream); + + return streams; +} + +static void handle_get_playback_streams(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + const char **playback_streams; + unsigned n; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + playback_streams = get_playback_streams(c, &n); + + pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, playback_streams, n); + + pa_xfree(playback_streams); +} + +/* The caller frees the array, but not the strings. */ +static const char **get_record_streams(pa_dbusiface_core *c, unsigned *n) { + const char **streams; + unsigned i = 0; + void *state = NULL; + pa_dbusiface_stream *stream; + + pa_assert(c); + pa_assert(n); + + *n = pa_hashmap_size(c->record_streams); + + if (*n == 0) + return NULL; + + streams = pa_xnew(const char *, *n); + + PA_HASHMAP_FOREACH(stream, c->record_streams, state) + streams[i++] = pa_dbusiface_stream_get_path(stream); + + return streams; +} + +static void handle_get_record_streams(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + const char **record_streams; + unsigned n; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + record_streams = get_record_streams(c, &n); + + pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, record_streams, n); + + pa_xfree(record_streams); +} + +/* The caller frees the array, but not the strings. */ +static const char **get_samples(pa_dbusiface_core *c, unsigned *n) { + const char **samples; + unsigned i = 0; + void *state = NULL; + pa_dbusiface_sample *sample; + + pa_assert(c); + pa_assert(n); + + *n = pa_hashmap_size(c->samples); + + if (*n == 0) + return NULL; + + samples = pa_xnew(const char *, *n); + + PA_HASHMAP_FOREACH(sample, c->samples, state) + samples[i++] = pa_dbusiface_sample_get_path(sample); + + return samples; +} + +static void handle_get_samples(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + const char **samples; + unsigned n; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + samples = get_samples(c, &n); + + pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, samples, n); + + pa_xfree(samples); +} + +/* The caller frees the array, but not the strings. */ +static const char **get_modules(pa_dbusiface_core *c, unsigned *n) { + const char **modules; + unsigned i = 0; + void *state = NULL; + pa_dbusiface_module *module; + + pa_assert(c); + pa_assert(n); + + *n = pa_hashmap_size(c->modules); + + if (*n == 0) + return NULL; + + modules = pa_xnew(const char *, *n); + + PA_HASHMAP_FOREACH(module, c->modules, state) + modules[i++] = pa_dbusiface_module_get_path(module); + + return modules; +} + +static void handle_get_modules(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + const char **modules; + unsigned n; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + modules = get_modules(c, &n); + + pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, modules, n); + + pa_xfree(modules); +} + +/* The caller frees the array, but not the strings. */ +static const char **get_clients(pa_dbusiface_core *c, unsigned *n) { + const char **clients; + unsigned i = 0; + void *state = NULL; + pa_dbusiface_client *client; + + pa_assert(c); + pa_assert(n); + + *n = pa_hashmap_size(c->clients); + + if (*n == 0) + return NULL; + + clients = pa_xnew(const char *, *n); + + PA_HASHMAP_FOREACH(client, c->clients, state) + clients[i++] = pa_dbusiface_client_get_path(client); + + return clients; +} + +static void handle_get_clients(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + const char **clients; + unsigned n; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + clients = get_clients(c, &n); + + pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, clients, n); + + pa_xfree(clients); +} + +static const char *get_my_client(pa_dbusiface_core *c, DBusConnection *conn) { + pa_client *my_client; + + pa_assert(c); + pa_assert(conn); + + pa_assert_se((my_client = pa_dbus_protocol_get_client(c->dbus_protocol, conn))); + + return pa_dbusiface_client_get_path(pa_hashmap_get(c->clients, PA_UINT32_TO_PTR(my_client->index))); +} + +static void handle_get_my_client(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + const char *my_client; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + my_client = get_my_client(c, conn); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &my_client); +} + +static void handle_get_extensions(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + const char **extensions; + unsigned n; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + extensions = pa_dbus_protocol_get_extensions(c->dbus_protocol, &n); + + pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_STRING, extensions, n); + + pa_xfree(extensions); +} + +static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + DBusMessage *reply = NULL; + DBusMessageIter msg_iter; + DBusMessageIter dict_iter; + dbus_uint32_t interface_revision; + const char *server_name; + const char *version; + dbus_bool_t is_local; + char *username; + char *hostname; + dbus_uint32_t *default_channels; + unsigned n_default_channels; + dbus_uint32_t default_sample_format; + dbus_uint32_t default_sample_rate; + dbus_uint32_t alternate_sample_rate; + const char **cards; + unsigned n_cards; + const char **sinks; + unsigned n_sinks; + const char *fallback_sink; + const char **sources; + unsigned n_sources; + const char *fallback_source; + const char **playback_streams; + unsigned n_playback_streams; + const char **record_streams; + unsigned n_record_streams; + const char **samples; + unsigned n_samples; + const char **modules; + unsigned n_modules; + const char **clients; + unsigned n_clients; + const char *my_client; + const char **extensions; + unsigned n_extensions; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + interface_revision = INTERFACE_REVISION; + server_name = PACKAGE_NAME; + version = PACKAGE_VERSION; + is_local = get_is_local(conn); + username = pa_get_user_name_malloc(); + hostname = pa_get_host_name_malloc(); + default_channels = get_default_channels(c, &n_default_channels); + default_sample_format = c->core->default_sample_spec.format; + default_sample_rate = c->core->default_sample_spec.rate; + alternate_sample_rate = c->core->alternate_sample_rate; + cards = get_cards(c, &n_cards); + sinks = get_sinks(c, &n_sinks); + fallback_sink = c->fallback_sink + ? pa_dbusiface_device_get_path(pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(c->fallback_sink->index))) + : NULL; + sources = get_sources(c, &n_sources); + fallback_source = c->fallback_source + ? pa_dbusiface_device_get_path(pa_hashmap_get(c->sources_by_index, + PA_UINT32_TO_PTR(c->fallback_source->index))) + : NULL; + playback_streams = get_playback_streams(c, &n_playback_streams); + record_streams = get_record_streams(c, &n_record_streams); + samples = get_samples(c, &n_samples); + modules = get_modules(c, &n_modules); + clients = get_clients(c, &n_clients); + my_client = get_my_client(c, conn); + extensions = pa_dbus_protocol_get_extensions(c->dbus_protocol, &n_extensions); + + pa_assert_se((reply = dbus_message_new_method_return(msg))); + + dbus_message_iter_init_append(reply, &msg_iter); + pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter)); + + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_INTERFACE_REVISION].property_name, DBUS_TYPE_UINT32, &interface_revision); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_NAME].property_name, DBUS_TYPE_STRING, &server_name); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_VERSION].property_name, DBUS_TYPE_STRING, &version); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_IS_LOCAL].property_name, DBUS_TYPE_BOOLEAN, &is_local); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_USERNAME].property_name, DBUS_TYPE_STRING, &username); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_HOSTNAME].property_name, DBUS_TYPE_STRING, &hostname); + pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DEFAULT_CHANNELS].property_name, DBUS_TYPE_UINT32, default_channels, n_default_channels); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DEFAULT_SAMPLE_FORMAT].property_name, DBUS_TYPE_UINT32, &default_sample_format); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DEFAULT_SAMPLE_RATE].property_name, DBUS_TYPE_UINT32, &default_sample_rate); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_ALTERNATE_SAMPLE_RATE].property_name, DBUS_TYPE_UINT32, &alternate_sample_rate); + pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_CARDS].property_name, DBUS_TYPE_OBJECT_PATH, cards, n_cards); + pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SINKS].property_name, DBUS_TYPE_OBJECT_PATH, sinks, n_sinks); + + if (fallback_sink) + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_FALLBACK_SINK].property_name, DBUS_TYPE_OBJECT_PATH, &fallback_sink); + + pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SOURCES].property_name, DBUS_TYPE_OBJECT_PATH, sources, n_sources); + + if (fallback_source) + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_FALLBACK_SOURCE].property_name, DBUS_TYPE_OBJECT_PATH, &fallback_source); + + pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PLAYBACK_STREAMS].property_name, DBUS_TYPE_OBJECT_PATH, playback_streams, n_playback_streams); + pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_RECORD_STREAMS].property_name, DBUS_TYPE_OBJECT_PATH, record_streams, n_record_streams); + pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SAMPLES].property_name, DBUS_TYPE_OBJECT_PATH, samples, n_samples); + pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_MODULES].property_name, DBUS_TYPE_OBJECT_PATH, modules, n_modules); + pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_CLIENTS].property_name, DBUS_TYPE_OBJECT_PATH, clients, n_clients); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_MY_CLIENT].property_name, DBUS_TYPE_OBJECT_PATH, &my_client); + pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_EXTENSIONS].property_name, DBUS_TYPE_STRING, extensions, n_extensions); + + pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter)); + + pa_assert_se(dbus_connection_send(conn, reply, NULL)); + + dbus_message_unref(reply); + + pa_xfree(username); + pa_xfree(hostname); + pa_xfree(default_channels); + pa_xfree(cards); + pa_xfree(sinks); + pa_xfree(sources); + pa_xfree(playback_streams); + pa_xfree(record_streams); + pa_xfree(samples); + pa_xfree(modules); + pa_xfree(clients); + pa_xfree(extensions); +} + +static void handle_get_card_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + char *card_name; + pa_card *card; + pa_dbusiface_card *dbus_card; + const char *object_path; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + pa_assert_se(dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &card_name, DBUS_TYPE_INVALID)); + + if (!(card = pa_namereg_get(c->core, card_name, PA_NAMEREG_CARD))) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "No such card."); + return; + } + + pa_assert_se((dbus_card = pa_hashmap_get(c->cards, PA_UINT32_TO_PTR(card->index)))); + + object_path = pa_dbusiface_card_get_path(dbus_card); + + pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path); +} + +static void handle_get_sink_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + char *sink_name; + pa_sink *sink; + pa_dbusiface_device *dbus_sink; + const char *object_path; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + pa_assert_se(dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &sink_name, DBUS_TYPE_INVALID)); + + if (!(sink = pa_namereg_get(c->core, sink_name, PA_NAMEREG_SINK))) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such sink.", sink_name); + return; + } + + pa_assert_se((dbus_sink = pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(sink->index)))); + + object_path = pa_dbusiface_device_get_path(dbus_sink); + + pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path); +} + +static void handle_get_source_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + char *source_name; + pa_source *source; + pa_dbusiface_device *dbus_source; + const char *object_path; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + pa_assert_se(dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &source_name, DBUS_TYPE_INVALID)); + + if (!(source = pa_namereg_get(c->core, source_name, PA_NAMEREG_SOURCE))) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such source.", source_name); + return; + } + + pa_assert_se((dbus_source = pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(source->index)))); + + object_path = pa_dbusiface_device_get_path(dbus_source); + + pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path); +} + +static void handle_get_sample_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + char *sample_name; + pa_scache_entry *sample; + pa_dbusiface_sample *dbus_sample; + const char *object_path; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + pa_assert_se(dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &sample_name, DBUS_TYPE_INVALID)); + + if (!(sample = pa_namereg_get(c->core, sample_name, PA_NAMEREG_SAMPLE))) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "No such sample."); + return; + } + + pa_assert_se((dbus_sample = pa_hashmap_get(c->samples, PA_UINT32_TO_PTR(sample->index)))); + + object_path = pa_dbusiface_sample_get_path(dbus_sample); + + pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path); +} + +static void handle_upload_sample(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + DBusMessageIter msg_iter; + DBusMessageIter array_iter; + const char *name; + dbus_uint32_t sample_format; + dbus_uint32_t sample_rate; + const dbus_uint32_t *channels; + int n_channels; + const dbus_uint32_t *default_volume; + int n_volume_entries; + pa_proplist *property_list; + const uint8_t *data; + int data_length; + int i; + pa_sample_spec ss; + pa_channel_map map; + pa_memchunk chunk; + uint32_t idx; + pa_dbusiface_sample *dbus_sample = NULL; + pa_scache_entry *sample = NULL; + const char *object_path; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + chunk.memblock = NULL; + + pa_assert_se(dbus_message_iter_init(msg, &msg_iter)); + dbus_message_iter_get_basic(&msg_iter, &name); + + pa_assert_se(dbus_message_iter_next(&msg_iter)); + dbus_message_iter_get_basic(&msg_iter, &sample_format); + + pa_assert_se(dbus_message_iter_next(&msg_iter)); + dbus_message_iter_get_basic(&msg_iter, &sample_rate); + + pa_assert_se(dbus_message_iter_next(&msg_iter)); + dbus_message_iter_recurse(&msg_iter, &array_iter); + dbus_message_iter_get_fixed_array(&array_iter, &channels, &n_channels); + + pa_assert_se(dbus_message_iter_next(&msg_iter)); + dbus_message_iter_recurse(&msg_iter, &array_iter); + dbus_message_iter_get_fixed_array(&array_iter, &default_volume, &n_volume_entries); + + pa_assert_se(dbus_message_iter_next(&msg_iter)); + if (!(property_list = pa_dbus_get_proplist_arg(conn, msg, &msg_iter))) + return; + + dbus_message_iter_recurse(&msg_iter, &array_iter); + dbus_message_iter_get_fixed_array(&array_iter, &data, &data_length); + + if (!pa_sample_format_valid(sample_format)) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid sample format."); + goto finish; + } + + if (!pa_sample_rate_valid(sample_rate)) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid sample rate."); + goto finish; + } + + if (n_channels <= 0) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Empty channel map."); + goto finish; + } + + if (n_channels > (int) PA_CHANNELS_MAX) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, + "Too many channels: %i. The maximum is %u.", n_channels, PA_CHANNELS_MAX); + goto finish; + } + + for (i = 0; i < n_channels; ++i) { + if (channels[i] >= PA_CHANNEL_POSITION_MAX) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid channel position."); + goto finish; + } + } + + if (n_volume_entries != 0 && n_volume_entries != n_channels) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, + "The channels and default_volume arguments have different number of elements (%i and %i, resp).", + n_channels, n_volume_entries); + goto finish; + } + + for (i = 0; i < n_volume_entries; ++i) { + if (!PA_VOLUME_IS_VALID(default_volume[i])) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid volume: %u.", default_volume[i]); + goto finish; + } + } + + if (data_length == 0) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Empty data."); + goto finish; + } + + if (data_length > PA_SCACHE_ENTRY_SIZE_MAX) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, + "Too big sample: %i bytes. The maximum sample length is %u bytes.", + data_length, PA_SCACHE_ENTRY_SIZE_MAX); + goto finish; + } + + ss.format = sample_format; + ss.rate = sample_rate; + ss.channels = n_channels; + + pa_assert(pa_sample_spec_valid(&ss)); + + if (!pa_frame_aligned(data_length, &ss)) { + char buf[PA_SAMPLE_SPEC_SNPRINT_MAX]; + pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, + "The sample length (%i bytes) doesn't align with the sample format and channels (%s).", + data_length, pa_sample_spec_snprint(buf, sizeof(buf), &ss)); + goto finish; + } + + map.channels = n_channels; + for (i = 0; i < n_channels; ++i) + map.map[i] = channels[i]; + + chunk.memblock = pa_memblock_new(c->core->mempool, data_length); + chunk.index = 0; + chunk.length = data_length; + + memcpy(pa_memblock_acquire(chunk.memblock), data, data_length); + pa_memblock_release(chunk.memblock); + + if (pa_scache_add_item(c->core, name, &ss, &map, &chunk, property_list, &idx) < 0) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "Adding the sample failed."); + goto finish; + } + + pa_assert_se(sample = pa_idxset_get_by_index(c->core->scache, idx)); + + if (n_volume_entries > 0) { + sample->volume.channels = n_channels; + for (i = 0; i < n_volume_entries; ++i) + sample->volume.values[i] = default_volume[i]; + sample->volume_is_set = true; + } else { + sample->volume_is_set = false; + } + + dbus_sample = pa_dbusiface_sample_new(c, sample); + pa_hashmap_put(c->samples, PA_UINT32_TO_PTR(idx), dbus_sample); + + object_path = pa_dbusiface_sample_get_path(dbus_sample); + + pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path); + +finish: + if (property_list) + pa_proplist_free(property_list); + + if (chunk.memblock) + pa_memblock_unref(chunk.memblock); +} + +static bool contains_space(const char *string) { + const char *p; + + pa_assert(string); + + for (p = string; *p; ++p) { + if (isspace((unsigned char)*p)) + return true; + } + + return false; +} + +static void handle_load_module(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + DBusMessageIter msg_iter; + DBusMessageIter dict_iter; + DBusMessageIter dict_entry_iter; + char *name = NULL; + const char *key = NULL; + const char *value = NULL; + char *escaped_value = NULL; + pa_strbuf *arg_buffer = NULL; + char *arg_string = NULL; + pa_module *module = NULL; + pa_dbusiface_module *dbus_module = NULL; + const char *object_path = NULL; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + if (c->core->disallow_module_loading) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_ACCESS_DENIED, "The server is configured to disallow module loading."); + return; + } + + pa_assert_se(dbus_message_iter_init(msg, &msg_iter)); + dbus_message_iter_get_basic(&msg_iter, &name); + + arg_buffer = pa_strbuf_new(); + + pa_assert_se(dbus_message_iter_next(&msg_iter)); + dbus_message_iter_recurse(&msg_iter, &dict_iter); + + while (dbus_message_iter_get_arg_type(&dict_iter) != DBUS_TYPE_INVALID) { + if (!pa_strbuf_isempty(arg_buffer)) + pa_strbuf_putc(arg_buffer, ' '); + + dbus_message_iter_recurse(&dict_iter, &dict_entry_iter); + + dbus_message_iter_get_basic(&dict_entry_iter, &key); + + if (strlen(key) <= 0 || !pa_ascii_valid(key) || contains_space(key)) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid module argument name: %s", key); + goto finish; + } + + pa_assert_se(dbus_message_iter_next(&dict_entry_iter)); + dbus_message_iter_get_basic(&dict_entry_iter, &value); + + escaped_value = pa_escape(value, "\""); + pa_strbuf_printf(arg_buffer, "%s=\"%s\"", key, escaped_value); + pa_xfree(escaped_value); + + dbus_message_iter_next(&dict_iter); + } + + arg_string = pa_strbuf_to_string(arg_buffer); + + if (pa_module_load(&module, c->core, name, arg_string) < 0) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "Failed to load module."); + goto finish; + } + + /* This is created during module loading in module_new_cb() */ + dbus_module = pa_hashmap_get(c->modules, PA_UINT32_TO_PTR(module->index)); + object_path = pa_dbusiface_module_get_path(dbus_module); + + pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path); + +finish: + if (arg_buffer) + pa_strbuf_free(arg_buffer); + + pa_xfree(arg_string); +} + +static void handle_exit(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + if (c->core->disallow_exit) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_ACCESS_DENIED, "The server is configured to disallow exiting."); + return; + } + + pa_dbus_send_empty_reply(conn, msg); + + pa_core_exit(c->core, false, 0); +} + +static void handle_listen_for_signal(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + const char *signal_str; + char **objects = NULL; + int n_objects; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + pa_assert_se(dbus_message_get_args(msg, NULL, + DBUS_TYPE_STRING, &signal_str, + DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH, &objects, &n_objects, + DBUS_TYPE_INVALID)); + + pa_dbus_protocol_add_signal_listener(c->dbus_protocol, conn, *signal_str ? signal_str : NULL, objects, n_objects); + + pa_dbus_send_empty_reply(conn, msg); + + dbus_free_string_array(objects); +} + +static void handle_stop_listening_for_signal(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_core *c = userdata; + const char *signal_str; + + pa_assert(conn); + pa_assert(msg); + pa_assert(c); + + pa_assert_se(dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &signal_str, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_remove_signal_listener(c->dbus_protocol, conn, *signal_str ? signal_str : NULL); + + pa_dbus_send_empty_reply(conn, msg); +} + +static pa_hook_result_t module_new_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_core *c = slot_data; + pa_module * module = call_data; + pa_dbusiface_module *module_iface; + const char *object_path; + DBusMessage *signal_msg = NULL; + + pa_assert(c); + pa_assert(module); + + if (pa_streq(module->name, "module-dbus-protocol")) { + /* module-dbus-protocol can only be loaded once, and will be accounted + * for while iterating core->modules in pa_dbusiface_core_new(). As it + * happens, we will also see it here when the hook is called after the + * module is initialised, so we ignore it. */ + return PA_HOOK_OK; + } + + module_iface = pa_dbusiface_module_new(module); + pa_assert_se(pa_hashmap_put(c->modules, PA_UINT32_TO_PTR(module->index), module_iface) >= 0); + + object_path = pa_dbusiface_module_get_path(module_iface); + + pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, + PA_DBUS_CORE_INTERFACE, + signals[SIGNAL_NEW_MODULE].name))); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + return PA_HOOK_OK; +} + +static pa_hook_result_t module_removed_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_core *c = slot_data; + pa_module * module = call_data; + pa_dbusiface_module *module_iface; + const char *object_path; + DBusMessage *signal_msg = NULL; + + pa_assert(c); + pa_assert(module); + + pa_assert_se((module_iface = pa_hashmap_remove(c->modules, PA_UINT32_TO_PTR(module->index)))); + + object_path = pa_dbusiface_module_get_path(module_iface); + + pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, + PA_DBUS_CORE_INTERFACE, + signals[SIGNAL_MODULE_REMOVED].name))); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); + + pa_dbusiface_module_free(module_iface); + + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + return PA_HOOK_OK; +} + +static pa_hook_result_t sample_cache_new_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_core *c = slot_data; + pa_scache_entry *sample = call_data; + pa_dbusiface_sample *sample_iface; + const char *object_path; + DBusMessage *signal_msg = NULL; + + pa_assert(c); + pa_assert(sample); + + sample_iface = pa_dbusiface_sample_new(c, sample); + pa_assert_se(pa_hashmap_put(c->samples, PA_UINT32_TO_PTR(sample->index), sample_iface) >= 0); + + object_path = pa_dbusiface_sample_get_path(sample_iface); + + pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, + PA_DBUS_CORE_INTERFACE, + signals[SIGNAL_NEW_SAMPLE].name))); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + return PA_HOOK_OK; +} + +static pa_hook_result_t sample_cache_removed_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_core *c = slot_data; + pa_scache_entry *sample = call_data; + pa_dbusiface_sample *sample_iface; + const char *object_path; + DBusMessage *signal_msg = NULL; + + pa_assert(c); + pa_assert(sample); + + pa_assert_se((sample_iface = pa_hashmap_remove(c->samples, PA_UINT32_TO_PTR(sample->index)))); + + object_path = pa_dbusiface_sample_get_path(sample_iface); + + pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, + PA_DBUS_CORE_INTERFACE, + signals[SIGNAL_SAMPLE_REMOVED].name))); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); + + pa_dbusiface_sample_free(sample_iface); + + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + return PA_HOOK_OK; +} + +static pa_dbusiface_device *create_dbus_object_for_sink(pa_dbusiface_core *c, pa_sink *s) { + pa_dbusiface_device *d; + const char *object_path; + DBusMessage *signal_msg; + + d = pa_dbusiface_device_new_sink(c, s); + object_path = pa_dbusiface_device_get_path(d); + + pa_assert_se(pa_hashmap_put(c->sinks_by_index, PA_UINT32_TO_PTR(s->index), d) >= 0); + pa_assert_se(pa_hashmap_put(c->sinks_by_path, (char *) object_path, d) >= 0); + + pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, + PA_DBUS_CORE_INTERFACE, + signals[SIGNAL_NEW_SINK].name))); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + return d; +} + +static pa_hook_result_t default_sink_changed_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_core *c = slot_data; + pa_sink *new_fallback_sink = call_data; + pa_dbusiface_device *device_iface; + const char *object_path; + DBusMessage *signal_msg = NULL; + + pa_assert(c); + + if (c->fallback_sink != new_fallback_sink) { + if (c->fallback_sink) + pa_sink_unref(c->fallback_sink); + c->fallback_sink = new_fallback_sink ? pa_sink_ref(new_fallback_sink) : NULL; + + if (c->fallback_sink) { + device_iface = pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(c->fallback_sink->index)); + + /* It's possible that we haven't created a dbus object for the + * source yet, because if a new source immediately becomes the + * default source, the default source change hook is fired before + * the put hook. */ + if (!device_iface) + device_iface = create_dbus_object_for_sink(c, c->fallback_sink); + + object_path = pa_dbusiface_device_get_path(device_iface); + + pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, + PA_DBUS_CORE_INTERFACE, + signals[SIGNAL_FALLBACK_SINK_UPDATED].name))); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); + + } else { + pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, + PA_DBUS_CORE_INTERFACE, + signals[SIGNAL_FALLBACK_SINK_UNSET].name))); + } + } + + if (signal_msg) { + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + } + + return PA_HOOK_OK; +} + +static pa_dbusiface_device *create_dbus_object_for_source(pa_dbusiface_core *c, pa_source *s) { + pa_dbusiface_device *d; + const char *object_path; + DBusMessage *signal_msg; + + d = pa_dbusiface_device_new_source(c, s); + object_path = pa_dbusiface_device_get_path(d); + + pa_assert_se(pa_hashmap_put(c->sources_by_index, PA_UINT32_TO_PTR(s->index), d) >= 0); + pa_assert_se(pa_hashmap_put(c->sources_by_path, (char *) object_path, d) >= 0); + + pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, + PA_DBUS_CORE_INTERFACE, + signals[SIGNAL_NEW_SOURCE].name))); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + return d; +} + +static pa_hook_result_t default_source_changed_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_core *c = slot_data; + pa_source *new_fallback_source = call_data; + pa_dbusiface_device *device_iface; + const char *object_path; + DBusMessage *signal_msg = NULL; + + pa_assert(c); + + if (c->fallback_source != new_fallback_source) { + if (c->fallback_source) + pa_source_unref(c->fallback_source); + c->fallback_source = new_fallback_source ? pa_source_ref(new_fallback_source) : NULL; + + if (c->fallback_source) { + device_iface = pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(c->fallback_source->index)); + + /* It's possible that we haven't created a dbus object for the + * source yet, because if a new source immediately becomes the + * default source, the default source change hook is fired before + * the put hook. */ + if (!device_iface) + device_iface = create_dbus_object_for_source(c, c->fallback_source); + + object_path = pa_dbusiface_device_get_path(device_iface); + + pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, + PA_DBUS_CORE_INTERFACE, + signals[SIGNAL_FALLBACK_SOURCE_UPDATED].name))); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); + + } else { + pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, + PA_DBUS_CORE_INTERFACE, + signals[SIGNAL_FALLBACK_SOURCE_UNSET].name))); + } + } + + if (signal_msg) { + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + } + + return PA_HOOK_OK; +} + +static pa_hook_result_t card_put_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_core *c = slot_data; + pa_card *card = call_data; + pa_dbusiface_card *card_iface = NULL; + const char *object_path; + DBusMessage *signal_msg; + + pa_assert(c); + pa_assert(card); + + card_iface = pa_dbusiface_card_new(c, card); + pa_assert_se(pa_hashmap_put(c->cards, PA_UINT32_TO_PTR(card->index), card_iface) >= 0); + + object_path = pa_dbusiface_card_get_path(card_iface); + + pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, + PA_DBUS_CORE_INTERFACE, + signals[SIGNAL_NEW_CARD].name))); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + return PA_HOOK_OK; +} + +static pa_hook_result_t card_unlink_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_core *c = slot_data; + pa_card *card = call_data; + pa_dbusiface_card *card_iface; + const char *object_path; + DBusMessage *signal_msg; + + pa_assert(c); + pa_assert(card); + + pa_assert_se((card_iface = pa_hashmap_remove(c->cards, PA_UINT32_TO_PTR(card->index)))); + + object_path = pa_dbusiface_card_get_path(card_iface); + + pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, + PA_DBUS_CORE_INTERFACE, + signals[SIGNAL_CARD_REMOVED].name))); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); + + pa_dbusiface_card_free(card_iface); + + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + return PA_HOOK_OK; +} + +static pa_hook_result_t sink_input_put_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_core *c = slot_data; + pa_sink_input *sink_input = call_data; + pa_dbusiface_stream *stream_iface; + const char *object_path; + DBusMessage *signal_msg; + + pa_assert(c); + pa_assert(sink_input); + + stream_iface = pa_dbusiface_stream_new_playback(c, sink_input); + pa_assert_se(pa_hashmap_put(c->playback_streams, PA_UINT32_TO_PTR(sink_input->index), stream_iface) >= 0); + + object_path = pa_dbusiface_stream_get_path(stream_iface); + + pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, + PA_DBUS_CORE_INTERFACE, + signals[SIGNAL_NEW_PLAYBACK_STREAM].name))); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + return PA_HOOK_OK; +} + +static pa_hook_result_t sink_input_unlink_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_core *c = slot_data; + pa_sink_input *sink_input = call_data; + pa_dbusiface_stream *stream_iface; + const char *object_path; + DBusMessage *signal_msg; + + pa_assert(c); + pa_assert(sink_input); + + pa_assert_se((stream_iface = pa_hashmap_remove(c->playback_streams, PA_UINT32_TO_PTR(sink_input->index)))); + + object_path = pa_dbusiface_stream_get_path(stream_iface); + + pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, + PA_DBUS_CORE_INTERFACE, + signals[SIGNAL_PLAYBACK_STREAM_REMOVED].name))); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); + + pa_dbusiface_stream_free(stream_iface); + + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + return PA_HOOK_OK; +} + +static pa_hook_result_t source_output_put_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_core *c = slot_data; + pa_source_output *source_output = call_data; + pa_dbusiface_stream *stream_iface; + const char *object_path; + DBusMessage *signal_msg; + + pa_assert(c); + pa_assert(source_output); + + stream_iface = pa_dbusiface_stream_new_record(c, source_output); + pa_assert_se(pa_hashmap_put(c->record_streams, PA_UINT32_TO_PTR(source_output->index), stream_iface) >= 0); + + object_path = pa_dbusiface_stream_get_path(stream_iface); + + pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, + PA_DBUS_CORE_INTERFACE, + signals[SIGNAL_NEW_RECORD_STREAM].name))); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + return PA_HOOK_OK; +} + +static pa_hook_result_t source_output_unlink_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_core *c = slot_data; + pa_source_output *source_output = call_data; + pa_dbusiface_stream *stream_iface; + const char *object_path; + DBusMessage *signal_msg; + + pa_assert(c); + pa_assert(source_output); + + pa_assert_se((stream_iface = pa_hashmap_remove(c->record_streams, PA_UINT32_TO_PTR(source_output->index)))); + + object_path = pa_dbusiface_stream_get_path(stream_iface); + + pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, + PA_DBUS_CORE_INTERFACE, + signals[SIGNAL_RECORD_STREAM_REMOVED].name))); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); + + pa_dbusiface_stream_free(stream_iface); + + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + return PA_HOOK_OK; +} + +static pa_hook_result_t client_put_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_core *c = slot_data; + pa_client *client = call_data; + pa_dbusiface_client *client_iface; + const char *object_path; + DBusMessage *signal_msg; + + pa_assert(c); + pa_assert(client); + + client_iface = pa_dbusiface_client_new(c, client); + pa_assert_se(pa_hashmap_put(c->clients, PA_UINT32_TO_PTR(client->index), client_iface) >= 0); + + object_path = pa_dbusiface_client_get_path(client_iface); + + pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, + PA_DBUS_CORE_INTERFACE, + signals[SIGNAL_NEW_CLIENT].name))); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + return PA_HOOK_OK; +} + +static pa_hook_result_t client_unlink_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_core *c = slot_data; + pa_client *client = call_data; + pa_dbusiface_client *client_iface; + const char *object_path; + DBusMessage *signal_msg; + + pa_assert(c); + pa_assert(client); + + pa_assert_se((client_iface = pa_hashmap_remove(c->clients, PA_UINT32_TO_PTR(client->index)))); + + object_path = pa_dbusiface_client_get_path(client_iface); + + pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, + PA_DBUS_CORE_INTERFACE, + signals[SIGNAL_CLIENT_REMOVED].name))); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); + + pa_dbusiface_client_free(client_iface); + + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + return PA_HOOK_OK; +} + +static pa_hook_result_t sink_put_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_core *c = slot_data; + pa_sink *s = call_data; + + pa_assert(c); + pa_assert(s); + + /* We may have alredy encountered this sink, because if the new sink was + * chosen as the default sink, the default sink change hook was fired + * first, and we saw the sink in default_sink_changed_cb(). */ + if (pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(s->index))) + return PA_HOOK_OK; + + create_dbus_object_for_sink(c, s); + + return PA_HOOK_OK; +} + +static pa_hook_result_t sink_unlink_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_core *c = slot_data; + pa_sink *s = call_data; + pa_dbusiface_device *d = NULL; + const char *object_path = NULL; + DBusMessage *signal_msg = NULL; + + pa_assert(c); + pa_assert(s); + + pa_assert_se(d = pa_hashmap_remove(c->sinks_by_index, PA_UINT32_TO_PTR(s->index))); + object_path = pa_dbusiface_device_get_path(d); + pa_assert_se(pa_hashmap_remove(c->sinks_by_path, object_path)); + + pa_assert_se(signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, + PA_DBUS_CORE_INTERFACE, + signals[SIGNAL_SINK_REMOVED].name)); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + pa_dbusiface_device_free(d); + + return PA_HOOK_OK; +} + +static pa_hook_result_t source_put_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_core *c = slot_data; + pa_source *s = call_data; + + pa_assert(c); + pa_assert(s); + + /* We may have alredy encountered this source, because if the new source + * was chosen as the default source, the default source change hook was + * fired first, and we saw the source in default_source_changed_cb(). */ + if (pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(s->index))) + return PA_HOOK_OK; + + create_dbus_object_for_source(c, s); + + return PA_HOOK_OK; +} + +static pa_hook_result_t source_unlink_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_core *c = slot_data; + pa_source *s = call_data; + pa_dbusiface_device *d = NULL; + const char *object_path = NULL; + DBusMessage *signal_msg = NULL; + + pa_assert(c); + pa_assert(s); + + pa_assert_se(d = pa_hashmap_remove(c->sources_by_index, PA_UINT32_TO_PTR(s->index))); + object_path = pa_dbusiface_device_get_path(d); + pa_assert_se(pa_hashmap_remove(c->sources_by_path, object_path)); + + pa_assert_se(signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, + PA_DBUS_CORE_INTERFACE, + signals[SIGNAL_SOURCE_REMOVED].name)); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + pa_dbusiface_device_free(d); + + return PA_HOOK_OK; +} + +static pa_hook_result_t extension_registered_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_core *c = slot_data; + const char *ext_name = call_data; + DBusMessage *signal_msg = NULL; + + pa_assert(c); + pa_assert(ext_name); + + pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, + PA_DBUS_CORE_INTERFACE, + signals[SIGNAL_NEW_EXTENSION].name))); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_STRING, &ext_name, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + return PA_HOOK_OK; +} + +static pa_hook_result_t extension_unregistered_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_core *c = slot_data; + const char *ext_name = call_data; + DBusMessage *signal_msg = NULL; + + pa_assert(c); + pa_assert(ext_name); + + pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, + PA_DBUS_CORE_INTERFACE, + signals[SIGNAL_EXTENSION_REMOVED].name))); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_STRING, &ext_name, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + return PA_HOOK_OK; +} + +pa_dbusiface_core *pa_dbusiface_core_new(pa_core *core) { + pa_dbusiface_core *c; + pa_card *card; + pa_sink *sink; + pa_source *source; + pa_dbusiface_device *device; + pa_sink_input *sink_input; + pa_source_output *source_output; + pa_scache_entry *sample; + pa_module *module; + pa_client *client; + uint32_t idx; + + pa_assert(core); + + c = pa_xnew(pa_dbusiface_core, 1); + c->core = core; + c->dbus_protocol = pa_dbus_protocol_get(core); + c->cards = pa_hashmap_new_full(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func, NULL, (pa_free_cb_t) pa_dbusiface_card_free); + c->sinks_by_index = pa_hashmap_new_full(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func, NULL, + (pa_free_cb_t) pa_dbusiface_device_free); + c->sinks_by_path = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + c->sources_by_index = pa_hashmap_new_full(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func, NULL, + (pa_free_cb_t) pa_dbusiface_device_free); + c->sources_by_path = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + c->playback_streams = pa_hashmap_new_full(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func, NULL, + (pa_free_cb_t) pa_dbusiface_stream_free); + c->record_streams = pa_hashmap_new_full(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func, NULL, + (pa_free_cb_t) pa_dbusiface_stream_free); + c->samples = pa_hashmap_new_full(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func, NULL, (pa_free_cb_t) pa_dbusiface_sample_free); + c->modules = pa_hashmap_new_full(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func, NULL, (pa_free_cb_t) pa_dbusiface_module_free); + c->clients = pa_hashmap_new_full(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func, NULL, (pa_free_cb_t) pa_dbusiface_client_free); + c->fallback_sink = core->default_sink; + c->fallback_source = core->default_source; + c->default_sink_changed_slot = pa_hook_connect(&core->hooks[PA_CORE_HOOK_DEFAULT_SINK_CHANGED], + PA_HOOK_NORMAL, default_sink_changed_cb, c); + c->default_source_changed_slot = pa_hook_connect(&core->hooks[PA_CORE_HOOK_DEFAULT_SOURCE_CHANGED], + PA_HOOK_NORMAL, default_source_changed_cb, c); + c->module_new_slot = pa_hook_connect(&core->hooks[PA_CORE_HOOK_MODULE_NEW], + PA_HOOK_NORMAL, module_new_cb, c); + c->module_removed_slot = pa_hook_connect(&core->hooks[PA_CORE_HOOK_MODULE_UNLINK], + PA_HOOK_NORMAL, module_removed_cb, c); + c->sample_cache_new_slot = pa_hook_connect(&core->hooks[PA_CORE_HOOK_SAMPLE_CACHE_NEW], + PA_HOOK_NORMAL, sample_cache_new_cb, c); + c->sample_cache_removed_slot = pa_hook_connect(&core->hooks[PA_CORE_HOOK_SAMPLE_CACHE_UNLINK], + PA_HOOK_NORMAL, sample_cache_removed_cb, c); + c->card_put_slot = pa_hook_connect(&core->hooks[PA_CORE_HOOK_CARD_PUT], + PA_HOOK_NORMAL, card_put_cb, c); + c->card_unlink_slot = pa_hook_connect(&core->hooks[PA_CORE_HOOK_CARD_UNLINK], + PA_HOOK_NORMAL, card_unlink_cb, c); + c->sink_input_put_slot = pa_hook_connect(&core->hooks[PA_CORE_HOOK_SINK_INPUT_PUT], + PA_HOOK_NORMAL, sink_input_put_cb, c); + c->sink_input_unlink_slot = pa_hook_connect(&core->hooks[PA_CORE_HOOK_SINK_INPUT_UNLINK], + PA_HOOK_NORMAL, sink_input_unlink_cb, c); + c->source_output_put_slot = pa_hook_connect(&core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_PUT], + PA_HOOK_NORMAL, source_output_put_cb, c); + c->source_output_unlink_slot = pa_hook_connect(&core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_UNLINK], + PA_HOOK_NORMAL, source_output_unlink_cb, c); + c->client_put_slot = pa_hook_connect(&core->hooks[PA_CORE_HOOK_CLIENT_PUT], + PA_HOOK_NORMAL, client_put_cb, c); + c->client_unlink_slot = pa_hook_connect(&core->hooks[PA_CORE_HOOK_CLIENT_UNLINK], + PA_HOOK_NORMAL, client_unlink_cb, c); + c->sink_put_slot = pa_hook_connect(&core->hooks[PA_CORE_HOOK_SINK_PUT], PA_HOOK_NORMAL, sink_put_cb, c); + c->sink_unlink_slot = pa_hook_connect(&core->hooks[PA_CORE_HOOK_SINK_UNLINK], PA_HOOK_NORMAL, sink_unlink_cb, c); + c->source_put_slot = pa_hook_connect(&core->hooks[PA_CORE_HOOK_SOURCE_PUT], PA_HOOK_NORMAL, source_put_cb, c); + c->source_unlink_slot = pa_hook_connect(&core->hooks[PA_CORE_HOOK_SOURCE_UNLINK], PA_HOOK_NORMAL, source_unlink_cb, c); + c->extension_registered_slot = pa_dbus_protocol_hook_connect(c->dbus_protocol, + PA_DBUS_PROTOCOL_HOOK_EXTENSION_REGISTERED, + PA_HOOK_NORMAL, + extension_registered_cb, + c); + c->extension_unregistered_slot = pa_dbus_protocol_hook_connect(c->dbus_protocol, + PA_DBUS_PROTOCOL_HOOK_EXTENSION_UNREGISTERED, + PA_HOOK_NORMAL, + extension_unregistered_cb, + c); + c->memstats = pa_dbusiface_memstats_new(c, core); + + if (c->fallback_sink) + pa_sink_ref(c->fallback_sink); + if (c->fallback_source) + pa_source_ref(c->fallback_source); + + PA_IDXSET_FOREACH(card, core->cards, idx) + pa_hashmap_put(c->cards, PA_UINT32_TO_PTR(idx), pa_dbusiface_card_new(c, card)); + + PA_IDXSET_FOREACH(sink, core->sinks, idx) { + device = pa_dbusiface_device_new_sink(c, sink); + pa_hashmap_put(c->sinks_by_index, PA_UINT32_TO_PTR(idx), device); + pa_hashmap_put(c->sinks_by_path, (char *) pa_dbusiface_device_get_path(device), device); + } + + PA_IDXSET_FOREACH(source, core->sources, idx) { + device = pa_dbusiface_device_new_source(c, source); + pa_hashmap_put(c->sources_by_index, PA_UINT32_TO_PTR(idx), device); + pa_hashmap_put(c->sources_by_path, (char *) pa_dbusiface_device_get_path(device), device); + } + + PA_IDXSET_FOREACH(sink_input, core->sink_inputs, idx) + pa_hashmap_put(c->playback_streams, PA_UINT32_TO_PTR(idx), pa_dbusiface_stream_new_playback(c, sink_input)); + + PA_IDXSET_FOREACH(source_output, core->source_outputs, idx) + pa_hashmap_put(c->record_streams, PA_UINT32_TO_PTR(idx), pa_dbusiface_stream_new_record(c, source_output)); + + PA_IDXSET_FOREACH(sample, core->scache, idx) + pa_hashmap_put(c->samples, PA_UINT32_TO_PTR(idx), pa_dbusiface_sample_new(c, sample)); + + PA_IDXSET_FOREACH(module, core->modules, idx) + pa_hashmap_put(c->modules, PA_UINT32_TO_PTR(idx), pa_dbusiface_module_new(module)); + + PA_IDXSET_FOREACH(client, core->clients, idx) + pa_hashmap_put(c->clients, PA_UINT32_TO_PTR(idx), pa_dbusiface_client_new(c, client)); + + pa_assert_se(pa_dbus_protocol_add_interface(c->dbus_protocol, PA_DBUS_CORE_OBJECT_PATH, &core_interface_info, c) >= 0); + + return c; +} + +void pa_dbusiface_core_free(pa_dbusiface_core *c) { + pa_assert(c); + + pa_assert_se(pa_dbus_protocol_remove_interface(c->dbus_protocol, PA_DBUS_CORE_OBJECT_PATH, core_interface_info.name) >= 0); + + /* Note that the order of freeing is important below. + * Do not change it for the sake of tidiness without checking! */ + pa_hashmap_free(c->cards); + pa_hashmap_free(c->sinks_by_path); + pa_hashmap_free(c->sinks_by_index); + pa_hashmap_free(c->sources_by_path); + pa_hashmap_free(c->sources_by_index); + pa_hashmap_free(c->playback_streams); + pa_hashmap_free(c->record_streams); + pa_hashmap_free(c->samples); + pa_hashmap_free(c->modules); + pa_hashmap_free(c->clients); + pa_hook_slot_free(c->module_new_slot); + pa_hook_slot_free(c->module_removed_slot); + pa_hook_slot_free(c->default_sink_changed_slot); + pa_hook_slot_free(c->default_source_changed_slot); + pa_hook_slot_free(c->sample_cache_new_slot); + pa_hook_slot_free(c->sample_cache_removed_slot); + pa_hook_slot_free(c->card_put_slot); + pa_hook_slot_free(c->card_unlink_slot); + pa_hook_slot_free(c->sink_input_put_slot); + pa_hook_slot_free(c->sink_input_unlink_slot); + pa_hook_slot_free(c->source_output_put_slot); + pa_hook_slot_free(c->source_output_unlink_slot); + pa_hook_slot_free(c->client_put_slot); + pa_hook_slot_free(c->client_unlink_slot); + pa_hook_slot_free(c->sink_put_slot); + pa_hook_slot_free(c->sink_unlink_slot); + pa_hook_slot_free(c->source_put_slot); + pa_hook_slot_free(c->source_unlink_slot); + pa_hook_slot_free(c->extension_registered_slot); + pa_hook_slot_free(c->extension_unregistered_slot); + pa_dbusiface_memstats_free(c->memstats); + + if (c->fallback_sink) + pa_sink_unref(c->fallback_sink); + if (c->fallback_source) + pa_source_unref(c->fallback_source); + + pa_dbus_protocol_unref(c->dbus_protocol); + + pa_xfree(c); +} + +const char *pa_dbusiface_core_get_card_path(pa_dbusiface_core *c, const pa_card *card) { + pa_assert(c); + pa_assert(card); + + return pa_dbusiface_card_get_path(pa_hashmap_get(c->cards, PA_UINT32_TO_PTR(card->index))); +} + +const char *pa_dbusiface_core_get_sink_path(pa_dbusiface_core *c, const pa_sink *sink) { + pa_assert(c); + pa_assert(sink); + + return pa_dbusiface_device_get_path(pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(sink->index))); +} + +const char *pa_dbusiface_core_get_source_path(pa_dbusiface_core *c, const pa_source *source) { + pa_assert(c); + pa_assert(source); + + return pa_dbusiface_device_get_path(pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(source->index))); +} + +const char *pa_dbusiface_core_get_playback_stream_path(pa_dbusiface_core *c, const pa_sink_input *sink_input) { + pa_assert(c); + pa_assert(sink_input); + + return pa_dbusiface_stream_get_path(pa_hashmap_get(c->playback_streams, PA_UINT32_TO_PTR(sink_input->index))); +} + +const char *pa_dbusiface_core_get_record_stream_path(pa_dbusiface_core *c, const pa_source_output *source_output) { + pa_assert(c); + pa_assert(source_output); + + return pa_dbusiface_stream_get_path(pa_hashmap_get(c->record_streams, PA_UINT32_TO_PTR(source_output->index))); +} + +const char *pa_dbusiface_core_get_module_path(pa_dbusiface_core *c, const pa_module *module) { + pa_assert(c); + pa_assert(module); + + return pa_dbusiface_module_get_path(pa_hashmap_get(c->modules, PA_UINT32_TO_PTR(module->index))); +} + +const char *pa_dbusiface_core_get_client_path(pa_dbusiface_core *c, const pa_client *client) { + pa_assert(c); + pa_assert(client); + + return pa_dbusiface_client_get_path(pa_hashmap_get(c->clients, PA_UINT32_TO_PTR(client->index))); +} + +pa_sink *pa_dbusiface_core_get_sink(pa_dbusiface_core *c, const char *object_path) { + pa_dbusiface_device *device = NULL; + + pa_assert(c); + pa_assert(object_path); + + device = pa_hashmap_get(c->sinks_by_path, object_path); + + if (device) + return pa_dbusiface_device_get_sink(device); + else + return NULL; +} + +pa_source *pa_dbusiface_core_get_source(pa_dbusiface_core *c, const char *object_path) { + pa_dbusiface_device *device = NULL; + + pa_assert(c); + pa_assert(object_path); + + device = pa_hashmap_get(c->sources_by_path, object_path); + + if (device) + return pa_dbusiface_device_get_source(device); + else + return NULL; +} diff --git a/src/modules/dbus/iface-core.h b/src/modules/dbus/iface-core.h new file mode 100644 index 0000000..2959fc8 --- /dev/null +++ b/src/modules/dbus/iface-core.h @@ -0,0 +1,50 @@ +#ifndef foodbusifacecorehfoo +#define foodbusifacecorehfoo + +/*** + This file is part of PulseAudio. + + Copyright 2009 Tanu Kaskinen + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +/* This object implements the D-Bus interface org.PulseAudio.Core1. + * + * See http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/Developer/Clients/DBus/Core/ + * for the Core interface documentation. + */ + +#include + +typedef struct pa_dbusiface_core pa_dbusiface_core; + +pa_dbusiface_core *pa_dbusiface_core_new(pa_core *core); +void pa_dbusiface_core_free(pa_dbusiface_core *c); + +const char *pa_dbusiface_core_get_card_path(pa_dbusiface_core *c, const pa_card *card); +const char *pa_dbusiface_core_get_sink_path(pa_dbusiface_core *c, const pa_sink *sink); +const char *pa_dbusiface_core_get_source_path(pa_dbusiface_core *c, const pa_source *source); +const char *pa_dbusiface_core_get_playback_stream_path(pa_dbusiface_core *c, const pa_sink_input *sink_input); +const char *pa_dbusiface_core_get_record_stream_path(pa_dbusiface_core *c, const pa_source_output *source_output); +const char *pa_dbusiface_core_get_module_path(pa_dbusiface_core *c, const pa_module *module); +const char *pa_dbusiface_core_get_client_path(pa_dbusiface_core *c, const pa_client *client); + +/* Returns NULL if there's no sink with the given path. */ +pa_sink *pa_dbusiface_core_get_sink(pa_dbusiface_core *c, const char *object_path); + +/* Returns NULL if there's no source with the given path. */ +pa_source *pa_dbusiface_core_get_source(pa_dbusiface_core *c, const char *object_path); + +#endif diff --git a/src/modules/dbus/iface-device-port.c b/src/modules/dbus/iface-device-port.c new file mode 100644 index 0000000..4892443 --- /dev/null +++ b/src/modules/dbus/iface-device-port.c @@ -0,0 +1,249 @@ +/*** + This file is part of PulseAudio. + + Copyright 2009 Tanu Kaskinen + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include + +#include "iface-device-port.h" + +#define OBJECT_NAME "port" + +static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_description(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_priority(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_available(DBusConnection *conn, DBusMessage *msg, void *userdata); + +static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata); + +struct pa_dbusiface_device_port { + uint32_t index; + pa_device_port *port; + char *path; + + pa_hook_slot *available_changed_slot; + + pa_dbus_protocol *dbus_protocol; +}; + +enum property_handler_index { + PROPERTY_HANDLER_INDEX, + PROPERTY_HANDLER_NAME, + PROPERTY_HANDLER_DESCRIPTION, + PROPERTY_HANDLER_PRIORITY, + PROPERTY_HANDLER_AVAILABLE, + PROPERTY_HANDLER_MAX +}; + +static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = { + [PROPERTY_HANDLER_INDEX] = { .property_name = "Index", .type = "u", .get_cb = handle_get_index, .set_cb = NULL }, + [PROPERTY_HANDLER_NAME] = { .property_name = "Name", .type = "s", .get_cb = handle_get_name, .set_cb = NULL }, + [PROPERTY_HANDLER_DESCRIPTION] = { .property_name = "Description", .type = "s", .get_cb = handle_get_description, .set_cb = NULL }, + [PROPERTY_HANDLER_PRIORITY] = { .property_name = "Priority", .type = "u", .get_cb = handle_get_priority, .set_cb = NULL }, + [PROPERTY_HANDLER_AVAILABLE] = { .property_name = "Available", .type = "u", .get_cb = handle_get_available, .set_cb = NULL } +}; + +enum signal_index { + SIGNAL_AVAILABLE_CHANGED, + SIGNAL_MAX +}; + +static pa_dbus_arg_info available_changed_args[] = { { "available", "u", NULL } }; + +static pa_dbus_signal_info signals[SIGNAL_MAX] = { + [SIGNAL_AVAILABLE_CHANGED] = { .name = "AvailableChanged", .arguments = available_changed_args, .n_arguments = 1 } +}; + +static pa_dbus_interface_info port_interface_info = { + .name = PA_DBUSIFACE_DEVICE_PORT_INTERFACE, + .method_handlers = NULL, + .n_method_handlers = 0, + .property_handlers = property_handlers, + .n_property_handlers = PROPERTY_HANDLER_MAX, + .get_all_properties_cb = handle_get_all, + .signals = signals, + .n_signals = SIGNAL_MAX +}; + +static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device_port *p = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(p); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &p->index); +} + +static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device_port *p = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(p); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &p->port->name); +} + +static void handle_get_description(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device_port *p = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(p); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &p->port->description); +} + +static void handle_get_priority(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device_port *p = userdata; + dbus_uint32_t priority = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(p); + + priority = p->port->priority; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &priority); +} + +static void handle_get_available(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device_port *p = userdata; + dbus_uint32_t available = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(p); + + available = p->port->available; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &available); +} + + +static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device_port *p = userdata; + DBusMessage *reply = NULL; + DBusMessageIter msg_iter; + DBusMessageIter dict_iter; + dbus_uint32_t priority = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(p); + + priority = p->port->priority; + + pa_assert_se((reply = dbus_message_new_method_return(msg))); + + dbus_message_iter_init_append(reply, &msg_iter); + pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter)); + + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_INDEX].property_name, DBUS_TYPE_UINT32, &p->index); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_NAME].property_name, DBUS_TYPE_STRING, &p->port->name); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DESCRIPTION].property_name, DBUS_TYPE_STRING, &p->port->description); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PRIORITY].property_name, DBUS_TYPE_UINT32, &priority); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_AVAILABLE].property_name, DBUS_TYPE_UINT32, &p->port->available); + + pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter)); + + pa_assert_se(dbus_connection_send(conn, reply, NULL)); + dbus_message_unref(reply); +} + +static pa_hook_result_t available_changed_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_device_port *p = slot_data; + pa_device_port *port = call_data; + DBusMessage *signal_msg; + uint32_t available; + + pa_assert(p); + pa_assert(port); + + if(p->port != port) + return PA_HOOK_OK; + + available = port->available; + + pa_assert_se(signal_msg = dbus_message_new_signal(p->path, + PA_DBUSIFACE_DEVICE_PORT_INTERFACE, + signals[SIGNAL_AVAILABLE_CHANGED].name)); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_UINT32, &available, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(p->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + return PA_HOOK_OK; +} + + +pa_dbusiface_device_port *pa_dbusiface_device_port_new( + pa_dbusiface_device *device, + pa_core *core, + pa_device_port *port, + uint32_t idx) { + pa_dbusiface_device_port *p = NULL; + + pa_assert(device); + pa_assert(core); + pa_assert(port); + + p = pa_xnew(pa_dbusiface_device_port, 1); + p->index = idx; + p->port = port; + p->path = pa_sprintf_malloc("%s/%s%u", pa_dbusiface_device_get_path(device), OBJECT_NAME, idx); + p->dbus_protocol = pa_dbus_protocol_get(core); + p->available_changed_slot = pa_hook_connect(&port->core->hooks[PA_CORE_HOOK_PORT_AVAILABLE_CHANGED], + PA_HOOK_NORMAL, available_changed_cb, p); + + pa_assert_se(pa_dbus_protocol_add_interface(p->dbus_protocol, p->path, &port_interface_info, p) >= 0); + + return p; +} + +void pa_dbusiface_device_port_free(pa_dbusiface_device_port *p) { + pa_assert(p); + + pa_assert_se(pa_dbus_protocol_remove_interface(p->dbus_protocol, p->path, port_interface_info.name) >= 0); + + pa_hook_slot_free(p->available_changed_slot); + pa_dbus_protocol_unref(p->dbus_protocol); + + pa_xfree(p->path); + pa_xfree(p); +} + +const char *pa_dbusiface_device_port_get_path(pa_dbusiface_device_port *p) { + pa_assert(p); + + return p->path; +} + +const char *pa_dbusiface_device_port_get_name(pa_dbusiface_device_port *p) { + pa_assert(p); + + return p->port->name; +} diff --git a/src/modules/dbus/iface-device-port.h b/src/modules/dbus/iface-device-port.h new file mode 100644 index 0000000..f362d47 --- /dev/null +++ b/src/modules/dbus/iface-device-port.h @@ -0,0 +1,48 @@ +#ifndef foodbusifacedeviceporthfoo +#define foodbusifacedeviceporthfoo + +/*** + This file is part of PulseAudio. + + Copyright 2009 Tanu Kaskinen + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +/* This object implements the D-Bus interface org.PulseAudio.Core1.DevicePort. + * + * See http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/Developer/Clients/DBus/DevicePort/ + * for the DevicePort interface documentation. + */ + +#include +#include + +#include "iface-device.h" + +#define PA_DBUSIFACE_DEVICE_PORT_INTERFACE PA_DBUS_CORE_INTERFACE ".DevicePort" + +typedef struct pa_dbusiface_device_port pa_dbusiface_device_port; + +pa_dbusiface_device_port *pa_dbusiface_device_port_new( + pa_dbusiface_device *device, + pa_core *core, + pa_device_port *port, + uint32_t idx); +void pa_dbusiface_device_port_free(pa_dbusiface_device_port *p); + +const char *pa_dbusiface_device_port_get_path(pa_dbusiface_device_port *p); +const char *pa_dbusiface_device_port_get_name(pa_dbusiface_device_port *p); + +#endif diff --git a/src/modules/dbus/iface-device.c b/src/modules/dbus/iface-device.c new file mode 100644 index 0000000..775cf3f --- /dev/null +++ b/src/modules/dbus/iface-device.c @@ -0,0 +1,1377 @@ +/*** + This file is part of PulseAudio. + + Copyright 2009 Tanu Kaskinen + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "iface-device-port.h" + +#include "iface-device.h" + +#define SINK_OBJECT_NAME "sink" +#define SOURCE_OBJECT_NAME "source" + +static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_driver(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_owner_module(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_card(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_sample_format(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_channels(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_volume(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_set_volume(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata); +static void handle_get_has_flat_volume(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_has_convertible_to_decibel_volume(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_base_volume(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_volume_steps(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_mute(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_set_mute(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata); +static void handle_get_has_hardware_volume(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_has_hardware_mute(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_configured_latency(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_has_dynamic_latency(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_latency(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_is_hardware_device(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_is_network_device(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_state(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_ports(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_active_port(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_set_active_port(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata); +static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata); + +static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata); + +static void handle_suspend(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_port_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata); + +static void handle_sink_get_monitor_source(DBusConnection *conn, DBusMessage *msg, void *userdata); + +static void handle_sink_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata); + +static void handle_source_get_monitor_of_sink(DBusConnection *conn, DBusMessage *msg, void *userdata); + +static void handle_source_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata); + +struct pa_dbusiface_device { + pa_dbusiface_core *core; + + union { + pa_sink *sink; + pa_source *source; + }; + pa_device_type_t type; + char *path; + pa_cvolume volume; + dbus_bool_t mute; + union { + pa_sink_state_t sink_state; + pa_source_state_t source_state; + }; + pa_hashmap *ports; + uint32_t next_port_index; + pa_device_port *active_port; + pa_proplist *proplist; + + pa_hook_slot *volume_changed_slot; + pa_hook_slot *mute_changed_slot; + pa_hook_slot *state_changed_slot; + pa_hook_slot *port_changed_slot; + pa_hook_slot *proplist_changed_slot; + + pa_dbus_protocol *dbus_protocol; +}; + +enum property_handler_index { + PROPERTY_HANDLER_INDEX, + PROPERTY_HANDLER_NAME, + PROPERTY_HANDLER_DRIVER, + PROPERTY_HANDLER_OWNER_MODULE, + PROPERTY_HANDLER_CARD, + PROPERTY_HANDLER_SAMPLE_FORMAT, + PROPERTY_HANDLER_SAMPLE_RATE, + PROPERTY_HANDLER_CHANNELS, + PROPERTY_HANDLER_VOLUME, + PROPERTY_HANDLER_HAS_FLAT_VOLUME, + PROPERTY_HANDLER_HAS_CONVERTIBLE_TO_DECIBEL_VOLUME, + PROPERTY_HANDLER_BASE_VOLUME, + PROPERTY_HANDLER_VOLUME_STEPS, + PROPERTY_HANDLER_MUTE, + PROPERTY_HANDLER_HAS_HARDWARE_VOLUME, + PROPERTY_HANDLER_HAS_HARDWARE_MUTE, + PROPERTY_HANDLER_CONFIGURED_LATENCY, + PROPERTY_HANDLER_HAS_DYNAMIC_LATENCY, + PROPERTY_HANDLER_LATENCY, + PROPERTY_HANDLER_IS_HARDWARE_DEVICE, + PROPERTY_HANDLER_IS_NETWORK_DEVICE, + PROPERTY_HANDLER_STATE, + PROPERTY_HANDLER_PORTS, + PROPERTY_HANDLER_ACTIVE_PORT, + PROPERTY_HANDLER_PROPERTY_LIST, + PROPERTY_HANDLER_MAX +}; + +enum sink_property_handler_index { + SINK_PROPERTY_HANDLER_MONITOR_SOURCE, + SINK_PROPERTY_HANDLER_MAX +}; + +enum source_property_handler_index { + SOURCE_PROPERTY_HANDLER_MONITOR_OF_SINK, + SOURCE_PROPERTY_HANDLER_MAX +}; + +static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = { + [PROPERTY_HANDLER_INDEX] = { .property_name = "Index", .type = "u", .get_cb = handle_get_index, .set_cb = NULL }, + [PROPERTY_HANDLER_NAME] = { .property_name = "Name", .type = "s", .get_cb = handle_get_name, .set_cb = NULL }, + [PROPERTY_HANDLER_DRIVER] = { .property_name = "Driver", .type = "s", .get_cb = handle_get_driver, .set_cb = NULL }, + [PROPERTY_HANDLER_OWNER_MODULE] = { .property_name = "OwnerModule", .type = "o", .get_cb = handle_get_owner_module, .set_cb = NULL }, + [PROPERTY_HANDLER_CARD] = { .property_name = "Card", .type = "o", .get_cb = handle_get_card, .set_cb = NULL }, + [PROPERTY_HANDLER_SAMPLE_FORMAT] = { .property_name = "SampleFormat", .type = "u", .get_cb = handle_get_sample_format, .set_cb = NULL }, + [PROPERTY_HANDLER_SAMPLE_RATE] = { .property_name = "SampleRate", .type = "u", .get_cb = handle_get_sample_rate, .set_cb = NULL }, + [PROPERTY_HANDLER_CHANNELS] = { .property_name = "Channels", .type = "au", .get_cb = handle_get_channels, .set_cb = NULL }, + [PROPERTY_HANDLER_VOLUME] = { .property_name = "Volume", .type = "au", .get_cb = handle_get_volume, .set_cb = handle_set_volume }, + [PROPERTY_HANDLER_HAS_FLAT_VOLUME] = { .property_name = "HasFlatVolume", .type = "b", .get_cb = handle_get_has_flat_volume, .set_cb = NULL }, + [PROPERTY_HANDLER_HAS_CONVERTIBLE_TO_DECIBEL_VOLUME] = { .property_name = "HasConvertibleToDecibelVolume", .type = "b", .get_cb = handle_get_has_convertible_to_decibel_volume, .set_cb = NULL }, + [PROPERTY_HANDLER_BASE_VOLUME] = { .property_name = "BaseVolume", .type = "u", .get_cb = handle_get_base_volume, .set_cb = NULL }, + [PROPERTY_HANDLER_VOLUME_STEPS] = { .property_name = "VolumeSteps", .type = "u", .get_cb = handle_get_volume_steps, .set_cb = NULL }, + [PROPERTY_HANDLER_MUTE] = { .property_name = "Mute", .type = "b", .get_cb = handle_get_mute, .set_cb = handle_set_mute }, + [PROPERTY_HANDLER_HAS_HARDWARE_VOLUME] = { .property_name = "HasHardwareVolume", .type = "b", .get_cb = handle_get_has_hardware_volume, .set_cb = NULL }, + [PROPERTY_HANDLER_HAS_HARDWARE_MUTE] = { .property_name = "HasHardwareMute", .type = "b", .get_cb = handle_get_has_hardware_mute, .set_cb = NULL }, + [PROPERTY_HANDLER_CONFIGURED_LATENCY] = { .property_name = "ConfiguredLatency", .type = "t", .get_cb = handle_get_configured_latency, .set_cb = NULL }, + [PROPERTY_HANDLER_HAS_DYNAMIC_LATENCY] = { .property_name = "HasDynamicLatency", .type = "b", .get_cb = handle_get_has_dynamic_latency, .set_cb = NULL }, + [PROPERTY_HANDLER_LATENCY] = { .property_name = "Latency", .type = "t", .get_cb = handle_get_latency, .set_cb = NULL }, + [PROPERTY_HANDLER_IS_HARDWARE_DEVICE] = { .property_name = "IsHardwareDevice", .type = "b", .get_cb = handle_get_is_hardware_device, .set_cb = NULL }, + [PROPERTY_HANDLER_IS_NETWORK_DEVICE] = { .property_name = "IsNetworkDevice", .type = "b", .get_cb = handle_get_is_network_device, .set_cb = NULL }, + [PROPERTY_HANDLER_STATE] = { .property_name = "State", .type = "u", .get_cb = handle_get_state, .set_cb = NULL }, + [PROPERTY_HANDLER_PORTS] = { .property_name = "Ports", .type = "ao", .get_cb = handle_get_ports, .set_cb = NULL }, + [PROPERTY_HANDLER_ACTIVE_PORT] = { .property_name = "ActivePort", .type = "o", .get_cb = handle_get_active_port, .set_cb = handle_set_active_port }, + [PROPERTY_HANDLER_PROPERTY_LIST] = { .property_name = "PropertyList", .type = "a{say}", .get_cb = handle_get_property_list, .set_cb = NULL } +}; + +static pa_dbus_property_handler sink_property_handlers[SINK_PROPERTY_HANDLER_MAX] = { + [SINK_PROPERTY_HANDLER_MONITOR_SOURCE] = { .property_name = "MonitorSource", .type = "o", .get_cb = handle_sink_get_monitor_source, .set_cb = NULL } +}; + +static pa_dbus_property_handler source_property_handlers[SOURCE_PROPERTY_HANDLER_MAX] = { + [SOURCE_PROPERTY_HANDLER_MONITOR_OF_SINK] = { .property_name = "MonitorOfSink", .type = "o", .get_cb = handle_source_get_monitor_of_sink, .set_cb = NULL } +}; + +enum method_handler_index { + METHOD_HANDLER_SUSPEND, + METHOD_HANDLER_GET_PORT_BY_NAME, + METHOD_HANDLER_MAX +}; + +static pa_dbus_arg_info suspend_args[] = { { "suspend", "b", "in" } }; +static pa_dbus_arg_info get_port_by_name_args[] = { { "name", "s", "in" }, { "port", "o", "out" } }; + +static pa_dbus_method_handler method_handlers[METHOD_HANDLER_MAX] = { + [METHOD_HANDLER_SUSPEND] = { + .method_name = "Suspend", + .arguments = suspend_args, + .n_arguments = sizeof(suspend_args) / sizeof(pa_dbus_arg_info), + .receive_cb = handle_suspend }, + [METHOD_HANDLER_GET_PORT_BY_NAME] = { + .method_name = "GetPortByName", + .arguments = get_port_by_name_args, + .n_arguments = sizeof(get_port_by_name_args) / sizeof(pa_dbus_arg_info), + .receive_cb = handle_get_port_by_name } +}; + +enum signal_index { + SIGNAL_VOLUME_UPDATED, + SIGNAL_MUTE_UPDATED, + SIGNAL_STATE_UPDATED, + SIGNAL_ACTIVE_PORT_UPDATED, + SIGNAL_PROPERTY_LIST_UPDATED, + SIGNAL_MAX +}; + +static pa_dbus_arg_info volume_updated_args[] = { { "volume", "au", NULL } }; +static pa_dbus_arg_info mute_updated_args[] = { { "muted", "b", NULL } }; +static pa_dbus_arg_info state_updated_args[] = { { "state", "u", NULL } }; +static pa_dbus_arg_info active_port_updated_args[] = { { "port", "o", NULL } }; +static pa_dbus_arg_info property_list_updated_args[] = { { "property_list", "a{say}", NULL } }; + +static pa_dbus_signal_info signals[SIGNAL_MAX] = { + [SIGNAL_VOLUME_UPDATED] = { .name = "VolumeUpdated", .arguments = volume_updated_args, .n_arguments = 1 }, + [SIGNAL_MUTE_UPDATED] = { .name = "MuteUpdated", .arguments = mute_updated_args, .n_arguments = 1 }, + [SIGNAL_STATE_UPDATED] = { .name = "StateUpdated", .arguments = state_updated_args, .n_arguments = 1 }, + [SIGNAL_ACTIVE_PORT_UPDATED] = { .name = "ActivePortUpdated", .arguments = active_port_updated_args, .n_arguments = 1 }, + [SIGNAL_PROPERTY_LIST_UPDATED] = { .name = "PropertyListUpdated", .arguments = property_list_updated_args, .n_arguments = 1 } +}; + +static pa_dbus_interface_info device_interface_info = { + .name = PA_DBUSIFACE_DEVICE_INTERFACE, + .method_handlers = method_handlers, + .n_method_handlers = METHOD_HANDLER_MAX, + .property_handlers = property_handlers, + .n_property_handlers = PROPERTY_HANDLER_MAX, + .get_all_properties_cb = handle_get_all, + .signals = signals, + .n_signals = SIGNAL_MAX +}; + +static pa_dbus_interface_info sink_interface_info = { + .name = PA_DBUSIFACE_SINK_INTERFACE, + .method_handlers = NULL, + .n_method_handlers = 0, + .property_handlers = sink_property_handlers, + .n_property_handlers = SINK_PROPERTY_HANDLER_MAX, + .get_all_properties_cb = handle_sink_get_all, + .signals = NULL, + .n_signals = 0 +}; + +static pa_dbus_interface_info source_interface_info = { + .name = PA_DBUSIFACE_SOURCE_INTERFACE, + .method_handlers = NULL, + .n_method_handlers = 0, + .property_handlers = source_property_handlers, + .n_property_handlers = SOURCE_PROPERTY_HANDLER_MAX, + .get_all_properties_cb = handle_source_get_all, + .signals = NULL, + .n_signals = 0 +}; + +static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + dbus_uint32_t idx = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + idx = (d->type == PA_DEVICE_TYPE_SINK) ? d->sink->index : d->source->index; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &idx); +} + +static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + const char *name = NULL; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + name = (d->type == PA_DEVICE_TYPE_SINK) ? d->sink->name : d->source->name; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &name); +} + +static void handle_get_driver(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + const char *driver = NULL; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + driver = (d->type == PA_DEVICE_TYPE_SINK) ? d->sink->driver : d->source->driver; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &driver); +} + +static void handle_get_owner_module(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + pa_module *owner_module = NULL; + const char *object_path = NULL; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + owner_module = (d->type == PA_DEVICE_TYPE_SINK) ? d->sink->module : d->source->module; + + if (!owner_module) { + if (d->type == PA_DEVICE_TYPE_SINK) + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, + "Sink %s doesn't have an owner module.", d->sink->name); + else + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, + "Source %s doesn't have an owner module.", d->source->name); + return; + } + + object_path = pa_dbusiface_core_get_module_path(d->core, owner_module); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path); +} + +static void handle_get_card(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + pa_card *card = NULL; + const char *object_path = NULL; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + card = (d->type == PA_DEVICE_TYPE_SINK) ? d->sink->card : d->source->card; + + if (!card) { + if (d->type == PA_DEVICE_TYPE_SINK) + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, + "Sink %s doesn't belong to any card.", d->sink->name); + else + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, + "Source %s doesn't belong to any card.", d->source->name); + return; + } + + object_path = pa_dbusiface_core_get_card_path(d->core, card); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path); +} + +static void handle_get_sample_format(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + dbus_uint32_t sample_format = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + sample_format = (d->type == PA_DEVICE_TYPE_SINK) ? d->sink->sample_spec.format : d->source->sample_spec.format; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &sample_format); +} + +static void handle_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + dbus_uint32_t sample_rate = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + sample_rate = (d->type == PA_DEVICE_TYPE_SINK) ? d->sink->sample_spec.rate : d->source->sample_spec.rate; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &sample_rate); +} + +static void handle_get_channels(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + pa_channel_map *channel_map = NULL; + dbus_uint32_t channels[PA_CHANNELS_MAX]; + unsigned i = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + channel_map = (d->type == PA_DEVICE_TYPE_SINK) ? &d->sink->channel_map : &d->source->channel_map; + + for (i = 0; i < channel_map->channels; ++i) + channels[i] = channel_map->map[i]; + + pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_UINT32, channels, channel_map->channels); +} + +static void handle_get_volume(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + dbus_uint32_t volume[PA_CHANNELS_MAX]; + unsigned i = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + for (i = 0; i < d->volume.channels; ++i) + volume[i] = d->volume.values[i]; + + pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_UINT32, volume, d->volume.channels); +} + +static void handle_set_volume(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) { + pa_dbusiface_device *d = userdata; + DBusMessageIter array_iter; + int device_channels = 0; + dbus_uint32_t *volume = NULL; + int n_volume_entries = 0; + pa_cvolume new_vol; + int i = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(iter); + pa_assert(d); + + device_channels = (d->type == PA_DEVICE_TYPE_SINK) ? d->sink->channel_map.channels : d->source->channel_map.channels; + + dbus_message_iter_recurse(iter, &array_iter); + dbus_message_iter_get_fixed_array(&array_iter, &volume, &n_volume_entries); + + if (n_volume_entries != device_channels && n_volume_entries != 1) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, + "Expected %u volume entries, got %i.", device_channels, n_volume_entries); + return; + } + + pa_cvolume_init(&new_vol); + new_vol.channels = n_volume_entries; + + for (i = 0; i < n_volume_entries; ++i) { + if (!PA_VOLUME_IS_VALID(volume[i])) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too large volume value: %u", volume[i]); + return; + } + new_vol.values[i] = volume[i]; + } + + if (d->type == PA_DEVICE_TYPE_SINK) + pa_sink_set_volume(d->sink, &new_vol, true, true); + else + pa_source_set_volume(d->source, &new_vol, true, true); + + pa_dbus_send_empty_reply(conn, msg); +} + +static void handle_get_has_flat_volume(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + dbus_bool_t has_flat_volume = FALSE; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + has_flat_volume = (d->type == PA_DEVICE_TYPE_SINK) ? !!(d->sink->flags & PA_SINK_FLAT_VOLUME) : FALSE; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &has_flat_volume); +} + +static void handle_get_has_convertible_to_decibel_volume(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + dbus_bool_t has_convertible_to_decibel_volume = FALSE; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + has_convertible_to_decibel_volume = (d->type == PA_DEVICE_TYPE_SINK) + ? !!(d->sink->flags & PA_SINK_DECIBEL_VOLUME) + : !!(d->source->flags & PA_SOURCE_DECIBEL_VOLUME); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &has_convertible_to_decibel_volume); +} + +static void handle_get_base_volume(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + dbus_uint32_t base_volume; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + base_volume = (d->type == PA_DEVICE_TYPE_SINK) ? d->sink->base_volume : d->source->base_volume; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &base_volume); +} + +static void handle_get_volume_steps(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + dbus_uint32_t volume_steps; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + volume_steps = (d->type == PA_DEVICE_TYPE_SINK) ? d->sink->n_volume_steps : d->source->n_volume_steps; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &volume_steps); +} + +static void handle_get_mute(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &d->mute); +} + +static void handle_set_mute(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) { + pa_dbusiface_device *d = userdata; + dbus_bool_t mute = FALSE; + + pa_assert(conn); + pa_assert(msg); + pa_assert(iter); + pa_assert(d); + + dbus_message_iter_get_basic(iter, &mute); + + if (d->type == PA_DEVICE_TYPE_SINK) + pa_sink_set_mute(d->sink, mute, true); + else + pa_source_set_mute(d->source, mute, true); + + pa_dbus_send_empty_reply(conn, msg); +} + +static void handle_get_has_hardware_volume(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + dbus_bool_t has_hardware_volume = FALSE; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + has_hardware_volume = (d->type == PA_DEVICE_TYPE_SINK) + ? !!(d->sink->flags & PA_SINK_HW_VOLUME_CTRL) + : !!(d->source->flags & PA_SOURCE_HW_VOLUME_CTRL); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &has_hardware_volume); +} + +static void handle_get_has_hardware_mute(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + dbus_bool_t has_hardware_mute = FALSE; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + has_hardware_mute = (d->type == PA_DEVICE_TYPE_SINK) + ? !!(d->sink->flags & PA_SINK_HW_MUTE_CTRL) + : !!(d->source->flags & PA_SOURCE_HW_MUTE_CTRL); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &has_hardware_mute); +} + +static void handle_get_configured_latency(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + dbus_uint64_t configured_latency = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + configured_latency = (d->type == PA_DEVICE_TYPE_SINK) + ? pa_sink_get_requested_latency(d->sink) + : pa_source_get_requested_latency(d->source); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT64, &configured_latency); +} + +static void handle_get_has_dynamic_latency(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + dbus_bool_t has_dynamic_latency = FALSE; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + has_dynamic_latency = (d->type == PA_DEVICE_TYPE_SINK) + ? !!(d->sink->flags & PA_SINK_DYNAMIC_LATENCY) + : !!(d->source->flags & PA_SOURCE_DYNAMIC_LATENCY); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &has_dynamic_latency); +} + +static void handle_get_latency(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + dbus_uint64_t latency = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + if (d->type == PA_DEVICE_TYPE_SINK && !(d->sink->flags & PA_SINK_LATENCY)) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, + "Sink %s doesn't support latency querying.", d->sink->name); + return; + } + + if (d->type == PA_DEVICE_TYPE_SOURCE && !(d->source->flags & PA_SOURCE_LATENCY)) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, + "Source %s doesn't support latency querying.", d->source->name); + return; + } + + latency = (d->type == PA_DEVICE_TYPE_SINK) ? pa_sink_get_latency(d->sink) : pa_source_get_latency(d->source); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT64, &latency); +} + +static void handle_get_is_hardware_device(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + dbus_bool_t is_hardware_device = FALSE; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + is_hardware_device = (d->type == PA_DEVICE_TYPE_SINK) + ? !!(d->sink->flags & PA_SINK_HARDWARE) + : !!(d->source->flags & PA_SOURCE_HARDWARE); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &is_hardware_device); +} + +static void handle_get_is_network_device(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + dbus_bool_t is_network_device = FALSE; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + is_network_device = (d->type == PA_DEVICE_TYPE_SINK) + ? !!(d->sink->flags & PA_SINK_NETWORK) + : !!(d->source->flags & PA_SOURCE_NETWORK); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &is_network_device); +} + +static void handle_get_state(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + dbus_uint32_t state; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + state = (d->type == PA_DEVICE_TYPE_SINK) ? d->sink_state : d->source_state; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &state); +} + +/* The caller frees the array, but not the strings. */ +static const char **get_ports(pa_dbusiface_device *d, unsigned *n) { + const char **ports; + unsigned i = 0; + void *state = NULL; + pa_dbusiface_device_port *port = NULL; + + pa_assert(d); + pa_assert(n); + + *n = pa_hashmap_size(d->ports); + + if (*n == 0) + return NULL; + + ports = pa_xnew(const char *, *n); + + PA_HASHMAP_FOREACH(port, d->ports, state) + ports[i++] = pa_dbusiface_device_port_get_path(port); + + return ports; +} + +static void handle_get_ports(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + const char **ports = NULL; + unsigned n_ports = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + ports = get_ports(d, &n_ports); + + pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, ports, n_ports); + + pa_xfree(ports); +} + +static void handle_get_active_port(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + const char *active_port; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + if (!d->active_port) { + pa_assert(pa_hashmap_isempty(d->ports)); + + if (d->type == PA_DEVICE_TYPE_SINK) + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, + "The sink %s has no ports, and therefore there's no active port either.", d->sink->name); + else + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, + "The source %s has no ports, and therefore there's no active port either.", d->source->name); + return; + } + + active_port = pa_dbusiface_device_port_get_path(pa_hashmap_get(d->ports, d->active_port->name)); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &active_port); +} + +static void handle_set_active_port(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) { + pa_dbusiface_device *d = userdata; + const char *new_active_path; + pa_dbusiface_device_port *port; + void *state; + pa_dbusiface_device_port *new_active = NULL; + int r; + + pa_assert(conn); + pa_assert(msg); + pa_assert(iter); + pa_assert(d); + + if (!d->active_port) { + pa_assert(pa_hashmap_isempty(d->ports)); + + if (d->type == PA_DEVICE_TYPE_SINK) + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, + "The sink %s has no ports, and therefore there's no active port either.", d->sink->name); + else + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, + "The source %s has no ports, and therefore there's no active port either.", d->source->name); + return; + } + + dbus_message_iter_get_basic(iter, &new_active_path); + + PA_HASHMAP_FOREACH(port, d->ports, state) { + if (pa_streq(pa_dbusiface_device_port_get_path(port), new_active_path)) { + new_active = port; + break; + } + } + + if (!new_active) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "No such port: %s", new_active_path); + return; + } + + if (d->type == PA_DEVICE_TYPE_SINK) { + if ((r = pa_sink_set_port(d->sink, pa_dbusiface_device_port_get_name(new_active), true)) < 0) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, + "Internal error in PulseAudio: pa_sink_set_port() failed with error code %i.", r); + return; + } + } else { + if ((r = pa_source_set_port(d->source, pa_dbusiface_device_port_get_name(new_active), true)) < 0) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, + "Internal error in PulseAudio: pa_source_set_port() failed with error code %i.", r); + return; + } + } + + pa_dbus_send_empty_reply(conn, msg); +} + +static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + pa_dbus_send_proplist_variant_reply(conn, msg, d->proplist); +} + +static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + DBusMessage *reply = NULL; + DBusMessageIter msg_iter; + DBusMessageIter dict_iter; + dbus_uint32_t idx = 0; + const char *name = NULL; + const char *driver = NULL; + pa_module *owner_module = NULL; + const char *owner_module_path = NULL; + pa_card *card = NULL; + const char *card_path = NULL; + dbus_uint32_t sample_format = 0; + dbus_uint32_t sample_rate = 0; + pa_channel_map *channel_map = NULL; + dbus_uint32_t channels[PA_CHANNELS_MAX]; + dbus_uint32_t volume[PA_CHANNELS_MAX]; + dbus_bool_t has_flat_volume = FALSE; + dbus_bool_t has_convertible_to_decibel_volume = FALSE; + dbus_uint32_t base_volume = 0; + dbus_uint32_t volume_steps = 0; + dbus_bool_t has_hardware_volume = FALSE; + dbus_bool_t has_hardware_mute = FALSE; + dbus_uint64_t configured_latency = 0; + dbus_bool_t has_dynamic_latency = FALSE; + dbus_uint64_t latency = 0; + dbus_bool_t is_hardware_device = FALSE; + dbus_bool_t is_network_device = FALSE; + dbus_uint32_t state = 0; + const char **ports = NULL; + unsigned n_ports = 0; + const char *active_port = NULL; + unsigned i = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + if (d->type == PA_DEVICE_TYPE_SINK) { + idx = d->sink->index; + name = d->sink->name; + driver = d->sink->driver; + owner_module = d->sink->module; + card = d->sink->card; + sample_format = d->sink->sample_spec.format; + sample_rate = d->sink->sample_spec.rate; + channel_map = &d->sink->channel_map; + has_flat_volume = !!(d->sink->flags & PA_SINK_FLAT_VOLUME); + has_convertible_to_decibel_volume = !!(d->sink->flags & PA_SINK_DECIBEL_VOLUME); + base_volume = d->sink->base_volume; + volume_steps = d->sink->n_volume_steps; + has_hardware_volume = !!(d->sink->flags & PA_SINK_HW_VOLUME_CTRL); + has_hardware_mute = !!(d->sink->flags & PA_SINK_HW_MUTE_CTRL); + configured_latency = pa_sink_get_requested_latency(d->sink); + has_dynamic_latency = !!(d->sink->flags & PA_SINK_DYNAMIC_LATENCY); + latency = pa_sink_get_latency(d->sink); + is_hardware_device = !!(d->sink->flags & PA_SINK_HARDWARE); + is_network_device = !!(d->sink->flags & PA_SINK_NETWORK); + state = d->sink->state; + } else { + idx = d->source->index; + name = d->source->name; + driver = d->source->driver; + owner_module = d->source->module; + card = d->source->card; + sample_format = d->source->sample_spec.format; + sample_rate = d->source->sample_spec.rate; + channel_map = &d->source->channel_map; + has_flat_volume = FALSE; + has_convertible_to_decibel_volume = !!(d->source->flags & PA_SOURCE_DECIBEL_VOLUME); + base_volume = d->source->base_volume; + volume_steps = d->source->n_volume_steps; + has_hardware_volume = !!(d->source->flags & PA_SOURCE_HW_VOLUME_CTRL); + has_hardware_mute = !!(d->source->flags & PA_SOURCE_HW_MUTE_CTRL); + configured_latency = pa_source_get_requested_latency(d->source); + has_dynamic_latency = !!(d->source->flags & PA_SOURCE_DYNAMIC_LATENCY); + latency = pa_source_get_latency(d->source); + is_hardware_device = !!(d->source->flags & PA_SOURCE_HARDWARE); + is_network_device = !!(d->source->flags & PA_SOURCE_NETWORK); + state = d->source->state; + } + if (owner_module) + owner_module_path = pa_dbusiface_core_get_module_path(d->core, owner_module); + if (card) + card_path = pa_dbusiface_core_get_card_path(d->core, card); + for (i = 0; i < channel_map->channels; ++i) + channels[i] = channel_map->map[i]; + for (i = 0; i < d->volume.channels; ++i) + volume[i] = d->volume.values[i]; + ports = get_ports(d, &n_ports); + if (d->active_port) + active_port = pa_dbusiface_device_port_get_path(pa_hashmap_get(d->ports, d->active_port->name)); + + pa_assert_se((reply = dbus_message_new_method_return(msg))); + + dbus_message_iter_init_append(reply, &msg_iter); + pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter)); + + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_INDEX].property_name, DBUS_TYPE_UINT32, &idx); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_NAME].property_name, DBUS_TYPE_STRING, &name); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DRIVER].property_name, DBUS_TYPE_STRING, &driver); + + if (owner_module) + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_OWNER_MODULE].property_name, DBUS_TYPE_OBJECT_PATH, &owner_module_path); + + if (card) + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_CARD].property_name, DBUS_TYPE_OBJECT_PATH, &card_path); + + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SAMPLE_FORMAT].property_name, DBUS_TYPE_UINT32, &sample_format); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SAMPLE_RATE].property_name, DBUS_TYPE_UINT32, &sample_rate); + pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_CHANNELS].property_name, DBUS_TYPE_UINT32, channels, channel_map->channels); + pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_VOLUME].property_name, DBUS_TYPE_UINT32, volume, d->volume.channels); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_HAS_FLAT_VOLUME].property_name, DBUS_TYPE_BOOLEAN, &has_flat_volume); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_HAS_CONVERTIBLE_TO_DECIBEL_VOLUME].property_name, DBUS_TYPE_BOOLEAN, &has_convertible_to_decibel_volume); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_BASE_VOLUME].property_name, DBUS_TYPE_UINT32, &base_volume); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_VOLUME_STEPS].property_name, DBUS_TYPE_UINT32, &volume_steps); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_MUTE].property_name, DBUS_TYPE_BOOLEAN, &d->mute); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_HAS_HARDWARE_VOLUME].property_name, DBUS_TYPE_BOOLEAN, &has_hardware_volume); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_HAS_HARDWARE_MUTE].property_name, DBUS_TYPE_BOOLEAN, &has_hardware_mute); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_CONFIGURED_LATENCY].property_name, DBUS_TYPE_UINT64, &configured_latency); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_HAS_DYNAMIC_LATENCY].property_name, DBUS_TYPE_BOOLEAN, &has_dynamic_latency); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_LATENCY].property_name, DBUS_TYPE_UINT64, &latency); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_IS_HARDWARE_DEVICE].property_name, DBUS_TYPE_BOOLEAN, &is_hardware_device); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_IS_NETWORK_DEVICE].property_name, DBUS_TYPE_BOOLEAN, &is_network_device); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_STATE].property_name, DBUS_TYPE_UINT32, &state); + pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PORTS].property_name, DBUS_TYPE_OBJECT_PATH, ports, n_ports); + + if (active_port) + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_ACTIVE_PORT].property_name, DBUS_TYPE_OBJECT_PATH, &active_port); + + pa_dbus_append_proplist_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PROPERTY_LIST].property_name, d->proplist); + + pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter)); + + pa_assert_se(dbus_connection_send(conn, reply, NULL)); + + dbus_message_unref(reply); + + pa_xfree(ports); +} + +static void handle_suspend(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + dbus_bool_t suspend = FALSE; + pa_client *client; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + pa_assert_se(dbus_message_get_args(msg, NULL, DBUS_TYPE_BOOLEAN, &suspend, DBUS_TYPE_INVALID)); + pa_assert_se(client = pa_dbus_protocol_get_client(d->dbus_protocol, conn)); + + if (d->type == PA_DEVICE_TYPE_SINK) { + pa_log_debug("%s sink %s requested by client %" PRIu32 ".", suspend ? "Suspending" : "Resuming", d->sink->name, client->index); + + if (pa_sink_suspend(d->sink, suspend, PA_SUSPEND_USER) < 0) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "Internal error in PulseAudio: pa_sink_suspend() failed."); + return; + } + + } else { + pa_log_debug("%s source %s requested by client %" PRIu32 ".", suspend ? "Suspending" : "Resuming", d->source->name, client->index); + + if (pa_source_suspend(d->source, suspend, PA_SUSPEND_USER) < 0) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "Internal error in PulseAudio: pa_source_suspend() failed."); + return; + } + } + + pa_dbus_send_empty_reply(conn, msg); +} + +static void handle_get_port_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + const char *port_name = NULL; + pa_dbusiface_device_port *port = NULL; + const char *port_path = NULL; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + + pa_assert_se(dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &port_name, DBUS_TYPE_INVALID)); + + if (!(port = pa_hashmap_get(d->ports, port_name))) { + if (d->type == PA_DEVICE_TYPE_SINK) + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, + "%s: No such port on sink %s.", port_name, d->sink->name); + else + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, + "%s: No such port on source %s.", port_name, d->source->name); + return; + } + + port_path = pa_dbusiface_device_port_get_path(port); + + pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &port_path); +} + +static void handle_sink_get_monitor_source(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + const char *monitor_source = NULL; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + pa_assert(d->type == PA_DEVICE_TYPE_SINK); + + monitor_source = pa_dbusiface_core_get_source_path(d->core, d->sink->monitor_source); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &monitor_source); +} + +static void handle_sink_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + DBusMessage *reply = NULL; + DBusMessageIter msg_iter; + DBusMessageIter dict_iter; + const char *monitor_source = NULL; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + pa_assert(d->type == PA_DEVICE_TYPE_SINK); + + monitor_source = pa_dbusiface_core_get_source_path(d->core, d->sink->monitor_source); + + pa_assert_se((reply = dbus_message_new_method_return(msg))); + + dbus_message_iter_init_append(reply, &msg_iter); + pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter)); + + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[SINK_PROPERTY_HANDLER_MONITOR_SOURCE].property_name, DBUS_TYPE_OBJECT_PATH, &monitor_source); + + pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter)); + + pa_assert_se(dbus_connection_send(conn, reply, NULL)); + + dbus_message_unref(reply); +} + +static void handle_source_get_monitor_of_sink(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + const char *monitor_of_sink = NULL; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + pa_assert(d->type == PA_DEVICE_TYPE_SOURCE); + + if (!d->source->monitor_of) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Source %s is not a monitor source.", d->source->name); + return; + } + + monitor_of_sink = pa_dbusiface_core_get_sink_path(d->core, d->source->monitor_of); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &monitor_of_sink); +} + +static void handle_source_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_device *d = userdata; + DBusMessage *reply = NULL; + DBusMessageIter msg_iter; + DBusMessageIter dict_iter; + const char *monitor_of_sink = NULL; + + pa_assert(conn); + pa_assert(msg); + pa_assert(d); + pa_assert(d->type == PA_DEVICE_TYPE_SOURCE); + + if (d->source->monitor_of) + monitor_of_sink = pa_dbusiface_core_get_sink_path(d->core, d->source->monitor_of); + + pa_assert_se((reply = dbus_message_new_method_return(msg))); + + dbus_message_iter_init_append(reply, &msg_iter); + pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter)); + + if (monitor_of_sink) + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[SOURCE_PROPERTY_HANDLER_MONITOR_OF_SINK].property_name, DBUS_TYPE_OBJECT_PATH, &monitor_of_sink); + + pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter)); + + pa_assert_se(dbus_connection_send(conn, reply, NULL)); + + dbus_message_unref(reply); +} + +static pa_hook_result_t volume_changed_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_device *d = slot_data; + DBusMessage *signal_msg = NULL; + const pa_cvolume *new_volume = NULL; + unsigned i = 0; + + if ((d->type == PA_DEVICE_TYPE_SINK && d->sink != call_data) || + (d->type == PA_DEVICE_TYPE_SOURCE && d->source != call_data)) + return PA_HOOK_OK; + + new_volume = (d->type == PA_DEVICE_TYPE_SINK) + ? pa_sink_get_volume(d->sink, false) + : pa_source_get_volume(d->source, false); + + if (!pa_cvolume_equal(&d->volume, new_volume)) { + dbus_uint32_t volume[PA_CHANNELS_MAX]; + dbus_uint32_t *volume_ptr = volume; + + d->volume = *new_volume; + + for (i = 0; i < d->volume.channels; ++i) + volume[i] = d->volume.values[i]; + + pa_assert_se(signal_msg = dbus_message_new_signal(d->path, + PA_DBUSIFACE_DEVICE_INTERFACE, + signals[SIGNAL_VOLUME_UPDATED].name)); + pa_assert_se(dbus_message_append_args(signal_msg, + DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &volume_ptr, d->volume.channels, + DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(d->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + } + + return PA_HOOK_OK; +} + +static pa_hook_result_t mute_changed_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_device *d = slot_data; + DBusMessage *signal_msg = NULL; + bool new_mute = false; + + if ((d->type == PA_DEVICE_TYPE_SINK && d->sink != call_data) || + (d->type == PA_DEVICE_TYPE_SOURCE && d->source != call_data)) + return PA_HOOK_OK; + + new_mute = (d->type == PA_DEVICE_TYPE_SINK) + ? pa_sink_get_mute(d->sink, false) + : pa_source_get_mute(d->source, false); + + if (d->mute != new_mute) { + d->mute = new_mute; + + pa_assert_se(signal_msg = dbus_message_new_signal(d->path, + PA_DBUSIFACE_DEVICE_INTERFACE, + signals[SIGNAL_MUTE_UPDATED].name)); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_BOOLEAN, &d->mute, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(d->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + } + + return PA_HOOK_OK; +} + +static pa_hook_result_t state_changed_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_device *d = slot_data; + DBusMessage *signal_msg = NULL; + pa_sink_state_t new_sink_state = 0; + pa_source_state_t new_source_state = 0; + + if ((d->type == PA_DEVICE_TYPE_SINK && d->sink != call_data) || + (d->type == PA_DEVICE_TYPE_SOURCE && d->source != call_data)) + return PA_HOOK_OK; + + if (d->type == PA_DEVICE_TYPE_SINK) + new_sink_state = d->sink->state; + else + new_source_state = d->source->state; + + if ((d->type == PA_DEVICE_TYPE_SINK && d->sink_state != new_sink_state) + || (d->type == PA_DEVICE_TYPE_SOURCE && d->source_state != new_source_state)) { + dbus_uint32_t state = 0; + + if (d->type == PA_DEVICE_TYPE_SINK) + d->sink_state = new_sink_state; + else + d->source_state = new_source_state; + + state = (d->type == PA_DEVICE_TYPE_SINK) ? d->sink_state : d->source_state; + + pa_assert_se(signal_msg = dbus_message_new_signal(d->path, + PA_DBUSIFACE_DEVICE_INTERFACE, + signals[SIGNAL_STATE_UPDATED].name)); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_UINT32, &state, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(d->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + } + + return PA_HOOK_OK; +} + +static pa_hook_result_t port_changed_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_device *d = slot_data; + DBusMessage *signal_msg = NULL; + pa_device_port *new_active_port = NULL; + + if ((d->type == PA_DEVICE_TYPE_SINK && d->sink != call_data) || + (d->type == PA_DEVICE_TYPE_SOURCE && d->source != call_data)) + return PA_HOOK_OK; + + new_active_port = (d->type == PA_DEVICE_TYPE_SINK) ? d->sink->active_port : d->source->active_port; + + if (d->active_port != new_active_port) { + const char *object_path = NULL; + + d->active_port = new_active_port; + object_path = pa_dbusiface_device_port_get_path(pa_hashmap_get(d->ports, d->active_port->name)); + + pa_assert_se(signal_msg = dbus_message_new_signal(d->path, + PA_DBUSIFACE_DEVICE_INTERFACE, + signals[SIGNAL_ACTIVE_PORT_UPDATED].name)); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(d->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + } + + return PA_HOOK_OK; +} + +static pa_hook_result_t proplist_changed_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_device *d = slot_data; + DBusMessage *signal_msg = NULL; + pa_proplist *new_proplist = NULL; + + if ((d->type == PA_DEVICE_TYPE_SINK && d->sink != call_data) || + (d->type == PA_DEVICE_TYPE_SOURCE && d->source != call_data)) + return PA_HOOK_OK; + + new_proplist = (d->type == PA_DEVICE_TYPE_SINK) ? d->sink->proplist : d->source->proplist; + + if (!pa_proplist_equal(d->proplist, new_proplist)) { + DBusMessageIter msg_iter; + + pa_proplist_update(d->proplist, PA_UPDATE_SET, new_proplist); + + pa_assert_se(signal_msg = dbus_message_new_signal(d->path, + PA_DBUSIFACE_DEVICE_INTERFACE, + signals[SIGNAL_PROPERTY_LIST_UPDATED].name)); + dbus_message_iter_init_append(signal_msg, &msg_iter); + pa_dbus_append_proplist(&msg_iter, d->proplist); + + pa_dbus_protocol_send_signal(d->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + } + + return PA_HOOK_OK; +} + +pa_dbusiface_device *pa_dbusiface_device_new_sink(pa_dbusiface_core *core, pa_sink *sink) { + pa_dbusiface_device *d = NULL; + pa_device_port *port; + void *state; + + pa_assert(core); + pa_assert(sink); + + d = pa_xnew0(pa_dbusiface_device, 1); + d->core = core; + d->sink = pa_sink_ref(sink); + d->type = PA_DEVICE_TYPE_SINK; + d->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, SINK_OBJECT_NAME, sink->index); + d->volume = *pa_sink_get_volume(sink, false); + d->mute = pa_sink_get_mute(sink, false); + d->sink_state = sink->state; + d->ports = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, (pa_free_cb_t) pa_dbusiface_device_port_free); + d->next_port_index = 0; + d->active_port = sink->active_port; + d->proplist = pa_proplist_copy(sink->proplist); + d->dbus_protocol = pa_dbus_protocol_get(sink->core); + d->volume_changed_slot = pa_hook_connect(&sink->core->hooks[PA_CORE_HOOK_SINK_VOLUME_CHANGED], + PA_HOOK_NORMAL, volume_changed_cb, d); + d->mute_changed_slot = pa_hook_connect(&sink->core->hooks[PA_CORE_HOOK_SINK_MUTE_CHANGED], + PA_HOOK_NORMAL, mute_changed_cb, d); + d->state_changed_slot = pa_hook_connect(&sink->core->hooks[PA_CORE_HOOK_SINK_STATE_CHANGED], + PA_HOOK_NORMAL, state_changed_cb, d); + d->port_changed_slot = pa_hook_connect(&sink->core->hooks[PA_CORE_HOOK_SINK_PORT_CHANGED], + PA_HOOK_NORMAL, port_changed_cb, d); + d->proplist_changed_slot = pa_hook_connect(&sink->core->hooks[PA_CORE_HOOK_SINK_PROPLIST_CHANGED], + PA_HOOK_NORMAL, proplist_changed_cb, d); + + PA_HASHMAP_FOREACH(port, sink->ports, state) { + pa_dbusiface_device_port *p = pa_dbusiface_device_port_new(d, sink->core, port, d->next_port_index++); + pa_hashmap_put(d->ports, (char *) pa_dbusiface_device_port_get_name(p), p); + } + + pa_assert_se(pa_dbus_protocol_add_interface(d->dbus_protocol, d->path, &device_interface_info, d) >= 0); + pa_assert_se(pa_dbus_protocol_add_interface(d->dbus_protocol, d->path, &sink_interface_info, d) >= 0); + + return d; +} + +pa_dbusiface_device *pa_dbusiface_device_new_source(pa_dbusiface_core *core, pa_source *source) { + pa_dbusiface_device *d = NULL; + pa_device_port *port; + void *state; + + pa_assert(core); + pa_assert(source); + + d = pa_xnew0(pa_dbusiface_device, 1); + d->core = core; + d->source = pa_source_ref(source); + d->type = PA_DEVICE_TYPE_SOURCE; + d->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, SOURCE_OBJECT_NAME, source->index); + d->volume = *pa_source_get_volume(source, false); + d->mute = pa_source_get_mute(source, false); + d->source_state = source->state; + d->ports = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, (pa_free_cb_t) pa_dbusiface_device_port_free); + d->next_port_index = 0; + d->active_port = source->active_port; + d->proplist = pa_proplist_copy(source->proplist); + d->dbus_protocol = pa_dbus_protocol_get(source->core); + d->volume_changed_slot = pa_hook_connect(&source->core->hooks[PA_CORE_HOOK_SOURCE_VOLUME_CHANGED], + PA_HOOK_NORMAL, volume_changed_cb, d); + d->mute_changed_slot = pa_hook_connect(&source->core->hooks[PA_CORE_HOOK_SOURCE_MUTE_CHANGED], + PA_HOOK_NORMAL, mute_changed_cb, d); + d->state_changed_slot = pa_hook_connect(&source->core->hooks[PA_CORE_HOOK_SOURCE_STATE_CHANGED], + PA_HOOK_NORMAL, state_changed_cb, d); + d->port_changed_slot = pa_hook_connect(&source->core->hooks[PA_CORE_HOOK_SOURCE_PORT_CHANGED], + PA_HOOK_NORMAL, port_changed_cb, d); + d->proplist_changed_slot = pa_hook_connect(&source->core->hooks[PA_CORE_HOOK_SOURCE_PROPLIST_CHANGED], + PA_HOOK_NORMAL, proplist_changed_cb, d); + + PA_HASHMAP_FOREACH(port, source->ports, state) { + pa_dbusiface_device_port *p = pa_dbusiface_device_port_new(d, source->core, port, d->next_port_index++); + pa_hashmap_put(d->ports, (char *) pa_dbusiface_device_port_get_name(p), p); + } + + pa_assert_se(pa_dbus_protocol_add_interface(d->dbus_protocol, d->path, &device_interface_info, d) >= 0); + pa_assert_se(pa_dbus_protocol_add_interface(d->dbus_protocol, d->path, &source_interface_info, d) >= 0); + + return d; +} + +void pa_dbusiface_device_free(pa_dbusiface_device *d) { + pa_assert(d); + + pa_hook_slot_free(d->volume_changed_slot); + pa_hook_slot_free(d->mute_changed_slot); + pa_hook_slot_free(d->state_changed_slot); + pa_hook_slot_free(d->port_changed_slot); + pa_hook_slot_free(d->proplist_changed_slot); + + pa_assert_se(pa_dbus_protocol_remove_interface(d->dbus_protocol, d->path, device_interface_info.name) >= 0); + + if (d->type == PA_DEVICE_TYPE_SINK) { + pa_assert_se(pa_dbus_protocol_remove_interface(d->dbus_protocol, d->path, sink_interface_info.name) >= 0); + pa_sink_unref(d->sink); + + } else { + pa_assert_se(pa_dbus_protocol_remove_interface(d->dbus_protocol, d->path, source_interface_info.name) >= 0); + pa_source_unref(d->source); + } + pa_hashmap_free(d->ports); + pa_proplist_free(d->proplist); + pa_dbus_protocol_unref(d->dbus_protocol); + + pa_xfree(d->path); + pa_xfree(d); +} + +const char *pa_dbusiface_device_get_path(pa_dbusiface_device *d) { + pa_assert(d); + + return d->path; +} + +pa_sink *pa_dbusiface_device_get_sink(pa_dbusiface_device *d) { + pa_assert(d); + pa_assert(d->type == PA_DEVICE_TYPE_SINK); + + return d->sink; +} + +pa_source *pa_dbusiface_device_get_source(pa_dbusiface_device *d) { + pa_assert(d); + pa_assert(d->type == PA_DEVICE_TYPE_SOURCE); + + return d->source; +} diff --git a/src/modules/dbus/iface-device.h b/src/modules/dbus/iface-device.h new file mode 100644 index 0000000..97ecd7a --- /dev/null +++ b/src/modules/dbus/iface-device.h @@ -0,0 +1,51 @@ +#ifndef foodbusifacedevicehfoo +#define foodbusifacedevicehfoo + +/*** + This file is part of PulseAudio. + + Copyright 2009 Tanu Kaskinen + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +/* This object implements the D-Bus interfaces org.PulseAudio.Core1.Device, + * org.PulseAudio.Core1.Sink and org.PulseAudio.Core1.Source. + * + * See http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/Developer/Clients/DBus/Device/ + * for the interface documentation. + */ + +#include +#include +#include + +#include "iface-core.h" + +#define PA_DBUSIFACE_DEVICE_INTERFACE PA_DBUS_CORE_INTERFACE ".Device" +#define PA_DBUSIFACE_SINK_INTERFACE PA_DBUS_CORE_INTERFACE ".Sink" +#define PA_DBUSIFACE_SOURCE_INTERFACE PA_DBUS_CORE_INTERFACE ".Source" + +typedef struct pa_dbusiface_device pa_dbusiface_device; + +pa_dbusiface_device *pa_dbusiface_device_new_sink(pa_dbusiface_core *core, pa_sink *sink); +pa_dbusiface_device *pa_dbusiface_device_new_source(pa_dbusiface_core *core, pa_source *source); +void pa_dbusiface_device_free(pa_dbusiface_device *d); + +const char *pa_dbusiface_device_get_path(pa_dbusiface_device *d); + +pa_sink *pa_dbusiface_device_get_sink(pa_dbusiface_device *d); +pa_source *pa_dbusiface_device_get_source(pa_dbusiface_device *d); + +#endif diff --git a/src/modules/dbus/iface-memstats.c b/src/modules/dbus/iface-memstats.c new file mode 100644 index 0000000..cd1d7ea --- /dev/null +++ b/src/modules/dbus/iface-memstats.c @@ -0,0 +1,228 @@ +/*** + This file is part of PulseAudio. + + Copyright 2009 Tanu Kaskinen + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include +#include +#include + +#include "iface-memstats.h" + +#define OBJECT_NAME "memstats" + +static void handle_get_current_memblocks(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_current_memblocks_size(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_accumulated_memblocks(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_accumulated_memblocks_size(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_sample_cache_size(DBusConnection *conn, DBusMessage *msg, void *userdata); + +static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata); + +struct pa_dbusiface_memstats { + pa_core *core; + char *path; + pa_dbus_protocol *dbus_protocol; +}; + +enum property_handler_index { + PROPERTY_HANDLER_CURRENT_MEMBLOCKS, + PROPERTY_HANDLER_CURRENT_MEMBLOCKS_SIZE, + PROPERTY_HANDLER_ACCUMULATED_MEMBLOCKS, + PROPERTY_HANDLER_ACCUMULATED_MEMBLOCKS_SIZE, + PROPERTY_HANDLER_SAMPLE_CACHE_SIZE, + PROPERTY_HANDLER_MAX +}; + +static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = { + [PROPERTY_HANDLER_CURRENT_MEMBLOCKS] = { .property_name = "CurrentMemblocks", .type = "u", .get_cb = handle_get_current_memblocks, .set_cb = NULL }, + [PROPERTY_HANDLER_CURRENT_MEMBLOCKS_SIZE] = { .property_name = "CurrentMemblocksSize", .type = "u", .get_cb = handle_get_current_memblocks_size, .set_cb = NULL }, + [PROPERTY_HANDLER_ACCUMULATED_MEMBLOCKS] = { .property_name = "AccumulatedMemblocks", .type = "u", .get_cb = handle_get_accumulated_memblocks, .set_cb = NULL }, + [PROPERTY_HANDLER_ACCUMULATED_MEMBLOCKS_SIZE] = { .property_name = "AccumulatedMemblocksSize", .type = "u", .get_cb = handle_get_accumulated_memblocks_size, .set_cb = NULL }, + [PROPERTY_HANDLER_SAMPLE_CACHE_SIZE] = { .property_name = "SampleCacheSize", .type = "u", .get_cb = handle_get_sample_cache_size, .set_cb = NULL } +}; + +static pa_dbus_interface_info memstats_interface_info = { + .name = PA_DBUSIFACE_MEMSTATS_INTERFACE, + .method_handlers = NULL, + .n_method_handlers = 0, + .property_handlers = property_handlers, + .n_property_handlers = PROPERTY_HANDLER_MAX, + .get_all_properties_cb = handle_get_all, + .signals = NULL, + .n_signals = 0 +}; + +static void handle_get_current_memblocks(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_memstats *m = userdata; + const pa_mempool_stat *stat; + dbus_uint32_t current_memblocks; + + pa_assert(conn); + pa_assert(msg); + pa_assert(m); + + stat = pa_mempool_get_stat(m->core->mempool); + + current_memblocks = pa_atomic_load(&stat->n_allocated); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, ¤t_memblocks); +} + +static void handle_get_current_memblocks_size(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_memstats *m = userdata; + const pa_mempool_stat *stat; + dbus_uint32_t current_memblocks_size; + + pa_assert(conn); + pa_assert(msg); + pa_assert(m); + + stat = pa_mempool_get_stat(m->core->mempool); + + current_memblocks_size = pa_atomic_load(&stat->allocated_size); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, ¤t_memblocks_size); +} + +static void handle_get_accumulated_memblocks(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_memstats *m = userdata; + const pa_mempool_stat *stat; + dbus_uint32_t accumulated_memblocks; + + pa_assert(conn); + pa_assert(msg); + pa_assert(m); + + stat = pa_mempool_get_stat(m->core->mempool); + + accumulated_memblocks = pa_atomic_load(&stat->n_accumulated); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &accumulated_memblocks); +} + +static void handle_get_accumulated_memblocks_size(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_memstats *m = userdata; + const pa_mempool_stat *stat; + dbus_uint32_t accumulated_memblocks_size; + + pa_assert(conn); + pa_assert(msg); + pa_assert(m); + + stat = pa_mempool_get_stat(m->core->mempool); + + accumulated_memblocks_size = pa_atomic_load(&stat->accumulated_size); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &accumulated_memblocks_size); +} + +static void handle_get_sample_cache_size(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_memstats *m = userdata; + dbus_uint32_t sample_cache_size; + + pa_assert(conn); + pa_assert(msg); + pa_assert(m); + + sample_cache_size = pa_scache_total_size(m->core); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &sample_cache_size); +} + +static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_memstats *m = userdata; + const pa_mempool_stat *stat; + dbus_uint32_t current_memblocks; + dbus_uint32_t current_memblocks_size; + dbus_uint32_t accumulated_memblocks; + dbus_uint32_t accumulated_memblocks_size; + dbus_uint32_t sample_cache_size; + DBusMessage *reply = NULL; + DBusMessageIter msg_iter; + DBusMessageIter dict_iter; + + pa_assert(conn); + pa_assert(msg); + pa_assert(m); + + stat = pa_mempool_get_stat(m->core->mempool); + + current_memblocks = pa_atomic_load(&stat->n_allocated); + current_memblocks_size = pa_atomic_load(&stat->allocated_size); + accumulated_memblocks = pa_atomic_load(&stat->n_accumulated); + accumulated_memblocks_size = pa_atomic_load(&stat->accumulated_size); + sample_cache_size = pa_scache_total_size(m->core); + + pa_assert_se((reply = dbus_message_new_method_return(msg))); + + dbus_message_iter_init_append(reply, &msg_iter); + pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter)); + + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_CURRENT_MEMBLOCKS].property_name, DBUS_TYPE_UINT32, ¤t_memblocks); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_CURRENT_MEMBLOCKS_SIZE].property_name, DBUS_TYPE_UINT32, ¤t_memblocks_size); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_ACCUMULATED_MEMBLOCKS].property_name, DBUS_TYPE_UINT32, &accumulated_memblocks); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_ACCUMULATED_MEMBLOCKS_SIZE].property_name, DBUS_TYPE_UINT32, &accumulated_memblocks_size); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SAMPLE_CACHE_SIZE].property_name, DBUS_TYPE_UINT32, &sample_cache_size); + + pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter)); + + pa_assert_se(dbus_connection_send(conn, reply, NULL)); + + dbus_message_unref(reply); +} + +pa_dbusiface_memstats *pa_dbusiface_memstats_new(pa_dbusiface_core *dbus_core, pa_core *core) { + pa_dbusiface_memstats *m; + + pa_assert(dbus_core); + pa_assert(core); + + m = pa_xnew(pa_dbusiface_memstats, 1); + m->core = core; + m->path = pa_sprintf_malloc("%s/%s", PA_DBUS_CORE_OBJECT_PATH, OBJECT_NAME); + m->dbus_protocol = pa_dbus_protocol_get(core); + + pa_assert_se(pa_dbus_protocol_add_interface(m->dbus_protocol, m->path, &memstats_interface_info, m) >= 0); + + return m; +} + +void pa_dbusiface_memstats_free(pa_dbusiface_memstats *m) { + pa_assert(m); + + pa_assert_se(pa_dbus_protocol_remove_interface(m->dbus_protocol, m->path, memstats_interface_info.name) >= 0); + + pa_xfree(m->path); + + pa_dbus_protocol_unref(m->dbus_protocol); + + pa_xfree(m); +} + +const char *pa_dbusiface_memstats_get_path(pa_dbusiface_memstats *m) { + pa_assert(m); + + return m->path; +} diff --git a/src/modules/dbus/iface-memstats.h b/src/modules/dbus/iface-memstats.h new file mode 100644 index 0000000..482d6be --- /dev/null +++ b/src/modules/dbus/iface-memstats.h @@ -0,0 +1,43 @@ +#ifndef foodbusifacememstatshfoo +#define foodbusifacememstatshfoo + +/*** + This file is part of PulseAudio. + + Copyright 2009 Tanu Kaskinen + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +/* This object implements the D-Bus interface org.PulseAudio.Core1.Memstats. + * + * See http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/Developer/Clients/DBus/Memstats/ + * for the Memstats interface documentation. + */ + +#include +#include + +#include "iface-core.h" + +#define PA_DBUSIFACE_MEMSTATS_INTERFACE PA_DBUS_CORE_INTERFACE ".Memstats" + +typedef struct pa_dbusiface_memstats pa_dbusiface_memstats; + +pa_dbusiface_memstats *pa_dbusiface_memstats_new(pa_dbusiface_core *dbus_core, pa_core *core); +void pa_dbusiface_memstats_free(pa_dbusiface_memstats *m); + +const char *pa_dbusiface_memstats_get_path(pa_dbusiface_memstats *m); + +#endif diff --git a/src/modules/dbus/iface-module.c b/src/modules/dbus/iface-module.c new file mode 100644 index 0000000..222cd73 --- /dev/null +++ b/src/modules/dbus/iface-module.c @@ -0,0 +1,331 @@ +/*** + This file is part of PulseAudio. + + Copyright 2009 Tanu Kaskinen + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#include "iface-module.h" + +#define OBJECT_NAME "module" + +struct pa_dbusiface_module { + pa_module *module; + char *path; + pa_proplist *proplist; + + pa_dbus_protocol *dbus_protocol; + pa_hook_slot *module_proplist_changed_slot; +}; + +static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_arguments(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_usage_counter(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata); + +static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata); + +static void handle_unload(DBusConnection *conn, DBusMessage *msg, void *userdata); + +enum property_handler_index { + PROPERTY_HANDLER_INDEX, + PROPERTY_HANDLER_NAME, + PROPERTY_HANDLER_ARGUMENTS, + PROPERTY_HANDLER_USAGE_COUNTER, + PROPERTY_HANDLER_PROPERTY_LIST, + PROPERTY_HANDLER_MAX +}; + +static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = { + [PROPERTY_HANDLER_INDEX] = { .property_name = "Index", .type = "u", .get_cb = handle_get_index, .set_cb = NULL }, + [PROPERTY_HANDLER_NAME] = { .property_name = "Name", .type = "s", .get_cb = handle_get_name, .set_cb = NULL }, + [PROPERTY_HANDLER_ARGUMENTS] = { .property_name = "Arguments", .type = "a{ss}", .get_cb = handle_get_arguments, .set_cb = NULL }, + [PROPERTY_HANDLER_USAGE_COUNTER] = { .property_name = "UsageCounter", .type = "u", .get_cb = handle_get_usage_counter, .set_cb = NULL }, + [PROPERTY_HANDLER_PROPERTY_LIST] = { .property_name = "PropertyList", .type = "a{say}", .get_cb = handle_get_property_list, .set_cb = NULL } +}; + +enum method_handler_index { + METHOD_HANDLER_UNLOAD, + METHOD_HANDLER_MAX +}; + +static pa_dbus_method_handler method_handlers[METHOD_HANDLER_MAX] = { + [METHOD_HANDLER_UNLOAD] = { + .method_name = "Unload", + .arguments = NULL, + .n_arguments = 0, + .receive_cb = handle_unload } +}; + +enum signal_index { + SIGNAL_PROPERTY_LIST_UPDATED, + SIGNAL_MAX +}; + +static pa_dbus_arg_info property_list_updated_args[] = { { "property_list", "a{say}", NULL } }; + +static pa_dbus_signal_info signals[SIGNAL_MAX] = { + [SIGNAL_PROPERTY_LIST_UPDATED] = { .name = "PropertyListUpdated", .arguments = property_list_updated_args, .n_arguments = 1 } +}; + +static pa_dbus_interface_info module_interface_info = { + .name = PA_DBUSIFACE_MODULE_INTERFACE, + .method_handlers = method_handlers, + .n_method_handlers = METHOD_HANDLER_MAX, + .property_handlers = property_handlers, + .n_property_handlers = PROPERTY_HANDLER_MAX, + .get_all_properties_cb = handle_get_all, + .signals = signals, + .n_signals = SIGNAL_MAX +}; + +static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_module *m = userdata; + dbus_uint32_t idx = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(m); + + idx = m->module->index; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &idx); +} + +static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_module *m = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(m); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &m->module->name); +} + +static void append_modargs_variant(DBusMessageIter *iter, pa_dbusiface_module *m) { + pa_modargs *ma = NULL; + DBusMessageIter variant_iter; + DBusMessageIter dict_iter; + DBusMessageIter dict_entry_iter; + void *state = NULL; + const char *key = NULL; + const char *value = NULL; + + pa_assert(iter); + pa_assert(m); + + pa_assert_se(ma = pa_modargs_new(m->module->argument, NULL)); + + pa_assert_se(dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, "a{ss}", &variant_iter)); + pa_assert_se(dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, "{ss}", &dict_iter)); + + for (state = NULL, key = pa_modargs_iterate(ma, &state); key; key = pa_modargs_iterate(ma, &state)) { + pa_assert_se(value = pa_modargs_get_value(ma, key, NULL)); + + pa_assert_se(dbus_message_iter_open_container(&dict_iter, DBUS_TYPE_DICT_ENTRY, NULL, &dict_entry_iter)); + + pa_assert_se(dbus_message_iter_append_basic(&dict_entry_iter, DBUS_TYPE_STRING, &key)); + pa_assert_se(dbus_message_iter_append_basic(&dict_entry_iter, DBUS_TYPE_STRING, &value)); + + pa_assert_se(dbus_message_iter_close_container(&dict_iter, &dict_entry_iter)); + } + + pa_assert_se(dbus_message_iter_close_container(&variant_iter, &dict_iter)); + pa_assert_se(dbus_message_iter_close_container(iter, &variant_iter)); + + pa_modargs_free(ma); +} + +static void handle_get_arguments(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_module *m = userdata; + DBusMessage *reply = NULL; + DBusMessageIter msg_iter; + + pa_assert(conn); + pa_assert(msg); + pa_assert(m); + + pa_assert_se(reply = dbus_message_new_method_return(msg)); + dbus_message_iter_init_append(reply, &msg_iter); + append_modargs_variant(&msg_iter, m); + pa_assert_se(dbus_connection_send(conn, reply, NULL)); + dbus_message_unref(reply); +} + +static void handle_get_usage_counter(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_module *m = userdata; + int real_counter_value = -1; + dbus_uint32_t usage_counter = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(m); + + if (!m->module->get_n_used || (real_counter_value = m->module->get_n_used(m->module)) < 0) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, + "Module %u (%s) doesn't have a usage counter.", m->module->index, m->module->name); + return; + } + + usage_counter = real_counter_value; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &usage_counter); +} + +static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_module *m = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(m); + + pa_dbus_send_proplist_variant_reply(conn, msg, m->proplist); +} + +static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_module *m = userdata; + DBusMessage *reply = NULL; + DBusMessageIter msg_iter; + DBusMessageIter dict_iter; + DBusMessageIter dict_entry_iter; + dbus_uint32_t idx = 0; + int real_counter_value = -1; + dbus_uint32_t usage_counter = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(m); + + idx = m->module->index; + if (m->module->get_n_used && (real_counter_value = m->module->get_n_used(m->module)) >= 0) + usage_counter = real_counter_value; + + pa_assert_se((reply = dbus_message_new_method_return(msg))); + + dbus_message_iter_init_append(reply, &msg_iter); + pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter)); + + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_INDEX].property_name, DBUS_TYPE_UINT32, &idx); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_NAME].property_name, DBUS_TYPE_STRING, &m->module->name); + + pa_assert_se(dbus_message_iter_open_container(&dict_iter, DBUS_TYPE_DICT_ENTRY, NULL, &dict_entry_iter)); + pa_assert_se(dbus_message_iter_append_basic(&dict_entry_iter, DBUS_TYPE_STRING, &property_handlers[PROPERTY_HANDLER_ARGUMENTS].property_name)); + append_modargs_variant(&dict_entry_iter, m); + pa_assert_se(dbus_message_iter_close_container(&dict_iter, &dict_entry_iter)); + + if (real_counter_value >= 0) + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_ARGUMENTS].property_name, DBUS_TYPE_UINT32, &usage_counter); + + pa_dbus_append_proplist_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PROPERTY_LIST].property_name, m->proplist); + + pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter)); + + pa_assert_se(dbus_connection_send(conn, reply, NULL)); + + dbus_message_unref(reply); +} + +static void handle_unload(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_module *m = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(m); + + if (m->module->core->disallow_module_loading) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_ACCESS_DENIED, "The server is configured to disallow module unloading."); + return; + } + + pa_module_unload_request(m->module, false); + + pa_dbus_send_empty_reply(conn, msg); +} + +static pa_hook_result_t module_proplist_changed_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_module *module_iface = slot_data; + pa_module * module = call_data; + DBusMessage *signal_msg; + + pa_assert(module_iface); + pa_assert(module); + + if (module_iface->module != module) + return PA_HOOK_OK; + + if (!pa_proplist_equal(module_iface->proplist, module->proplist)) { + DBusMessageIter msg_iter; + + pa_proplist_update(module_iface->proplist, PA_UPDATE_SET, module->proplist); + + pa_assert_se(signal_msg = dbus_message_new_signal(module_iface->path, + PA_DBUSIFACE_MODULE_INTERFACE, + signals[SIGNAL_PROPERTY_LIST_UPDATED].name)); + dbus_message_iter_init_append(signal_msg, &msg_iter); + pa_dbus_append_proplist(&msg_iter, module_iface->proplist); + + pa_dbus_protocol_send_signal(module_iface->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + } + + return PA_HOOK_OK; +} + +pa_dbusiface_module *pa_dbusiface_module_new(pa_module *module) { + pa_dbusiface_module *m; + + pa_assert(module); + + m = pa_xnew0(pa_dbusiface_module, 1); + m->module = module; + m->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, OBJECT_NAME, module->index); + m->proplist = pa_proplist_copy(module->proplist); + m->dbus_protocol = pa_dbus_protocol_get(module->core); + m->module_proplist_changed_slot = pa_hook_connect(&module->core->hooks[PA_CORE_HOOK_MODULE_PROPLIST_CHANGED], + PA_HOOK_NORMAL, module_proplist_changed_cb, m); + + pa_assert_se(pa_dbus_protocol_add_interface(m->dbus_protocol, m->path, &module_interface_info, m) >= 0); + + return m; +} + +void pa_dbusiface_module_free(pa_dbusiface_module *m) { + pa_assert(m); + + pa_assert_se(pa_dbus_protocol_remove_interface(m->dbus_protocol, m->path, module_interface_info.name) >= 0); + + pa_proplist_free(m->proplist); + pa_dbus_protocol_unref(m->dbus_protocol); + pa_hook_slot_free(m->module_proplist_changed_slot); + + pa_xfree(m->path); + pa_xfree(m); +} + +const char *pa_dbusiface_module_get_path(pa_dbusiface_module *m) { + pa_assert(m); + + return m->path; +} diff --git a/src/modules/dbus/iface-module.h b/src/modules/dbus/iface-module.h new file mode 100644 index 0000000..f4192d0 --- /dev/null +++ b/src/modules/dbus/iface-module.h @@ -0,0 +1,43 @@ +#ifndef foodbusifacemodulehfoo +#define foodbusifacemodulehfoo + +/*** + This file is part of PulseAudio. + + Copyright 2009 Tanu Kaskinen + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +/* This object implements the D-Bus interface org.PulseAudio.Core1.Module. + * + * See http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/Developer/Clients/DBus/Module/ + * for the Module interface documentation. + */ + +#include +#include + +#include "iface-core.h" + +#define PA_DBUSIFACE_MODULE_INTERFACE PA_DBUS_CORE_INTERFACE ".Module" + +typedef struct pa_dbusiface_module pa_dbusiface_module; + +pa_dbusiface_module *pa_dbusiface_module_new(pa_module *module); +void pa_dbusiface_module_free(pa_dbusiface_module *m); + +const char *pa_dbusiface_module_get_path(pa_dbusiface_module *m); + +#endif diff --git a/src/modules/dbus/iface-sample.c b/src/modules/dbus/iface-sample.c new file mode 100644 index 0000000..5118919 --- /dev/null +++ b/src/modules/dbus/iface-sample.c @@ -0,0 +1,520 @@ +/*** + This file is part of PulseAudio. + + Copyright 2009 Tanu Kaskinen + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#include "iface-sample.h" + +#define OBJECT_NAME "sample" + +struct pa_dbusiface_sample { + pa_dbusiface_core *core; + + pa_scache_entry *sample; + char *path; + pa_proplist *proplist; + + pa_hook_slot *sample_cache_changed_slot; + + pa_dbus_protocol *dbus_protocol; +}; + +static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_sample_format(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_channels(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_default_volume(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_duration(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_bytes(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata); + +static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata); + +static void handle_play(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_play_to_sink(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_remove(DBusConnection *conn, DBusMessage *msg, void *userdata); + +enum property_handler_index { + PROPERTY_HANDLER_INDEX, + PROPERTY_HANDLER_NAME, + PROPERTY_HANDLER_SAMPLE_FORMAT, + PROPERTY_HANDLER_SAMPLE_RATE, + PROPERTY_HANDLER_CHANNELS, + PROPERTY_HANDLER_DEFAULT_VOLUME, + PROPERTY_HANDLER_DURATION, + PROPERTY_HANDLER_BYTES, + PROPERTY_HANDLER_PROPERTY_LIST, + PROPERTY_HANDLER_MAX +}; + +static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = { + [PROPERTY_HANDLER_INDEX] = { .property_name = "Index", .type = "u", .get_cb = handle_get_index, .set_cb = NULL }, + [PROPERTY_HANDLER_NAME] = { .property_name = "Name", .type = "s", .get_cb = handle_get_name, .set_cb = NULL }, + [PROPERTY_HANDLER_SAMPLE_FORMAT] = { .property_name = "SampleFormat", .type = "u", .get_cb = handle_get_sample_format, .set_cb = NULL }, + [PROPERTY_HANDLER_SAMPLE_RATE] = { .property_name = "SampleRate", .type = "u", .get_cb = handle_get_sample_rate, .set_cb = NULL }, + [PROPERTY_HANDLER_CHANNELS] = { .property_name = "Channels", .type = "au", .get_cb = handle_get_channels, .set_cb = NULL }, + [PROPERTY_HANDLER_DEFAULT_VOLUME] = { .property_name = "DefaultVolume", .type = "au", .get_cb = handle_get_default_volume, .set_cb = NULL }, + [PROPERTY_HANDLER_DURATION] = { .property_name = "Duration", .type = "t", .get_cb = handle_get_duration, .set_cb = NULL }, + [PROPERTY_HANDLER_BYTES] = { .property_name = "Bytes", .type = "u", .get_cb = handle_get_bytes, .set_cb = NULL }, + [PROPERTY_HANDLER_PROPERTY_LIST] = { .property_name = "PropertyList", .type = "a{say}", .get_cb = handle_get_property_list, .set_cb = NULL } +}; + +enum method_handler_index { + METHOD_HANDLER_PLAY, + METHOD_HANDLER_PLAY_TO_SINK, + METHOD_HANDLER_REMOVE, + METHOD_HANDLER_MAX +}; + +static pa_dbus_arg_info play_args[] = { { "volume", "u", "in" }, { "property_list", "a{say}", "in" } }; +static pa_dbus_arg_info play_to_sink_args[] = { { "sink", "o", "in" }, + { "volume", "u", "in" }, + { "property_list", "a{say}", "in" } }; + +static pa_dbus_method_handler method_handlers[METHOD_HANDLER_MAX] = { + [METHOD_HANDLER_PLAY] = { + .method_name = "Play", + .arguments = play_args, + .n_arguments = sizeof(play_args) / sizeof(pa_dbus_arg_info), + .receive_cb = handle_play }, + [METHOD_HANDLER_PLAY_TO_SINK] = { + .method_name = "PlayToSink", + .arguments = play_to_sink_args, + .n_arguments = sizeof(play_to_sink_args) / sizeof(pa_dbus_arg_info), + .receive_cb = handle_play_to_sink }, + [METHOD_HANDLER_REMOVE] = { + .method_name = "Remove", + .arguments = NULL, + .n_arguments = 0, + .receive_cb = handle_remove } +}; + +enum signal_index { + SIGNAL_PROPERTY_LIST_UPDATED, + SIGNAL_MAX +}; + +static pa_dbus_arg_info property_list_updated_args[] = { { "property_list", "a{say}", NULL } }; + +static pa_dbus_signal_info signals[SIGNAL_MAX] = { + [SIGNAL_PROPERTY_LIST_UPDATED] = { .name = "PropertyListUpdated", .arguments = property_list_updated_args, .n_arguments = 1 } +}; + +static pa_dbus_interface_info sample_interface_info = { + .name = PA_DBUSIFACE_SAMPLE_INTERFACE, + .method_handlers = method_handlers, + .n_method_handlers = METHOD_HANDLER_MAX, + .property_handlers = property_handlers, + .n_property_handlers = PROPERTY_HANDLER_MAX, + .get_all_properties_cb = handle_get_all, + .signals = signals, + .n_signals = SIGNAL_MAX +}; + +static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_sample *s = userdata; + dbus_uint32_t idx = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + idx = s->sample->index; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &idx); +} + +static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_sample *s = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &s->sample->name); +} + +static void handle_get_sample_format(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_sample *s = userdata; + dbus_uint32_t sample_format = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + if (!s->sample->memchunk.memblock) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, + "Sample %s isn't loaded into memory yet, so its sample format is unknown.", s->sample->name); + return; + } + + sample_format = s->sample->sample_spec.format; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &sample_format); +} + +static void handle_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_sample *s = userdata; + dbus_uint32_t sample_rate = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + if (!s->sample->memchunk.memblock) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, + "Sample %s isn't loaded into memory yet, so its sample rate is unknown.", s->sample->name); + return; + } + + sample_rate = s->sample->sample_spec.rate; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &sample_rate); +} + +static void handle_get_channels(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_sample *s = userdata; + dbus_uint32_t channels[PA_CHANNELS_MAX]; + unsigned i = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + if (!s->sample->memchunk.memblock) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, + "Sample %s isn't loaded into memory yet, so its channel map is unknown.", s->sample->name); + return; + } + + for (i = 0; i < s->sample->channel_map.channels; ++i) + channels[i] = s->sample->channel_map.map[i]; + + pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_UINT32, channels, s->sample->channel_map.channels); +} + +static void handle_get_default_volume(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_sample *s = userdata; + dbus_uint32_t default_volume[PA_CHANNELS_MAX]; + unsigned i = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + if (!s->sample->volume_is_set) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, + "Sample %s doesn't have default volume stored.", s->sample->name); + return; + } + + for (i = 0; i < s->sample->volume.channels; ++i) + default_volume[i] = s->sample->volume.values[i]; + + pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_UINT32, default_volume, s->sample->volume.channels); +} + +static void handle_get_duration(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_sample *s = userdata; + dbus_uint64_t duration = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + if (!s->sample->memchunk.memblock) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, + "Sample %s isn't loaded into memory yet, so its duration is unknown.", s->sample->name); + return; + } + + duration = pa_bytes_to_usec(s->sample->memchunk.length, &s->sample->sample_spec); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT64, &duration); +} + +static void handle_get_bytes(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_sample *s = userdata; + dbus_uint32_t bytes = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + if (!s->sample->memchunk.memblock) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, + "Sample %s isn't loaded into memory yet, so its size is unknown.", s->sample->name); + return; + } + + bytes = s->sample->memchunk.length; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &bytes); +} + +static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_sample *s = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + pa_dbus_send_proplist_variant_reply(conn, msg, s->proplist); +} + +static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_sample *s = userdata; + DBusMessage *reply = NULL; + DBusMessageIter msg_iter; + DBusMessageIter dict_iter; + dbus_uint32_t idx = 0; + dbus_uint32_t sample_format = 0; + dbus_uint32_t sample_rate = 0; + dbus_uint32_t channels[PA_CHANNELS_MAX]; + dbus_uint32_t default_volume[PA_CHANNELS_MAX]; + dbus_uint64_t duration = 0; + dbus_uint32_t bytes = 0; + unsigned i = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + idx = s->sample->index; + if (s->sample->memchunk.memblock) { + sample_format = s->sample->sample_spec.format; + sample_rate = s->sample->sample_spec.rate; + for (i = 0; i < s->sample->channel_map.channels; ++i) + channels[i] = s->sample->channel_map.map[i]; + duration = pa_bytes_to_usec(s->sample->memchunk.length, &s->sample->sample_spec); + bytes = s->sample->memchunk.length; + } + if (s->sample->volume_is_set) { + for (i = 0; i < s->sample->volume.channels; ++i) + default_volume[i] = s->sample->volume.values[i]; + } + + pa_assert_se((reply = dbus_message_new_method_return(msg))); + + dbus_message_iter_init_append(reply, &msg_iter); + pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter)); + + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_INDEX].property_name, DBUS_TYPE_UINT32, &idx); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_NAME].property_name, DBUS_TYPE_STRING, &s->sample->name); + + if (s->sample->memchunk.memblock) { + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SAMPLE_FORMAT].property_name, DBUS_TYPE_UINT32, &sample_format); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SAMPLE_RATE].property_name, DBUS_TYPE_UINT32, &sample_rate); + pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_CHANNELS].property_name, DBUS_TYPE_UINT32, channels, s->sample->channel_map.channels); + } + + if (s->sample->volume_is_set) + pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DEFAULT_VOLUME].property_name, DBUS_TYPE_UINT32, default_volume, s->sample->volume.channels); + + if (s->sample->memchunk.memblock) { + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DURATION].property_name, DBUS_TYPE_UINT64, &duration); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_BYTES].property_name, DBUS_TYPE_UINT32, &bytes); + } + + pa_dbus_append_proplist_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PROPERTY_LIST].property_name, s->proplist); + + pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter)); + pa_assert_se(dbus_connection_send(conn, reply, NULL)); + dbus_message_unref(reply); +} + +static void handle_play(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_sample *s = userdata; + DBusMessageIter msg_iter; + dbus_uint32_t volume = 0; + pa_proplist *property_list = NULL; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + pa_assert_se(dbus_message_iter_init(msg, &msg_iter)); + dbus_message_iter_get_basic(&msg_iter, &volume); + + pa_assert_se(dbus_message_iter_next(&msg_iter)); + if (!(property_list = pa_dbus_get_proplist_arg(conn, msg, &msg_iter))) + return; + + if (!PA_VOLUME_IS_VALID(volume)) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid volume."); + goto finish; + } + + if (!s->sample->core->default_sink) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, + "Can't play sample %s, because there are no sinks available.", s->sample->name); + goto finish; + } + + if (pa_scache_play_item(s->sample->core, + s->sample->name, + s->sample->core->default_sink, + volume, + property_list, + NULL) < 0) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "Playing sample %s failed.", s->sample->name); + goto finish; + } + + pa_dbus_send_empty_reply(conn, msg); + +finish: + if (property_list) + pa_proplist_free(property_list); +} + +static void handle_play_to_sink(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_sample *s = userdata; + DBusMessageIter msg_iter; + const char *sink_path = NULL; + dbus_uint32_t volume = 0; + pa_proplist *property_list = NULL; + pa_sink *sink = NULL; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + pa_assert_se(dbus_message_iter_init(msg, &msg_iter)); + dbus_message_iter_get_basic(&msg_iter, &sink_path); + + pa_assert_se(dbus_message_iter_next(&msg_iter)); + dbus_message_iter_get_basic(&msg_iter, &volume); + + pa_assert_se(dbus_message_iter_next(&msg_iter)); + if (!(property_list = pa_dbus_get_proplist_arg(conn, msg, &msg_iter))) + return; + + if (!(sink = pa_dbusiface_core_get_sink(s->core, sink_path))) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such sink.", sink_path); + goto finish; + } + + if (!PA_VOLUME_IS_VALID(volume)) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid volume."); + goto finish; + } + + if (pa_scache_play_item(s->sample->core, s->sample->name, sink, volume, property_list, NULL) < 0) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "Playing sample %s failed.", s->sample->name); + goto finish; + } + + pa_dbus_send_empty_reply(conn, msg); + +finish: + if (property_list) + pa_proplist_free(property_list); +} + +static void handle_remove(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_sample *s = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + if (pa_scache_remove_item(s->sample->core, s->sample->name) < 0) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "Removing sample %s failed.", s->sample->name); + return; + } + + pa_dbus_send_empty_reply(conn, msg); +} + +static pa_hook_result_t sample_cache_changed_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_sample *sample_iface = slot_data; + pa_scache_entry *sample = call_data; + DBusMessage *signal_msg; + + pa_assert(sample); + pa_assert(sample_iface); + + if (sample_iface->sample != sample) + return PA_HOOK_OK; + + if (!pa_proplist_equal(sample_iface->proplist, sample_iface->sample->proplist)) { + DBusMessageIter msg_iter; + + pa_proplist_update(sample_iface->proplist, PA_UPDATE_SET, sample_iface->sample->proplist); + + pa_assert_se(signal_msg = dbus_message_new_signal(sample_iface->path, + PA_DBUSIFACE_SAMPLE_INTERFACE, + signals[SIGNAL_PROPERTY_LIST_UPDATED].name)); + dbus_message_iter_init_append(signal_msg, &msg_iter); + pa_dbus_append_proplist(&msg_iter, sample_iface->proplist); + + pa_dbus_protocol_send_signal(sample_iface->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + } + + return PA_HOOK_OK; +} + +pa_dbusiface_sample *pa_dbusiface_sample_new(pa_dbusiface_core *core, pa_scache_entry *sample) { + pa_dbusiface_sample *s = NULL; + + pa_assert(core); + pa_assert(sample); + + s = pa_xnew0(pa_dbusiface_sample, 1); + s->core = core; + s->sample = sample; + s->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, OBJECT_NAME, sample->index); + s->proplist = pa_proplist_copy(sample->proplist); + s->dbus_protocol = pa_dbus_protocol_get(sample->core); + s->sample_cache_changed_slot = pa_hook_connect(&sample->core->hooks[PA_CORE_HOOK_SAMPLE_CACHE_CHANGED], + PA_HOOK_NORMAL, sample_cache_changed_cb, s); + + pa_assert_se(pa_dbus_protocol_add_interface(s->dbus_protocol, s->path, &sample_interface_info, s) >= 0); + + return s; +} + +void pa_dbusiface_sample_free(pa_dbusiface_sample *s) { + pa_assert(s); + + pa_assert_se(pa_dbus_protocol_remove_interface(s->dbus_protocol, s->path, sample_interface_info.name) >= 0); + + pa_hook_slot_free(s->sample_cache_changed_slot); + pa_proplist_free(s->proplist); + pa_dbus_protocol_unref(s->dbus_protocol); + + pa_xfree(s->path); + pa_xfree(s); +} + +const char *pa_dbusiface_sample_get_path(pa_dbusiface_sample *s) { + pa_assert(s); + + return s->path; +} diff --git a/src/modules/dbus/iface-sample.h b/src/modules/dbus/iface-sample.h new file mode 100644 index 0000000..443b764 --- /dev/null +++ b/src/modules/dbus/iface-sample.h @@ -0,0 +1,43 @@ +#ifndef foodbusifacesamplehfoo +#define foodbusifacesamplehfoo + +/*** + This file is part of PulseAudio. + + Copyright 2009 Tanu Kaskinen + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +/* This object implements the D-Bus interface org.PulseAudio.Core1.Sample. + * + * See http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/Developer/Clients/DBus/Sample/ + * for the Sample interface documentation. + */ + +#include +#include + +#include "iface-core.h" + +#define PA_DBUSIFACE_SAMPLE_INTERFACE PA_DBUS_CORE_INTERFACE ".Sample" + +typedef struct pa_dbusiface_sample pa_dbusiface_sample; + +pa_dbusiface_sample *pa_dbusiface_sample_new(pa_dbusiface_core *core, pa_scache_entry *sample); +void pa_dbusiface_sample_free(pa_dbusiface_sample *c); + +const char *pa_dbusiface_sample_get_path(pa_dbusiface_sample *c); + +#endif diff --git a/src/modules/dbus/iface-stream.c b/src/modules/dbus/iface-stream.c new file mode 100644 index 0000000..ade62ca --- /dev/null +++ b/src/modules/dbus/iface-stream.c @@ -0,0 +1,1000 @@ +/*** + This file is part of PulseAudio. + + Copyright 2009 Tanu Kaskinen + Copyright 2009 Vincent Filali-Ansary + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include "iface-stream.h" + +#define PLAYBACK_OBJECT_NAME "playback_stream" +#define RECORD_OBJECT_NAME "record_stream" + +enum stream_type { + STREAM_TYPE_PLAYBACK, + STREAM_TYPE_RECORD +}; + +struct pa_dbusiface_stream { + pa_dbusiface_core *core; + + union { + pa_sink_input *sink_input; + pa_source_output *source_output; + }; + enum stream_type type; + char *path; + union { + pa_sink *sink; + pa_source *source; + }; + uint32_t sample_rate; + pa_cvolume volume; + dbus_bool_t mute; + pa_proplist *proplist; + + bool has_volume; + + pa_dbus_protocol *dbus_protocol; + pa_hook_slot *send_event_slot; + pa_hook_slot *move_finish_slot; + pa_hook_slot *volume_changed_slot; + pa_hook_slot *mute_changed_slot; + pa_hook_slot *proplist_changed_slot; + pa_hook_slot *state_changed_slot; +}; + +static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_driver(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_owner_module(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_client(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_device(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_sample_format(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_channels(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_volume(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_set_volume(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata); +static void handle_get_mute(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_set_mute(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata); +static void handle_get_buffer_latency(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_device_latency(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_resample_method(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata); + +static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata); + +static void handle_move(DBusConnection *conn, DBusMessage *msg, void *userdata); +static void handle_kill(DBusConnection *conn, DBusMessage *msg, void *userdata); + +enum property_handler_index { + PROPERTY_HANDLER_INDEX, + PROPERTY_HANDLER_DRIVER, + PROPERTY_HANDLER_OWNER_MODULE, + PROPERTY_HANDLER_CLIENT, + PROPERTY_HANDLER_DEVICE, + PROPERTY_HANDLER_SAMPLE_FORMAT, + PROPERTY_HANDLER_SAMPLE_RATE, + PROPERTY_HANDLER_CHANNELS, + PROPERTY_HANDLER_VOLUME, + PROPERTY_HANDLER_MUTE, + PROPERTY_HANDLER_BUFFER_LATENCY, + PROPERTY_HANDLER_DEVICE_LATENCY, + PROPERTY_HANDLER_RESAMPLE_METHOD, + PROPERTY_HANDLER_PROPERTY_LIST, + PROPERTY_HANDLER_MAX +}; + +static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = { + [PROPERTY_HANDLER_INDEX] = { .property_name = "Index", .type = "u", .get_cb = handle_get_index, .set_cb = NULL }, + [PROPERTY_HANDLER_DRIVER] = { .property_name = "Driver", .type = "s", .get_cb = handle_get_driver, .set_cb = NULL }, + [PROPERTY_HANDLER_OWNER_MODULE] = { .property_name = "OwnerModule", .type = "o", .get_cb = handle_get_owner_module, .set_cb = NULL }, + [PROPERTY_HANDLER_CLIENT] = { .property_name = "Client", .type = "o", .get_cb = handle_get_client, .set_cb = NULL }, + [PROPERTY_HANDLER_DEVICE] = { .property_name = "Device", .type = "o", .get_cb = handle_get_device, .set_cb = NULL }, + [PROPERTY_HANDLER_SAMPLE_FORMAT] = { .property_name = "SampleFormat", .type = "u", .get_cb = handle_get_sample_format, .set_cb = NULL }, + [PROPERTY_HANDLER_SAMPLE_RATE] = { .property_name = "SampleRate", .type = "u", .get_cb = handle_get_sample_rate, .set_cb = NULL }, + [PROPERTY_HANDLER_CHANNELS] = { .property_name = "Channels", .type = "au", .get_cb = handle_get_channels, .set_cb = NULL }, + [PROPERTY_HANDLER_VOLUME] = { .property_name = "Volume", .type = "au", .get_cb = handle_get_volume, .set_cb = handle_set_volume }, + [PROPERTY_HANDLER_MUTE] = { .property_name = "Mute", .type = "b", .get_cb = handle_get_mute, .set_cb = handle_set_mute }, + [PROPERTY_HANDLER_BUFFER_LATENCY] = { .property_name = "BufferLatency", .type = "t", .get_cb = handle_get_buffer_latency, .set_cb = NULL }, + [PROPERTY_HANDLER_DEVICE_LATENCY] = { .property_name = "DeviceLatency", .type = "t", .get_cb = handle_get_device_latency, .set_cb = NULL }, + [PROPERTY_HANDLER_RESAMPLE_METHOD] = { .property_name = "ResampleMethod", .type = "s", .get_cb = handle_get_resample_method, .set_cb = NULL }, + [PROPERTY_HANDLER_PROPERTY_LIST] = { .property_name = "PropertyList", .type = "a{say}", .get_cb = handle_get_property_list, .set_cb = NULL } +}; + +enum method_handler_index { + METHOD_HANDLER_MOVE, + METHOD_HANDLER_KILL, + METHOD_HANDLER_MAX +}; + +static pa_dbus_arg_info move_args[] = { { "device", "o", "in" } }; + +static pa_dbus_method_handler method_handlers[METHOD_HANDLER_MAX] = { + [METHOD_HANDLER_MOVE] = { + .method_name = "Move", + .arguments = move_args, + .n_arguments = sizeof(move_args) / sizeof(pa_dbus_arg_info), + .receive_cb = handle_move }, + [METHOD_HANDLER_KILL] = { + .method_name = "Kill", + .arguments = NULL, + .n_arguments = 0, + .receive_cb = handle_kill } +}; + +enum signal_index { + SIGNAL_DEVICE_UPDATED, + SIGNAL_SAMPLE_RATE_UPDATED, + SIGNAL_VOLUME_UPDATED, + SIGNAL_MUTE_UPDATED, + SIGNAL_PROPERTY_LIST_UPDATED, + SIGNAL_STREAM_EVENT, + SIGNAL_MAX +}; + +static pa_dbus_arg_info device_updated_args[] = { { "device", "o", NULL } }; +static pa_dbus_arg_info sample_rate_updated_args[] = { { "sample_rate", "u", NULL } }; +static pa_dbus_arg_info volume_updated_args[] = { { "volume", "au", NULL } }; +static pa_dbus_arg_info mute_updated_args[] = { { "muted", "b", NULL } }; +static pa_dbus_arg_info property_list_updated_args[] = { { "property_list", "a{say}", NULL } }; +static pa_dbus_arg_info stream_event_args[] = { { "name", "s", NULL }, { "property_list", "a{say}", NULL } }; + +static pa_dbus_signal_info signals[SIGNAL_MAX] = { + [SIGNAL_DEVICE_UPDATED] = { .name = "DeviceUpdated", .arguments = device_updated_args, .n_arguments = 1 }, + [SIGNAL_SAMPLE_RATE_UPDATED] = { .name = "SampleRateUpdated", .arguments = sample_rate_updated_args, .n_arguments = 1 }, + [SIGNAL_VOLUME_UPDATED] = { .name = "VolumeUpdated", .arguments = volume_updated_args, .n_arguments = 1 }, + [SIGNAL_MUTE_UPDATED] = { .name = "MuteUpdated", .arguments = mute_updated_args, .n_arguments = 1 }, + [SIGNAL_PROPERTY_LIST_UPDATED] = { .name = "PropertyListUpdated", .arguments = property_list_updated_args, .n_arguments = 1 }, + [SIGNAL_STREAM_EVENT] = { .name = "StreamEvent", .arguments = stream_event_args, .n_arguments = sizeof(stream_event_args) / sizeof(pa_dbus_arg_info) } +}; + +static pa_dbus_interface_info stream_interface_info = { + .name = PA_DBUSIFACE_STREAM_INTERFACE, + .method_handlers = method_handlers, + .n_method_handlers = METHOD_HANDLER_MAX, + .property_handlers = property_handlers, + .n_property_handlers = PROPERTY_HANDLER_MAX, + .get_all_properties_cb = handle_get_all, + .signals = signals, + .n_signals = SIGNAL_MAX +}; + +static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_stream *s = userdata; + dbus_uint32_t idx; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + idx = (s->type == STREAM_TYPE_PLAYBACK) ? s->sink_input->index : s->source_output->index; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &idx); +} + +/* The returned string has to be freed with pa_xfree() by the caller. */ +static char *stream_to_string(pa_dbusiface_stream *s) { + if (s->type == STREAM_TYPE_PLAYBACK) + return pa_sprintf_malloc("Playback stream %u", (unsigned) s->sink_input->index); + else + return pa_sprintf_malloc("Record stream %u", (unsigned) s->source_output->index); +} + +static void handle_get_driver(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_stream *s = userdata; + const char *driver = NULL; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + driver = (s->type == STREAM_TYPE_PLAYBACK) ? s->sink_input->driver : s->source_output->driver; + + if (!driver) { + char *str = stream_to_string(s); + + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "%s doesn't have a driver.", str); + pa_xfree(str); + + return; + } + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &driver); +} + +static void handle_get_owner_module(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_stream *s = userdata; + pa_module *owner_module = NULL; + const char *object_path = NULL; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + owner_module = (s->type == STREAM_TYPE_PLAYBACK) ? s->sink_input->module : s->source_output->module; + + if (!owner_module) { + char *str = stream_to_string(s); + + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "%s doesn't have an owner module.", str); + pa_xfree(str); + + return; + } + + object_path = pa_dbusiface_core_get_module_path(s->core, owner_module); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path); +} + +static void handle_get_client(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_stream *s = userdata; + pa_client *client = NULL; + const char *object_path = NULL; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + client = (s->type == STREAM_TYPE_PLAYBACK) ? s->sink_input->client : s->source_output->client; + + if (!client) { + char *str = stream_to_string(s); + + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "%s isn't associated to any client.", str); + pa_xfree(str); + + return; + } + + object_path = pa_dbusiface_core_get_client_path(s->core, client); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path); +} + +static void handle_get_device(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_stream *s = userdata; + const char *device = NULL; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + if (s->type == STREAM_TYPE_PLAYBACK) + device = pa_dbusiface_core_get_sink_path(s->core, s->sink); + else + device = pa_dbusiface_core_get_source_path(s->core, s->source); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &device); +} + +static void handle_get_sample_format(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_stream *s = userdata; + dbus_uint32_t sample_format = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + sample_format = (s->type == STREAM_TYPE_PLAYBACK) + ? s->sink_input->sample_spec.format + : s->source_output->sample_spec.format; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &sample_format); +} + +static void handle_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_stream *s = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &s->sample_rate); +} + +static void handle_get_channels(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_stream *s = userdata; + pa_channel_map *channel_map = NULL; + dbus_uint32_t channels[PA_CHANNELS_MAX]; + unsigned i = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + channel_map = (s->type == STREAM_TYPE_PLAYBACK) ? &s->sink_input->channel_map : &s->source_output->channel_map; + + for (i = 0; i < channel_map->channels; ++i) + channels[i] = channel_map->map[i]; + + pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_UINT32, channels, channel_map->channels); +} + +static void handle_get_volume(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_stream *s = userdata; + dbus_uint32_t volume[PA_CHANNELS_MAX]; + unsigned i = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + if (!s->has_volume) { + char *str = stream_to_string(s); + + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "%s doesn't have volume.", str); + pa_xfree(str); + + return; + } + + for (i = 0; i < s->volume.channels; ++i) + volume[i] = s->volume.values[i]; + + pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_UINT32, volume, s->volume.channels); +} + +static void handle_set_volume(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) { + pa_dbusiface_stream *s = userdata; + bool volume_writable = true; + DBusMessageIter array_iter; + int stream_channels = 0; + dbus_uint32_t *volume = NULL; + int n_volume_entries = 0; + pa_cvolume new_vol; + int i = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(iter); + pa_assert(s); + + volume_writable = (s->type == STREAM_TYPE_PLAYBACK) ? s->sink_input->volume_writable : false; + + if (!s->has_volume || !volume_writable) { + char *str = stream_to_string(s); + + if (!s->has_volume) + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "%s doesn't have volume.", str); + else if (!volume_writable) + pa_dbus_send_error(conn, msg, DBUS_ERROR_ACCESS_DENIED, "%s has read-only volume.", str); + pa_xfree(str); + + return; + } + + stream_channels = s->sink_input->channel_map.channels; + + dbus_message_iter_recurse(iter, &array_iter); + dbus_message_iter_get_fixed_array(&array_iter, &volume, &n_volume_entries); + + if (n_volume_entries != stream_channels && n_volume_entries != 1) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, + "Expected %u volume entries, got %u.", stream_channels, n_volume_entries); + return; + } + + pa_cvolume_init(&new_vol); + new_vol.channels = n_volume_entries; + + for (i = 0; i < n_volume_entries; ++i) { + if (!PA_VOLUME_IS_VALID(volume[i])) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid volume: %u", volume[i]); + return; + } + new_vol.values[i] = volume[i]; + } + + pa_sink_input_set_volume(s->sink_input, &new_vol, true, true); + + pa_dbus_send_empty_reply(conn, msg); +} + +static void handle_get_mute(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_stream *s = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + if (s->type == STREAM_TYPE_RECORD) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Record streams don't have mute."); + return; + } + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &s->mute); +} + +static void handle_set_mute(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) { + pa_dbusiface_stream *s = userdata; + dbus_bool_t mute = FALSE; + + pa_assert(conn); + pa_assert(msg); + pa_assert(iter); + pa_assert(s); + + dbus_message_iter_get_basic(iter, &mute); + + if (s->type == STREAM_TYPE_RECORD) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Record streams don't have mute."); + return; + } + + pa_sink_input_set_mute(s->sink_input, mute, true); + + pa_dbus_send_empty_reply(conn, msg); +} + +static void handle_get_buffer_latency(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_stream *s = userdata; + dbus_uint64_t buffer_latency = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + if (s->type == STREAM_TYPE_PLAYBACK) + buffer_latency = pa_sink_input_get_latency(s->sink_input, NULL); + else + buffer_latency = pa_source_output_get_latency(s->source_output, NULL); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT64, &buffer_latency); +} + +static void handle_get_device_latency(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_stream *s = userdata; + dbus_uint64_t device_latency = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + if (s->type == STREAM_TYPE_PLAYBACK) + pa_sink_input_get_latency(s->sink_input, &device_latency); + else + pa_source_output_get_latency(s->source_output, &device_latency); + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT64, &device_latency); +} + +static void handle_get_resample_method(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_stream *s = userdata; + const char *resample_method = NULL; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + if (s->type == STREAM_TYPE_PLAYBACK) + resample_method = pa_resample_method_to_string(s->sink_input->actual_resample_method); + else + resample_method = pa_resample_method_to_string(s->source_output->actual_resample_method); + + if (!resample_method) + resample_method = ""; + + pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &resample_method); +} + +static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_stream *s = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + pa_dbus_send_proplist_variant_reply(conn, msg, s->proplist); +} + +static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_stream *s = userdata; + DBusMessage *reply = NULL; + DBusMessageIter msg_iter; + DBusMessageIter dict_iter; + dbus_uint32_t idx = 0; + const char *driver = NULL; + pa_module *owner_module = NULL; + const char *owner_module_path = NULL; + pa_client *client = NULL; + const char *client_path = NULL; + const char *device = NULL; + dbus_uint32_t sample_format = 0; + pa_channel_map *channel_map = NULL; + dbus_uint32_t channels[PA_CHANNELS_MAX]; + dbus_uint32_t volume[PA_CHANNELS_MAX]; + dbus_uint64_t buffer_latency = 0; + dbus_uint64_t device_latency = 0; + const char *resample_method = NULL; + unsigned i = 0; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + if (s->has_volume) { + for (i = 0; i < s->volume.channels; ++i) + volume[i] = s->volume.values[i]; + } + + if (s->type == STREAM_TYPE_PLAYBACK) { + idx = s->sink_input->index; + driver = s->sink_input->driver; + owner_module = s->sink_input->module; + client = s->sink_input->client; + device = pa_dbusiface_core_get_sink_path(s->core, s->sink); + sample_format = s->sink_input->sample_spec.format; + channel_map = &s->sink_input->channel_map; + buffer_latency = pa_sink_input_get_latency(s->sink_input, &device_latency); + resample_method = pa_resample_method_to_string(s->sink_input->actual_resample_method); + } else { + idx = s->source_output->index; + driver = s->source_output->driver; + owner_module = s->source_output->module; + client = s->source_output->client; + device = pa_dbusiface_core_get_source_path(s->core, s->source); + sample_format = s->source_output->sample_spec.format; + channel_map = &s->source_output->channel_map; + buffer_latency = pa_source_output_get_latency(s->source_output, &device_latency); + resample_method = pa_resample_method_to_string(s->source_output->actual_resample_method); + } + if (owner_module) + owner_module_path = pa_dbusiface_core_get_module_path(s->core, owner_module); + if (client) + client_path = pa_dbusiface_core_get_client_path(s->core, client); + for (i = 0; i < channel_map->channels; ++i) + channels[i] = channel_map->map[i]; + if (!resample_method) + resample_method = ""; + + pa_assert_se((reply = dbus_message_new_method_return(msg))); + + dbus_message_iter_init_append(reply, &msg_iter); + pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter)); + + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_INDEX].property_name, DBUS_TYPE_UINT32, &idx); + + if (driver) + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DRIVER].property_name, DBUS_TYPE_STRING, &driver); + + if (owner_module) + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_OWNER_MODULE].property_name, DBUS_TYPE_OBJECT_PATH, &owner_module_path); + + if (client) + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_CLIENT].property_name, DBUS_TYPE_OBJECT_PATH, &client_path); + + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DEVICE].property_name, DBUS_TYPE_OBJECT_PATH, &device); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SAMPLE_FORMAT].property_name, DBUS_TYPE_UINT32, &sample_format); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SAMPLE_RATE].property_name, DBUS_TYPE_UINT32, &s->sample_rate); + pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_CHANNELS].property_name, DBUS_TYPE_UINT32, channels, channel_map->channels); + + if (s->has_volume) { + pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_VOLUME].property_name, DBUS_TYPE_UINT32, volume, s->volume.channels); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_MUTE].property_name, DBUS_TYPE_BOOLEAN, &s->mute); + } + + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_BUFFER_LATENCY].property_name, DBUS_TYPE_UINT64, &buffer_latency); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DEVICE_LATENCY].property_name, DBUS_TYPE_UINT64, &device_latency); + pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_RESAMPLE_METHOD].property_name, DBUS_TYPE_STRING, &resample_method); + pa_dbus_append_proplist_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PROPERTY_LIST].property_name, s->proplist); + + pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter)); + pa_assert_se(dbus_connection_send(conn, reply, NULL)); + dbus_message_unref(reply); +} + +static void handle_move(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_stream *s = userdata; + const char *device = NULL; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + pa_assert_se(dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &device, DBUS_TYPE_INVALID)); + + if (s->type == STREAM_TYPE_PLAYBACK) { + pa_sink *sink = pa_dbusiface_core_get_sink(s->core, device); + + if (!sink) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such sink.", device); + return; + } + + if (pa_sink_input_move_to(s->sink_input, sink, true) < 0) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, + "Moving playback stream %u to sink %s failed.", s->sink_input->index, sink->name); + return; + } + } else { + pa_source *source = pa_dbusiface_core_get_source(s->core, device); + + if (!source) { + pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such source.", device); + return; + } + + if (pa_source_output_move_to(s->source_output, source, true) < 0) { + pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, + "Moving record stream %u to source %s failed.", s->source_output->index, source->name); + return; + } + } + + pa_dbus_send_empty_reply(conn, msg); +} + +static void handle_kill(DBusConnection *conn, DBusMessage *msg, void *userdata) { + pa_dbusiface_stream *s = userdata; + + pa_assert(conn); + pa_assert(msg); + pa_assert(s); + + if (s->type == STREAM_TYPE_PLAYBACK) + pa_sink_input_kill(s->sink_input); + else + pa_source_output_kill(s->source_output); + + pa_dbus_send_empty_reply(conn, msg); +} + +static void check_and_signal_rate(pa_dbusiface_stream *s) { + DBusMessage *signal_msg = NULL; + uint32_t new_sample_rate = 0; + + pa_assert(s); + + new_sample_rate = (s->type == STREAM_TYPE_PLAYBACK) + ? s->sink_input->sample_spec.rate + : s->source_output->sample_spec.rate; + + if (s->sample_rate != new_sample_rate) { + s->sample_rate = new_sample_rate; + + pa_assert_se(signal_msg = dbus_message_new_signal(s->path, + PA_DBUSIFACE_STREAM_INTERFACE, + signals[SIGNAL_SAMPLE_RATE_UPDATED].name)); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_UINT32, &s->sample_rate, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(s->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + } +} + +static pa_hook_result_t move_finish_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_stream *s = slot_data; + const char *new_device_path = NULL; + DBusMessage *signal_msg = NULL; + + if ((s->type == STREAM_TYPE_PLAYBACK && s->sink_input != call_data) || + (s->type == STREAM_TYPE_RECORD && s->source_output != call_data)) + return PA_HOOK_OK; + + if (s->type == STREAM_TYPE_PLAYBACK) { + pa_sink *new_sink = s->sink_input->sink; + + if (s->sink != new_sink) { + pa_sink_unref(s->sink); + s->sink = pa_sink_ref(new_sink); + + new_device_path = pa_dbusiface_core_get_sink_path(s->core, new_sink); + + pa_assert_se(signal_msg = dbus_message_new_signal(s->path, + PA_DBUSIFACE_STREAM_INTERFACE, + signals[SIGNAL_DEVICE_UPDATED].name)); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &new_device_path, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(s->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + } + } else { + pa_source *new_source = s->source_output->source; + + if (s->source != new_source) { + pa_source_unref(s->source); + s->source = pa_source_ref(new_source); + + new_device_path = pa_dbusiface_core_get_source_path(s->core, new_source); + + pa_assert_se(signal_msg = dbus_message_new_signal(s->path, + PA_DBUSIFACE_STREAM_INTERFACE, + signals[SIGNAL_DEVICE_UPDATED].name)); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &new_device_path, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(s->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + } + } + + check_and_signal_rate(s); + + return PA_HOOK_OK; +} + +static pa_hook_result_t volume_changed_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_stream *s = slot_data; + DBusMessage *signal_msg = NULL; + unsigned i = 0; + + if ((s->type == STREAM_TYPE_PLAYBACK && s->sink_input != call_data) || + (s->type == STREAM_TYPE_RECORD && s->source_output != call_data)) + return PA_HOOK_OK; + + if (s->type == STREAM_TYPE_PLAYBACK && s->has_volume) { + pa_cvolume new_volume; + + pa_sink_input_get_volume(s->sink_input, &new_volume, true); + + if (!pa_cvolume_equal(&s->volume, &new_volume)) { + dbus_uint32_t volume[PA_CHANNELS_MAX]; + dbus_uint32_t *volume_ptr = volume; + + s->volume = new_volume; + + for (i = 0; i < s->volume.channels; ++i) + volume[i] = s->volume.values[i]; + + pa_assert_se(signal_msg = dbus_message_new_signal(s->path, + PA_DBUSIFACE_STREAM_INTERFACE, + signals[SIGNAL_VOLUME_UPDATED].name)); + pa_assert_se(dbus_message_append_args(signal_msg, + DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &volume_ptr, s->volume.channels, + DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(s->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + } + } + + return PA_HOOK_OK; +} + +static pa_hook_result_t mute_changed_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_stream *s = slot_data; + DBusMessage *signal_msg = NULL; + + if ((s->type == STREAM_TYPE_PLAYBACK && s->sink_input != call_data) || + (s->type == STREAM_TYPE_RECORD && s->source_output != call_data)) + return PA_HOOK_OK; + + if (s->type == STREAM_TYPE_PLAYBACK) { + bool new_mute = false; + + new_mute = s->sink_input->muted; + + if (s->mute != new_mute) { + s->mute = new_mute; + + pa_assert_se(signal_msg = dbus_message_new_signal(s->path, + PA_DBUSIFACE_STREAM_INTERFACE, + signals[SIGNAL_MUTE_UPDATED].name)); + pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_BOOLEAN, &s->mute, DBUS_TYPE_INVALID)); + + pa_dbus_protocol_send_signal(s->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + signal_msg = NULL; + } + } + + return PA_HOOK_OK; +} + +static pa_hook_result_t proplist_changed_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_stream *s = slot_data; + DBusMessage *signal_msg = NULL; + pa_proplist *new_proplist = NULL; + + if ((s->type == STREAM_TYPE_PLAYBACK && s->sink_input != call_data) || + (s->type == STREAM_TYPE_RECORD && s->source_output != call_data)) + return PA_HOOK_OK; + + new_proplist = (s->type == STREAM_TYPE_PLAYBACK) ? s->sink_input->proplist : s->source_output->proplist; + + if (!pa_proplist_equal(s->proplist, new_proplist)) { + DBusMessageIter msg_iter; + + pa_proplist_update(s->proplist, PA_UPDATE_SET, new_proplist); + + pa_assert_se(signal_msg = dbus_message_new_signal(s->path, + PA_DBUSIFACE_STREAM_INTERFACE, + signals[SIGNAL_PROPERTY_LIST_UPDATED].name)); + dbus_message_iter_init_append(signal_msg, &msg_iter); + pa_dbus_append_proplist(&msg_iter, s->proplist); + + pa_dbus_protocol_send_signal(s->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + } + + return PA_HOOK_OK; +} + +static pa_hook_result_t state_changed_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_stream *s = slot_data; + + pa_assert(s); + + if ((s->type == STREAM_TYPE_PLAYBACK && s->sink_input != call_data) || + (s->type == STREAM_TYPE_RECORD && s->source_output != call_data)) + return PA_HOOK_OK; + + check_and_signal_rate(s); + + return PA_HOOK_OK; +} + +static pa_hook_result_t send_event_cb(void *hook_data, void *call_data, void *slot_data) { + pa_dbusiface_stream *s = slot_data; + DBusMessage *signal_msg = NULL; + DBusMessageIter msg_iter; + const char *name = NULL; + pa_proplist *property_list = NULL; + + pa_assert(call_data); + pa_assert(s); + + if (s->type == STREAM_TYPE_PLAYBACK) { + pa_sink_input_send_event_hook_data *data = call_data; + + if (data->sink_input != s->sink_input) + return PA_HOOK_OK; + + name = data->event; + property_list = data->data; + } else { + pa_source_output_send_event_hook_data *data = call_data; + + if (data->source_output != s->source_output) + return PA_HOOK_OK; + + name = data->event; + property_list = data->data; + } + + pa_assert_se(signal_msg = dbus_message_new_signal(s->path, + PA_DBUSIFACE_STREAM_INTERFACE, + signals[SIGNAL_STREAM_EVENT].name)); + dbus_message_iter_init_append(signal_msg, &msg_iter); + pa_assert_se(dbus_message_iter_append_basic(&msg_iter, DBUS_TYPE_STRING, &name)); + pa_dbus_append_proplist(&msg_iter, property_list); + + pa_dbus_protocol_send_signal(s->dbus_protocol, signal_msg); + dbus_message_unref(signal_msg); + + return PA_HOOK_OK; +} + +pa_dbusiface_stream *pa_dbusiface_stream_new_playback(pa_dbusiface_core *core, pa_sink_input *sink_input) { + pa_dbusiface_stream *s; + + pa_assert(core); + pa_assert(sink_input); + + s = pa_xnew(pa_dbusiface_stream, 1); + s->core = core; + s->sink_input = pa_sink_input_ref(sink_input); + s->type = STREAM_TYPE_PLAYBACK; + s->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, PLAYBACK_OBJECT_NAME, sink_input->index); + s->sink = pa_sink_ref(sink_input->sink); + s->sample_rate = sink_input->sample_spec.rate; + s->has_volume = pa_sink_input_is_volume_readable(sink_input); + + if (s->has_volume) + pa_sink_input_get_volume(sink_input, &s->volume, true); + else + pa_cvolume_init(&s->volume); + + s->mute = sink_input->muted; + s->proplist = pa_proplist_copy(sink_input->proplist); + s->dbus_protocol = pa_dbus_protocol_get(sink_input->core); + s->send_event_slot = pa_hook_connect(&sink_input->core->hooks[PA_CORE_HOOK_SINK_INPUT_SEND_EVENT], + PA_HOOK_NORMAL, + send_event_cb, + s); + s->move_finish_slot = pa_hook_connect(&sink_input->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_FINISH], + PA_HOOK_NORMAL, move_finish_cb, s); + s->volume_changed_slot = pa_hook_connect(&sink_input->core->hooks[PA_CORE_HOOK_SINK_INPUT_VOLUME_CHANGED], + PA_HOOK_NORMAL, volume_changed_cb, s); + s->mute_changed_slot = pa_hook_connect(&sink_input->core->hooks[PA_CORE_HOOK_SINK_INPUT_MUTE_CHANGED], + PA_HOOK_NORMAL, mute_changed_cb, s); + s->proplist_changed_slot = pa_hook_connect(&sink_input->core->hooks[PA_CORE_HOOK_SINK_INPUT_PROPLIST_CHANGED], + PA_HOOK_NORMAL, proplist_changed_cb, s); + s->state_changed_slot = pa_hook_connect(&sink_input->core->hooks[PA_CORE_HOOK_SINK_INPUT_STATE_CHANGED], + PA_HOOK_NORMAL, state_changed_cb, s); + + pa_assert_se(pa_dbus_protocol_add_interface(s->dbus_protocol, s->path, &stream_interface_info, s) >= 0); + + return s; +} + +pa_dbusiface_stream *pa_dbusiface_stream_new_record(pa_dbusiface_core *core, pa_source_output *source_output) { + pa_dbusiface_stream *s; + + pa_assert(core); + pa_assert(source_output); + + s = pa_xnew(pa_dbusiface_stream, 1); + s->core = core; + s->source_output = pa_source_output_ref(source_output); + s->type = STREAM_TYPE_RECORD; + s->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, RECORD_OBJECT_NAME, source_output->index); + s->source = pa_source_ref(source_output->source); + s->sample_rate = source_output->sample_spec.rate; + pa_cvolume_init(&s->volume); + s->mute = false; + s->proplist = pa_proplist_copy(source_output->proplist); + s->has_volume = false; + s->dbus_protocol = pa_dbus_protocol_get(source_output->core); + s->send_event_slot = pa_hook_connect(&source_output->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_SEND_EVENT], + PA_HOOK_NORMAL, + send_event_cb, + s); + s->move_finish_slot = pa_hook_connect(&source_output->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_MOVE_FINISH], + PA_HOOK_NORMAL, move_finish_cb, s); + s->volume_changed_slot = pa_hook_connect(&source_output->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_VOLUME_CHANGED], + PA_HOOK_NORMAL, volume_changed_cb, s); + s->mute_changed_slot = pa_hook_connect(&source_output->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_MUTE_CHANGED], + PA_HOOK_NORMAL, mute_changed_cb, s); + s->proplist_changed_slot = pa_hook_connect(&source_output->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_PROPLIST_CHANGED], + PA_HOOK_NORMAL, proplist_changed_cb, s); + s->state_changed_slot = pa_hook_connect(&source_output->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_STATE_CHANGED], + PA_HOOK_NORMAL, state_changed_cb, s); + + pa_assert_se(pa_dbus_protocol_add_interface(s->dbus_protocol, s->path, &stream_interface_info, s) >= 0); + + return s; +} + +void pa_dbusiface_stream_free(pa_dbusiface_stream *s) { + pa_assert(s); + + pa_assert_se(pa_dbus_protocol_remove_interface(s->dbus_protocol, s->path, stream_interface_info.name) >= 0); + + if (s->type == STREAM_TYPE_PLAYBACK) { + pa_sink_input_unref(s->sink_input); + pa_sink_unref(s->sink); + } else { + pa_source_output_unref(s->source_output); + pa_source_unref(s->source); + } + + pa_proplist_free(s->proplist); + pa_dbus_protocol_unref(s->dbus_protocol); + pa_hook_slot_free(s->send_event_slot); + pa_hook_slot_free(s->move_finish_slot); + pa_hook_slot_free(s->volume_changed_slot); + pa_hook_slot_free(s->mute_changed_slot); + pa_hook_slot_free(s->proplist_changed_slot); + pa_hook_slot_free(s->state_changed_slot); + + pa_xfree(s->path); + pa_xfree(s); +} + +const char *pa_dbusiface_stream_get_path(pa_dbusiface_stream *s) { + pa_assert(s); + + return s->path; +} diff --git a/src/modules/dbus/iface-stream.h b/src/modules/dbus/iface-stream.h new file mode 100644 index 0000000..155cd7d --- /dev/null +++ b/src/modules/dbus/iface-stream.h @@ -0,0 +1,45 @@ +#ifndef foodbusifacestreamhfoo +#define foodbusifacestreamhfoo + +/*** + This file is part of PulseAudio. + + Copyright 2009 Tanu Kaskinen + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +/* This object implements the D-Bus interface org.PulseAudio.Core1.Stream. + * + * See http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/Developer/Clients/DBus/Stream/ + * for the Stream interface documentation. + */ + +#include +#include +#include + +#include "iface-core.h" + +#define PA_DBUSIFACE_STREAM_INTERFACE PA_DBUS_CORE_INTERFACE ".Stream" + +typedef struct pa_dbusiface_stream pa_dbusiface_stream; + +pa_dbusiface_stream *pa_dbusiface_stream_new_playback(pa_dbusiface_core *core, pa_sink_input *sink_input); +pa_dbusiface_stream *pa_dbusiface_stream_new_record(pa_dbusiface_core *core, pa_source_output *source_output); +void pa_dbusiface_stream_free(pa_dbusiface_stream *s); + +const char *pa_dbusiface_stream_get_path(pa_dbusiface_stream *s); + +#endif diff --git a/src/modules/dbus/module-dbus-protocol.c b/src/modules/dbus/module-dbus-protocol.c new file mode 100644 index 0000000..8a83c76 --- /dev/null +++ b/src/modules/dbus/module-dbus-protocol.c @@ -0,0 +1,609 @@ +/*** + This file is part of PulseAudio. + + Copyright 2009 Tanu Kaskinen + Copyright 2006 Lennart Poettering + Copyright 2006 Shams E. King + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "iface-client.h" +#include "iface-core.h" + +PA_MODULE_DESCRIPTION("D-Bus interface"); +PA_MODULE_USAGE( + "access=local|remote|local,remote " + "tcp_port= " + "tcp_listen="); +PA_MODULE_LOAD_ONCE(true); +PA_MODULE_AUTHOR("Tanu Kaskinen"); +PA_MODULE_VERSION(PACKAGE_VERSION); + +enum server_type { + SERVER_TYPE_LOCAL, + SERVER_TYPE_TCP +}; + +struct server; +struct connection; + +struct userdata { + pa_module *module; + bool local_access; + bool remote_access; + uint32_t tcp_port; + char *tcp_listen; + + struct server *local_server; + struct server *tcp_server; + + pa_idxset *connections; + + pa_defer_event *cleanup_event; + + pa_dbus_protocol *dbus_protocol; + pa_dbusiface_core *core_iface; +}; + +struct server { + struct userdata *userdata; + enum server_type type; + DBusServer *dbus_server; +}; + +struct connection { + struct server *server; + pa_dbus_wrap_connection *wrap_conn; + pa_client *client; +}; + +static const char* const valid_modargs[] = { + "access", + "tcp_port", + "tcp_listen", + NULL +}; + +static void connection_free(struct connection *c) { + pa_assert(c); + + pa_assert_se(pa_dbus_protocol_unregister_connection(c->server->userdata->dbus_protocol, pa_dbus_wrap_connection_get(c->wrap_conn)) >= 0); + + pa_client_free(c->client); + pa_dbus_wrap_connection_free(c->wrap_conn); + pa_xfree(c); +} + +/* Called from pa_client_kill(). */ +static void client_kill_cb(pa_client *c) { + struct connection *conn; + + pa_assert(c); + pa_assert(c->userdata); + + conn = c->userdata; + pa_idxset_remove_by_data(conn->server->userdata->connections, conn, NULL); + connection_free(conn); + c->userdata = NULL; + + pa_log_info("Connection killed."); +} + +/* Called from pa_client_send_event(). */ +static void client_send_event_cb(pa_client *c, const char *name, pa_proplist *data) { + struct connection *conn = NULL; + DBusMessage *signal_msg = NULL; + DBusMessageIter msg_iter; + + pa_assert(c); + pa_assert(name); + pa_assert(data); + pa_assert(c->userdata); + + conn = c->userdata; + + pa_assert_se(signal_msg = dbus_message_new_signal(pa_dbusiface_core_get_client_path(conn->server->userdata->core_iface, c), + PA_DBUSIFACE_CLIENT_INTERFACE, + "ClientEvent")); + dbus_message_iter_init_append(signal_msg, &msg_iter); + pa_assert_se(dbus_message_iter_append_basic(&msg_iter, DBUS_TYPE_STRING, &name)); + pa_dbus_append_proplist(&msg_iter, data); + + pa_assert_se(dbus_connection_send(pa_dbus_wrap_connection_get(conn->wrap_conn), signal_msg, NULL)); + dbus_message_unref(signal_msg); +} + +/* Called by D-Bus at the authentication phase. */ +static dbus_bool_t user_check_cb(DBusConnection *connection, unsigned long uid, void *data) { + pa_log_debug("Allowing connection by user %lu.", uid); + + return TRUE; +} + +static DBusHandlerResult disconnection_filter_cb(DBusConnection *connection, DBusMessage *message, void *user_data) { + struct connection *c = user_data; + + pa_assert(connection); + pa_assert(message); + pa_assert(c); + + if (dbus_message_is_signal(message, "org.freedesktop.DBus.Local", "Disconnected")) { + /* The connection died. Now we want to free the connection object, but + * let's wait until this message is fully processed, in case someone + * else is interested in this signal too. */ + c->server->userdata->module->core->mainloop->defer_enable(c->server->userdata->cleanup_event, 1); + } + + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +/* Called by D-Bus when a new client connection is received. */ +static void connection_new_cb(DBusServer *dbus_server, DBusConnection *new_connection, void *data) { + struct server *s = data; + struct connection *c; + pa_client_new_data new_data; + pa_client *client; + + pa_assert(new_connection); + pa_assert(s); + + pa_client_new_data_init(&new_data); + new_data.module = s->userdata->module; + new_data.driver = __FILE__; + pa_proplist_sets(new_data.proplist, PA_PROP_APPLICATION_NAME, "D-Bus client"); + client = pa_client_new(s->userdata->module->core, &new_data); + pa_client_new_data_done(&new_data); + + if (!client) { + dbus_connection_close(new_connection); + return; + } + + if (s->type == SERVER_TYPE_TCP || s->userdata->module->core->server_type == PA_SERVER_TYPE_SYSTEM) { + /* FIXME: Here we allow anyone from anywhere to access the server, + * anonymously. Access control should be configurable. */ + dbus_connection_set_unix_user_function(new_connection, user_check_cb, NULL, NULL); + dbus_connection_set_allow_anonymous(new_connection, TRUE); + } + + c = pa_xnew(struct connection, 1); + c->server = s; + c->wrap_conn = pa_dbus_wrap_connection_new_from_existing(s->userdata->module->core->mainloop, true, new_connection); + c->client = client; + + c->client->kill = client_kill_cb; + c->client->send_event = client_send_event_cb; + c->client->userdata = c; + + pa_assert_se(dbus_connection_add_filter(new_connection, disconnection_filter_cb, c, NULL)); + + pa_idxset_put(s->userdata->connections, c, NULL); + + pa_assert_se(pa_dbus_protocol_register_connection(s->userdata->dbus_protocol, new_connection, c->client) >= 0); +} + +/* Called by PA mainloop when a D-Bus fd watch event needs handling. */ +static void io_event_cb(pa_mainloop_api *mainloop, pa_io_event *e, int fd, pa_io_event_flags_t events, void *userdata) { + unsigned int flags = 0; + DBusWatch *watch = userdata; + + pa_assert(fd == dbus_watch_get_unix_fd(watch)); + + if (!dbus_watch_get_enabled(watch)) { + pa_log_warn("Asked to handle disabled watch: %p %i", (void*) watch, fd); + return; + } + + if (events & PA_IO_EVENT_INPUT) + flags |= DBUS_WATCH_READABLE; + if (events & PA_IO_EVENT_OUTPUT) + flags |= DBUS_WATCH_WRITABLE; + if (events & PA_IO_EVENT_HANGUP) + flags |= DBUS_WATCH_HANGUP; + if (events & PA_IO_EVENT_ERROR) + flags |= DBUS_WATCH_ERROR; + + dbus_watch_handle(watch, flags); +} + +/* Called by PA mainloop when a D-Bus timer event needs handling. */ +static void time_event_cb(pa_mainloop_api *mainloop, pa_time_event* e, const struct timeval *tv, void *userdata) { + DBusTimeout *timeout = userdata; + + if (dbus_timeout_get_enabled(timeout)) { + struct timeval next = *tv; + dbus_timeout_handle(timeout); + + /* restart it for the next scheduled time */ + pa_timeval_add(&next, (pa_usec_t) dbus_timeout_get_interval(timeout) * 1000); + mainloop->time_restart(e, &next); + } +} + +/* Translates D-Bus fd watch event flags to PA IO event flags. */ +static pa_io_event_flags_t get_watch_flags(DBusWatch *watch) { + unsigned int flags; + pa_io_event_flags_t events = 0; + + pa_assert(watch); + + flags = dbus_watch_get_flags(watch); + + /* no watch flags for disabled watches */ + if (!dbus_watch_get_enabled(watch)) + return PA_IO_EVENT_NULL; + + if (flags & DBUS_WATCH_READABLE) + events |= PA_IO_EVENT_INPUT; + if (flags & DBUS_WATCH_WRITABLE) + events |= PA_IO_EVENT_OUTPUT; + + return events | PA_IO_EVENT_HANGUP | PA_IO_EVENT_ERROR; +} + +/* Called by D-Bus when a D-Bus fd watch event is added. */ +static dbus_bool_t watch_add_cb(DBusWatch *watch, void *data) { + struct server *s = data; + pa_mainloop_api *mainloop; + pa_io_event *ev; + + pa_assert(watch); + pa_assert(s); + + mainloop = s->userdata->module->core->mainloop; + + ev = mainloop->io_new( + mainloop, + dbus_watch_get_unix_fd(watch), + get_watch_flags(watch), io_event_cb, watch); + + dbus_watch_set_data(watch, ev, NULL); + + return TRUE; +} + +/* Called by D-Bus when a D-Bus fd watch event is removed. */ +static void watch_remove_cb(DBusWatch *watch, void *data) { + struct server *s = data; + pa_io_event *ev; + + pa_assert(watch); + pa_assert(s); + + if ((ev = dbus_watch_get_data(watch))) + s->userdata->module->core->mainloop->io_free(ev); +} + +/* Called by D-Bus when a D-Bus fd watch event is toggled. */ +static void watch_toggled_cb(DBusWatch *watch, void *data) { + struct server *s = data; + pa_io_event *ev; + + pa_assert(watch); + pa_assert(s); + + pa_assert_se(ev = dbus_watch_get_data(watch)); + + /* get_watch_flags() checks if the watch is enabled */ + s->userdata->module->core->mainloop->io_enable(ev, get_watch_flags(watch)); +} + +/* Called by D-Bus when a D-Bus timer event is added. */ +static dbus_bool_t timeout_add_cb(DBusTimeout *timeout, void *data) { + struct server *s = data; + pa_mainloop_api *mainloop; + pa_time_event *ev; + struct timeval tv; + + pa_assert(timeout); + pa_assert(s); + + if (!dbus_timeout_get_enabled(timeout)) + return FALSE; + + mainloop = s->userdata->module->core->mainloop; + + pa_gettimeofday(&tv); + pa_timeval_add(&tv, (pa_usec_t) dbus_timeout_get_interval(timeout) * 1000); + + ev = mainloop->time_new(mainloop, &tv, time_event_cb, timeout); + + dbus_timeout_set_data(timeout, ev, NULL); + + return TRUE; +} + +/* Called by D-Bus when a D-Bus timer event is removed. */ +static void timeout_remove_cb(DBusTimeout *timeout, void *data) { + struct server *s = data; + pa_time_event *ev; + + pa_assert(timeout); + pa_assert(s); + + if ((ev = dbus_timeout_get_data(timeout))) + s->userdata->module->core->mainloop->time_free(ev); +} + +/* Called by D-Bus when a D-Bus timer event is toggled. */ +static void timeout_toggled_cb(DBusTimeout *timeout, void *data) { + struct server *s = data; + pa_mainloop_api *mainloop; + pa_time_event *ev; + + pa_assert(timeout); + pa_assert(s); + + mainloop = s->userdata->module->core->mainloop; + + pa_assert_se(ev = dbus_timeout_get_data(timeout)); + + if (dbus_timeout_get_enabled(timeout)) { + struct timeval tv; + + pa_gettimeofday(&tv); + pa_timeval_add(&tv, (pa_usec_t) dbus_timeout_get_interval(timeout) * 1000); + + mainloop->time_restart(ev, &tv); + } else + mainloop->time_restart(ev, NULL); +} + +static void server_free(struct server *s) { + pa_assert(s); + + if (s->dbus_server) { + dbus_server_disconnect(s->dbus_server); + dbus_server_unref(s->dbus_server); + } + + pa_xfree(s); +} + +static struct server *start_server(struct userdata *u, const char *address, enum server_type type) { + /* XXX: We assume that when we unref the DBusServer instance at module + * shutdown, nobody else holds any references to it. If we stop assuming + * that someday, dbus_server_set_new_connection_function, + * dbus_server_set_watch_functions and dbus_server_set_timeout_functions + * calls should probably register free callbacks, instead of providing NULL + * as they do now. */ + + struct server *s = NULL; + DBusError error; + + pa_assert(u); + pa_assert(address); + + dbus_error_init(&error); + + s = pa_xnew0(struct server, 1); + s->userdata = u; + s->type = type; + s->dbus_server = dbus_server_listen(address, &error); + + if (dbus_error_is_set(&error)) { + pa_log("dbus_server_listen() failed: %s: %s", error.name, error.message); + goto fail; + } + + dbus_server_set_new_connection_function(s->dbus_server, connection_new_cb, s, NULL); + + if (!dbus_server_set_watch_functions(s->dbus_server, watch_add_cb, watch_remove_cb, watch_toggled_cb, s, NULL)) { + pa_log("dbus_server_set_watch_functions() ran out of memory."); + goto fail; + } + + if (!dbus_server_set_timeout_functions(s->dbus_server, timeout_add_cb, timeout_remove_cb, timeout_toggled_cb, s, NULL)) { + pa_log("dbus_server_set_timeout_functions() ran out of memory."); + goto fail; + } + + return s; + +fail: + if (s) + server_free(s); + + dbus_error_free(&error); + + return NULL; +} + +static struct server *start_local_server(struct userdata *u) { + struct server *s = NULL; + char *address = NULL; + + pa_assert(u); + + address = pa_get_dbus_address_from_server_type(u->module->core->server_type); + + s = start_server(u, address, SERVER_TYPE_LOCAL); /* May return NULL */ + + pa_xfree(address); + + return s; +} + +static struct server *start_tcp_server(struct userdata *u) { + struct server *s = NULL; + char *address = NULL; + + pa_assert(u); + + address = pa_sprintf_malloc("tcp:host=%s,port=%u", u->tcp_listen, u->tcp_port); + + s = start_server(u, address, SERVER_TYPE_TCP); /* May return NULL */ + + pa_xfree(address); + + return s; +} + +static int get_access_arg(pa_modargs *ma, bool *local_access, bool *remote_access) { + const char *value = NULL; + + pa_assert(ma); + pa_assert(local_access); + pa_assert(remote_access); + + if (!(value = pa_modargs_get_value(ma, "access", NULL))) + return 0; + + if (pa_streq(value, "local")) { + *local_access = true; + *remote_access = false; + } else if (pa_streq(value, "remote")) { + *local_access = false; + *remote_access = true; + } else if (pa_streq(value, "local,remote")) { + *local_access = true; + *remote_access = true; + } else + return -1; + + return 0; +} + +/* Frees dead client connections. */ +static void cleanup_cb(pa_mainloop_api *a, pa_defer_event *e, void *userdata) { + struct userdata *u = userdata; + struct connection *conn = NULL; + uint32_t idx; + + PA_IDXSET_FOREACH(conn, u->connections, idx) { + if (!dbus_connection_get_is_connected(pa_dbus_wrap_connection_get(conn->wrap_conn))) { + pa_idxset_remove_by_data(u->connections, conn, NULL); + connection_free(conn); + } + } + + u->module->core->mainloop->defer_enable(e, 0); +} + +int pa__init(pa_module *m) { + struct userdata *u = NULL; + pa_modargs *ma = NULL; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments."); + goto fail; + } + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->module = m; + u->local_access = true; + u->remote_access = false; + u->tcp_port = PA_DBUS_DEFAULT_PORT; + + if (get_access_arg(ma, &u->local_access, &u->remote_access) < 0) { + pa_log("Invalid access argument: '%s'", pa_modargs_get_value(ma, "access", NULL)); + goto fail; + } + + if (pa_modargs_get_value_u32(ma, "tcp_port", &u->tcp_port) < 0 || u->tcp_port < 1 || u->tcp_port > 49150) { + pa_log("Invalid tcp_port argument: '%s'", pa_modargs_get_value(ma, "tcp_port", NULL)); + goto fail; + } + + u->tcp_listen = pa_xstrdup(pa_modargs_get_value(ma, "tcp_listen", "0.0.0.0")); + + if (u->local_access && !(u->local_server = start_local_server(u))) { + pa_log("Starting the local D-Bus server failed."); + goto fail; + } + + if (u->remote_access && !(u->tcp_server = start_tcp_server(u))) { + pa_log("Starting the D-Bus server for remote connections failed."); + goto fail; + } + + u->connections = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + + u->cleanup_event = m->core->mainloop->defer_new(m->core->mainloop, cleanup_cb, u); + m->core->mainloop->defer_enable(u->cleanup_event, 0); + + u->dbus_protocol = pa_dbus_protocol_get(m->core); + u->core_iface = pa_dbusiface_core_new(m->core); + + pa_modargs_free(ma); + + return 0; + +fail: + if (ma) + pa_modargs_free(ma); + + pa__done(m); + + return -1; +} + +void pa__done(pa_module *m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->core_iface) + pa_dbusiface_core_free(u->core_iface); + + if (u->connections) + pa_idxset_free(u->connections, (pa_free_cb_t) connection_free); + + /* This must not be called before the connections are freed, because if + * there are any connections left, they will emit the + * org.freedesktop.DBus.Local.Disconnected signal, and + * disconnection_filter_cb() will be called. disconnection_filter_cb() then + * tries to enable the defer event, and if it's already freed, an assertion + * will be hit in mainloop.c. */ + if (u->cleanup_event) + m->core->mainloop->defer_free(u->cleanup_event); + + if (u->tcp_server) + server_free(u->tcp_server); + + if (u->local_server) + server_free(u->local_server); + + if (u->dbus_protocol) + pa_dbus_protocol_unref(u->dbus_protocol); + + pa_xfree(u->tcp_listen); + pa_xfree(u); + m->userdata = NULL; +} diff --git a/src/modules/echo-cancel/adrian-aec.c b/src/modules/echo-cancel/adrian-aec.c new file mode 100644 index 0000000..215ea76 --- /dev/null +++ b/src/modules/echo-cancel/adrian-aec.c @@ -0,0 +1,287 @@ +/* aec.cpp + * + * Copyright (C) DFS Deutsche Flugsicherung (2004, 2005). + * All Rights Reserved. + * + * Acoustic Echo Cancellation NLMS-pw algorithm + * + * Version 0.3 filter created with www.dsptutor.freeuk.com + * Version 0.3.1 Allow change of stability parameter delta + * Version 0.4 Leaky Normalized LMS - pre whitening algorithm + */ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include + +#include "adrian-aec.h" + +#ifndef DISABLE_ORC +#include "adrian-aec-orc-gen.h" +#endif + +#ifdef __SSE__ +#include +#endif + +/* Vector Dot Product */ +static REAL dotp(REAL a[], REAL b[]) +{ + REAL sum0 = 0.0f, sum1 = 0.0f; + int j; + + for (j = 0; j < NLMS_LEN; j += 2) { + // optimize: partial loop unrolling + sum0 += a[j] * b[j]; + sum1 += a[j + 1] * b[j + 1]; + } + return sum0 + sum1; +} + +static REAL dotp_sse(REAL a[], REAL b[]) +{ +#ifdef __SSE__ + /* This is taken from speex's inner product implementation */ + int j; + REAL sum; + __m128 acc = _mm_setzero_ps(); + + for (j=0;jj = NLMS_EXT; + AEC_setambient(a, NoiseFloor); + a->dfast = a->dslow = M75dB_PCM; + a->xfast = a->xslow = M80dB_PCM; + a->gain = 1.0f; + a->Fx = IIR1_init(2000.0f/RATE); + a->Fe = IIR1_init(2000.0f/RATE); + a->cutoff = FIR_HP_300Hz_init(); + a->acMic = IIR_HP_init(); + a->acSpk = IIR_HP_init(); + + a->aes_y2 = M0dB; + + a->fdwdisplay = -1; + + if (have_vector) { + /* Get a 16-byte aligned location */ + a->w = (REAL *) (((uintptr_t) a->w_arr) - (((uintptr_t) a->w_arr) % 16) + 16); + a->dotp = dotp_sse; + } else { + /* We don't care about alignment, just use the array as-is */ + a->w = a->w_arr; + a->dotp = dotp; + } + + return a; +} + +void AEC_done(AEC *a) { + pa_assert(a); + + pa_xfree(a->Fx); + pa_xfree(a->Fe); + pa_xfree(a->acMic); + pa_xfree(a->acSpk); + pa_xfree(a->cutoff); + pa_xfree(a); +} + +// Adrian soft decision DTD +// (Dual Average Near-End to Far-End signal Ratio DTD) +// This algorithm uses exponential smoothing with different +// ageing parameters to get fast and slow near-end and far-end +// signal averages. The ratio of NFRs term +// (dfast / xfast) / (dslow / xslow) is used to compute the stepsize +// A ratio value of 2.5 is mapped to stepsize 0, a ratio of 0 is +// mapped to 1.0 with a limited linear function. +static float AEC_dtd(AEC *a, REAL d, REAL x) +{ + float ratio, stepsize; + + // fast near-end and far-end average + a->dfast += ALPHAFAST * (fabsf(d) - a->dfast); + a->xfast += ALPHAFAST * (fabsf(x) - a->xfast); + + // slow near-end and far-end average + a->dslow += ALPHASLOW * (fabsf(d) - a->dslow); + a->xslow += ALPHASLOW * (fabsf(x) - a->xslow); + + if (a->xfast < M70dB_PCM) { + return 0.0f; // no Spk signal + } + + if (a->dfast < M70dB_PCM) { + return 0.0f; // no Mic signal + } + + // ratio of NFRs + ratio = (a->dfast * a->xslow) / (a->dslow * a->xfast); + + // Linear interpolation with clamping at the limits + if (ratio < STEPX1) + stepsize = STEPY1; + else if (ratio > STEPX2) + stepsize = STEPY2; + else + stepsize = STEPY1 + (STEPY2 - STEPY1) * (ratio - STEPX1) / (STEPX2 - STEPX1); + + return stepsize; +} + + +static void AEC_leaky(AEC *a) +// The xfast signal is used to charge the hangover timer to Thold. +// When hangover expires (no Spk signal for some time) the vector w +// is erased. This is my implementation of Leaky NLMS. +{ + if (a->xfast >= M70dB_PCM) { + // vector w is valid for hangover Thold time + a->hangover = Thold; + } else { + if (a->hangover > 1) { + --(a->hangover); + } else if (1 == a->hangover) { + --(a->hangover); + // My Leaky NLMS is to erase vector w when hangover expires + memset(a->w_arr, 0, sizeof(a->w_arr)); + } + } +} + + +#if 0 +void AEC::openwdisplay() { + // open TCP connection to program wdisplay.tcl + fdwdisplay = socket_async("127.0.0.1", 50999); +}; +#endif + + +static REAL AEC_nlms_pw(AEC *a, REAL d, REAL x_, float stepsize) +{ + REAL e; + REAL ef; + a->x[a->j] = x_; + a->xf[a->j] = IIR1_highpass(a->Fx, x_); // pre-whitening of x + + // calculate error value + // (mic signal - estimated mic signal from spk signal) + e = d; + if (a->hangover > 0) { + e -= a->dotp(a->w, a->x + a->j); + } + ef = IIR1_highpass(a->Fe, e); // pre-whitening of e + + // optimize: iterative dotp(xf, xf) + a->dotp_xf_xf += (a->xf[a->j] * a->xf[a->j] - a->xf[a->j + NLMS_LEN - 1] * a->xf[a->j + NLMS_LEN - 1]); + + if (stepsize > 0.0f) { + // calculate variable step size + REAL mikro_ef = stepsize * ef / a->dotp_xf_xf; + +#ifdef DISABLE_ORC + // update tap weights (filter learning) + int i; + for (i = 0; i < NLMS_LEN; i += 2) { + // optimize: partial loop unrolling + a->w[i] += mikro_ef * a->xf[i + a->j]; + a->w[i + 1] += mikro_ef * a->xf[i + a->j + 1]; + } +#else + update_tap_weights(a->w, &a->xf[a->j], mikro_ef, NLMS_LEN); +#endif + } + + if (--(a->j) < 0) { + // optimize: decrease number of memory copies + a->j = NLMS_EXT; + memmove(a->x + a->j + 1, a->x, (NLMS_LEN - 1) * sizeof(REAL)); + memmove(a->xf + a->j + 1, a->xf, (NLMS_LEN - 1) * sizeof(REAL)); + } + + // Saturation + if (e > MAXPCM) { + return MAXPCM; + } else if (e < -MAXPCM) { + return -MAXPCM; + } else { + return e; + } +} + + +int AEC_doAEC(AEC *a, int d_, int x_) +{ + REAL d = (REAL) d_; + REAL x = (REAL) x_; + + // Mic Highpass Filter - to remove DC + d = IIR_HP_highpass(a->acMic, d); + + // Mic Highpass Filter - cut-off below 300Hz + d = FIR_HP_300Hz_highpass(a->cutoff, d); + + // Amplify, for e.g. Soundcards with -6dB max. volume + d *= a->gain; + + // Spk Highpass Filter - to remove DC + x = IIR_HP_highpass(a->acSpk, x); + + // Double Talk Detector + a->stepsize = AEC_dtd(a, d, x); + + // Leaky (ageing of vector w) + AEC_leaky(a); + + // Acoustic Echo Cancellation + d = AEC_nlms_pw(a, d, x, a->stepsize); + +#if 0 + if (fdwdisplay >= 0) { + if (++dumpcnt >= (WIDEB*RATE/10)) { + // wdisplay creates 10 dumps per seconds = large CPU load! + dumpcnt = 0; + write(fdwdisplay, ws, DUMP_LEN*sizeof(float)); + // we don't check return value. This is not production quality!!! + memset(ws, 0, sizeof(ws)); + } else { + int i; + for (i = 0; i < DUMP_LEN; i += 2) { + // optimize: partial loop unrolling + ws[i] += w[i]; + ws[i + 1] += w[i + 1]; + } + } + } +#endif + + return (int) d; +} diff --git a/src/modules/echo-cancel/adrian-aec.h b/src/modules/echo-cancel/adrian-aec.h new file mode 100644 index 0000000..3a31fd8 --- /dev/null +++ b/src/modules/echo-cancel/adrian-aec.h @@ -0,0 +1,383 @@ +/* aec.h + * + * Copyright (C) DFS Deutsche Flugsicherung (2004, 2005). + * All Rights Reserved. + * Author: Andre Adrian + * + * Acoustic Echo Cancellation Leaky NLMS-pw algorithm + * + * Version 0.3 filter created with www.dsptutor.freeuk.com + * Version 0.3.1 Allow change of stability parameter delta + * Version 0.4 Leaky Normalized LMS - pre whitening algorithm + */ + +#ifndef _AEC_H /* include only once */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include + +#define WIDEB 2 + +// use double if your CPU does software-emulation of float +#define REAL float + +/* dB Values */ +#define M0dB 1.0f +#define M3dB 0.71f +#define M6dB 0.50f +#define M9dB 0.35f +#define M12dB 0.25f +#define M18dB 0.125f +#define M24dB 0.063f + +/* dB values for 16bit PCM */ +/* MxdB_PCM = 32767 * 10 ^(x / 20) */ +#define M10dB_PCM 10362.0f +#define M20dB_PCM 3277.0f +#define M25dB_PCM 1843.0f +#define M30dB_PCM 1026.0f +#define M35dB_PCM 583.0f +#define M40dB_PCM 328.0f +#define M45dB_PCM 184.0f +#define M50dB_PCM 104.0f +#define M55dB_PCM 58.0f +#define M60dB_PCM 33.0f +#define M65dB_PCM 18.0f +#define M70dB_PCM 10.0f +#define M75dB_PCM 6.0f +#define M80dB_PCM 3.0f +#define M85dB_PCM 2.0f +#define M90dB_PCM 1.0f + +#define MAXPCM 32767.0f + +/* Design constants (Change to fine tune the algorithms */ + +/* The following values are for hardware AEC and studio quality + * microphone */ + +/* NLMS filter length in taps (samples). A longer filter length gives + * better Echo Cancellation, but maybe slower convergence speed and + * needs more CPU power (Order of NLMS is linear) */ +#define NLMS_LEN (100*WIDEB*8) + +/* Vector w visualization length in taps (samples). + * Must match argv value for wdisplay.tcl */ +#define DUMP_LEN (40*WIDEB*8) + +/* minimum energy in xf. Range: M70dB_PCM to M50dB_PCM. Should be equal + * to microphone ambient Noise level */ +#define NoiseFloor M55dB_PCM + +/* Leaky hangover in taps. + */ +#define Thold (60 * WIDEB * 8) + +// Adrian soft decision DTD +// left point. X is ratio, Y is stepsize +#define STEPX1 1.0 +#define STEPY1 1.0 +// right point. STEPX2=2.0 is good double talk, 3.0 is good single talk. +#define STEPX2 2.5 +#define STEPY2 0 +#define ALPHAFAST (1.0f / 100.0f) +#define ALPHASLOW (1.0f / 20000.0f) + + + +/* Ageing multiplier for LMS memory vector w */ +#define Leaky 0.9999f + +/* Double Talk Detector Speaker/Microphone Threshold. Range <=1 + * Large value (M0dB) is good for Single-Talk Echo cancellation, + * small value (M12dB) is good for Double-Talk AEC */ +#define GeigelThreshold M6dB + +/* for Non Linear Processor. Range >0 to 1. Large value (M0dB) is good + * for Double-Talk, small value (M12dB) is good for Single-Talk */ +#define NLPAttenuation M12dB + +/* Below this line there are no more design constants */ + +typedef struct IIR_HP IIR_HP; + +/* Exponential Smoothing or IIR Infinite Impulse Response Filter */ +struct IIR_HP { + REAL x; +}; + +static IIR_HP* IIR_HP_init(void) { + IIR_HP *i = pa_xnew(IIR_HP, 1); + i->x = 0.0f; + return i; + } + +static REAL IIR_HP_highpass(IIR_HP *i, REAL in) { + const REAL a0 = 0.01f; /* controls Transfer Frequency */ + /* Highpass = Signal - Lowpass. Lowpass = Exponential Smoothing */ + i->x += a0 * (in - i->x); + return in - i->x; + } + +typedef struct FIR_HP_300Hz FIR_HP_300Hz; + +#if WIDEB==1 +/* 17 taps FIR Finite Impulse Response filter + * Coefficients calculated with + * www.dsptutor.freeuk.com/KaiserFilterDesign/KaiserFilterDesign.html + */ +class FIR_HP_300Hz { + REAL z[18]; + +public: + FIR_HP_300Hz() { + memset(this, 0, sizeof(FIR_HP_300Hz)); + } + + REAL highpass(REAL in) { + const REAL a[18] = { + // Kaiser Window FIR Filter, Filter type: High pass + // Passband: 300.0 - 4000.0 Hz, Order: 16 + // Transition band: 75.0 Hz, Stopband attenuation: 10.0 dB + -0.034870606, -0.039650206, -0.044063766, -0.04800318, + -0.051370874, -0.054082647, -0.056070227, -0.057283327, + 0.8214126, -0.057283327, -0.056070227, -0.054082647, + -0.051370874, -0.04800318, -0.044063766, -0.039650206, + -0.034870606, 0.0 + }; + memmove(z + 1, z, 17 * sizeof(REAL)); + z[0] = in; + REAL sum0 = 0.0, sum1 = 0.0; + int j; + + for (j = 0; j < 18; j += 2) { + // optimize: partial loop unrolling + sum0 += a[j] * z[j]; + sum1 += a[j + 1] * z[j + 1]; + } + return sum0 + sum1; + } +}; + +#else + +/* 35 taps FIR Finite Impulse Response filter + * Passband 150Hz to 4kHz for 8kHz sample rate, 300Hz to 8kHz for 16kHz + * sample rate. + * Coefficients calculated with + * www.dsptutor.freeuk.com/KaiserFilterDesign/KaiserFilterDesign.html + */ +struct FIR_HP_300Hz { + REAL z[36]; +}; + +static FIR_HP_300Hz* FIR_HP_300Hz_init(void) { + FIR_HP_300Hz *ret = pa_xnew(FIR_HP_300Hz, 1); + memset(ret, 0, sizeof(FIR_HP_300Hz)); + return ret; + } + +static REAL FIR_HP_300Hz_highpass(FIR_HP_300Hz *f, REAL in) { + REAL sum0 = 0.0, sum1 = 0.0; + int j; + const REAL a[36] = { + // Kaiser Window FIR Filter, Filter type: High pass + // Passband: 150.0 - 4000.0 Hz, Order: 34 + // Transition band: 34.0 Hz, Stopband attenuation: 10.0 dB + -0.016165324, -0.017454365, -0.01871232, -0.019931411, + -0.021104068, -0.022222936, -0.02328091, -0.024271343, + -0.025187887, -0.02602462, -0.026776174, -0.027437767, + -0.028004972, -0.028474221, -0.028842418, -0.029107114, + -0.02926664, 0.8524841, -0.02926664, -0.029107114, + -0.028842418, -0.028474221, -0.028004972, -0.027437767, + -0.026776174, -0.02602462, -0.025187887, -0.024271343, + -0.02328091, -0.022222936, -0.021104068, -0.019931411, + -0.01871232, -0.017454365, -0.016165324, 0.0 + }; + memmove(f->z + 1, f->z, 35 * sizeof(REAL)); + f->z[0] = in; + + for (j = 0; j < 36; j += 2) { + // optimize: partial loop unrolling + sum0 += a[j] * f->z[j]; + sum1 += a[j + 1] * f->z[j + 1]; + } + return sum0 + sum1; + } +#endif + +typedef struct IIR1 IIR1; + +/* Recursive single pole IIR Infinite Impulse response High-pass filter + * + * Reference: The Scientist and Engineer's Guide to Digital Processing + * + * output[N] = A0 * input[N] + A1 * input[N-1] + B1 * output[N-1] + * + * X = exp(-2.0 * pi * Fc) + * A0 = (1 + X) / 2 + * A1 = -(1 + X) / 2 + * B1 = X + * Fc = cutoff freq / sample rate + */ +struct IIR1 { + REAL in0, out0; + REAL a0, a1, b1; +}; + +#if 0 + IIR1() { + memset(this, 0, sizeof(IIR1)); + } +#endif + +static IIR1* IIR1_init(REAL Fc) { + IIR1 *i = pa_xnew(IIR1, 1); + i->b1 = expf(-2.0f * M_PI * Fc); + i->a0 = (1.0f + i->b1) / 2.0f; + i->a1 = -(i->a0); + i->in0 = 0.0f; + i->out0 = 0.0f; + return i; + } + +static REAL IIR1_highpass(IIR1 *i, REAL in) { + REAL out = i->a0 * in + i->a1 * i->in0 + i->b1 * i->out0; + i->in0 = in; + i->out0 = out; + return out; + } + + +#if 0 +/* Recursive two pole IIR Infinite Impulse Response filter + * Coefficients calculated with + * http://www.dsptutor.freeuk.com/IIRFilterDesign/IIRFiltDes102.html + */ +class IIR2 { + REAL x[2], y[2]; + +public: + IIR2() { + memset(this, 0, sizeof(IIR2)); + } + + REAL highpass(REAL in) { + // Butterworth IIR filter, Filter type: HP + // Passband: 2000 - 4000.0 Hz, Order: 2 + const REAL a[] = { 0.29289323f, -0.58578646f, 0.29289323f }; + const REAL b[] = { 1.3007072E-16f, 0.17157288f }; + REAL out = + a[0] * in + a[1] * x[0] + a[2] * x[1] - b[0] * y[0] - b[1] * y[1]; + + x[1] = x[0]; + x[0] = in; + y[1] = y[0]; + y[0] = out; + return out; + } +}; +#endif + + +// Extension in taps to reduce mem copies +#define NLMS_EXT (10*8) + +// block size in taps to optimize DTD calculation +#define DTD_LEN 16 + +typedef struct AEC AEC; + +struct AEC { + // Time domain Filters + IIR_HP *acMic, *acSpk; // DC-level remove Highpass) + FIR_HP_300Hz *cutoff; // 150Hz cut-off Highpass + REAL gain; // Mic signal amplify + IIR1 *Fx, *Fe; // pre-whitening Highpass for x, e + + // Adrian soft decision DTD (Double Talk Detector) + REAL dfast, xfast; + REAL dslow, xslow; + + // NLMS-pw + REAL x[NLMS_LEN + NLMS_EXT]; // tap delayed loudspeaker signal + REAL xf[NLMS_LEN + NLMS_EXT]; // pre-whitening tap delayed signal + REAL w_arr[NLMS_LEN + (16 / sizeof(REAL))]; // tap weights + REAL *w; // this will be a 16-byte aligned pointer into w_arr + int j; // optimize: less memory copies + double dotp_xf_xf; // double to avoid loss of precision + float delta; // noise floor to stabilize NLMS + + // AES + float aes_y2; // not in use! + + // w vector visualization + REAL ws[DUMP_LEN]; // tap weights sums + int fdwdisplay; // TCP file descriptor + int dumpcnt; // wdisplay output counter + + // variables are public for visualization + int hangover; + float stepsize; + + // vfuncs that are picked based on processor features available + REAL (*dotp) (REAL[], REAL[]); +}; + +/* Double-Talk Detector + * + * in d: microphone sample (PCM as REALing point value) + * in x: loudspeaker sample (PCM as REALing point value) + * return: from 0 for doubletalk to 1.0 for single talk + */ +static float AEC_dtd(AEC *a, REAL d, REAL x); + +static void AEC_leaky(AEC *a); + +/* Normalized Least Mean Square Algorithm pre-whitening (NLMS-pw) + * The LMS algorithm was developed by Bernard Widrow + * book: Haykin, Adaptive Filter Theory, 4. edition, Prentice Hall, 2002 + * + * in d: microphone sample (16bit PCM value) + * in x_: loudspeaker sample (16bit PCM value) + * in stepsize: NLMS adaptation variable + * return: echo cancelled microphone sample + */ +static REAL AEC_nlms_pw(AEC *a, REAL d, REAL x_, float stepsize); + +AEC* AEC_init(int RATE, int have_vector); +void AEC_done(AEC *a); + +/* Acoustic Echo Cancellation and Suppression of one sample + * in d: microphone signal with echo + * in x: loudspeaker signal + * return: echo cancelled microphone signal + */ + int AEC_doAEC(AEC *a, int d_, int x_); + +PA_GCC_UNUSED static float AEC_getambient(AEC *a) { + return a->dfast; + } +static void AEC_setambient(AEC *a, float Min_xf) { + a->dotp_xf_xf -= a->delta; // subtract old delta + a->delta = (NLMS_LEN-1) * Min_xf * Min_xf; + a->dotp_xf_xf += a->delta; // add new delta + } +PA_GCC_UNUSED static void AEC_setgain(AEC *a, float gain_) { + a->gain = gain_; + } +#if 0 + void AEC_openwdisplay(AEC *a); +#endif +PA_GCC_UNUSED static void AEC_setaes(AEC *a, float aes_y2_) { + a->aes_y2 = aes_y2_; + } + +#define _AEC_H +#endif diff --git a/src/modules/echo-cancel/adrian-aec.orc b/src/modules/echo-cancel/adrian-aec.orc new file mode 100644 index 0000000..8054772 --- /dev/null +++ b/src/modules/echo-cancel/adrian-aec.orc @@ -0,0 +1,8 @@ +.function update_tap_weights +.dest 4 w float +.source 4 xf float +.floatparam 4 mikro_ef +.temp 4 tmp float + +mulf tmp, mikro_ef, xf +addf w, w, tmp diff --git a/src/modules/echo-cancel/adrian-license.txt b/src/modules/echo-cancel/adrian-license.txt new file mode 100644 index 0000000..7c06efd --- /dev/null +++ b/src/modules/echo-cancel/adrian-license.txt @@ -0,0 +1,17 @@ + Copyright (C) DFS Deutsche Flugsicherung (2004). All Rights Reserved. + + You are allowed to use this source code in any open source or closed + source software you want. You are allowed to use the algorithms for a + hardware solution. You are allowed to modify the source code. + You are not allowed to remove the name of the author from this memo or + from the source code files. You are not allowed to monopolize the + source code or the algorithms behind the source code as your + intellectual property. This source code is free of royalty and comes + with no warranty. + +--- The following does not apply to the PulseAudio module --- + + Please see g711/gen-lic.txt for the ITU-T G.711 codec copyright. + Please see gsm/gen-lic.txt for the ITU-T GSM codec copyright. + Please see ilbc/COPYRIGHT and ilbc/NOTICE for the IETF iLBC codec + copyright. diff --git a/src/modules/echo-cancel/adrian.c b/src/modules/echo-cancel/adrian.c new file mode 100644 index 0000000..3c47fae --- /dev/null +++ b/src/modules/echo-cancel/adrian.c @@ -0,0 +1,118 @@ +/*** + This file is part of PulseAudio. + + Copyright 2010 Arun Raghavan + + Contributor: Wim Taymans + + The actual implementation is taken from the sources at + http://andreadrian.de/intercom/ - for the license, look for + adrian-license.txt in the same directory as this file. + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include + +#include "echo-cancel.h" + +/* should be between 10-20 ms */ +#define DEFAULT_FRAME_SIZE_MS 20 + +static const char* const valid_modargs[] = { + "frame_size_ms", + NULL +}; + +static void pa_adrian_ec_fixate_spec(pa_sample_spec *rec_ss, pa_channel_map *rec_map, + pa_sample_spec *play_ss, pa_channel_map *play_map, + pa_sample_spec *out_ss, pa_channel_map *out_map) { + out_ss->format = PA_SAMPLE_S16NE; + out_ss->channels = 1; + pa_channel_map_init_mono(out_map); + + *play_ss = *out_ss; + *play_map = *out_map; + *rec_ss = *out_ss; + *rec_map = *out_map; +} + +bool pa_adrian_ec_init(pa_core *c, pa_echo_canceller *ec, + pa_sample_spec *rec_ss, pa_channel_map *rec_map, + pa_sample_spec *play_ss, pa_channel_map *play_map, + pa_sample_spec *out_ss, pa_channel_map *out_map, + uint32_t *nframes, const char *args) { + int rate, have_vector = 0; + uint32_t frame_size_ms; + pa_modargs *ma; + + if (!(ma = pa_modargs_new(args, valid_modargs))) { + pa_log("Failed to parse submodule arguments."); + goto fail; + } + + frame_size_ms = DEFAULT_FRAME_SIZE_MS; + if (pa_modargs_get_value_u32(ma, "frame_size_ms", &frame_size_ms) < 0 || frame_size_ms < 1 || frame_size_ms > 200) { + pa_log("Invalid frame_size_ms specification"); + goto fail; + } + + pa_adrian_ec_fixate_spec(rec_ss, rec_map, play_ss, play_map, out_ss, out_map); + + rate = out_ss->rate; + *nframes = (rate * frame_size_ms) / 1000; + ec->params.adrian.blocksize = (*nframes) * pa_frame_size(out_ss); + + pa_log_debug ("Using nframes %d, blocksize %u, channels %d, rate %d", *nframes, ec->params.adrian.blocksize, out_ss->channels, out_ss->rate); + + /* For now we only support SSE */ + if (c->cpu_info.cpu_type == PA_CPU_X86 && (c->cpu_info.flags.x86 & PA_CPU_X86_SSE)) + have_vector = 1; + + ec->params.adrian.aec = AEC_init(rate, have_vector); + if (!ec->params.adrian.aec) + goto fail; + + pa_modargs_free(ma); + return true; + +fail: + if (ma) + pa_modargs_free(ma); + return false; +} + +void pa_adrian_ec_run(pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *play, uint8_t *out) { + unsigned int i; + + for (i = 0; i < ec->params.adrian.blocksize; i += 2) { + /* We know it's S16NE mono data */ + int r = *(int16_t *)(rec + i); + int p = *(int16_t *)(play + i); + *(int16_t *)(out + i) = (int16_t) AEC_doAEC(ec->params.adrian.aec, r, p); + } +} + +void pa_adrian_ec_done(pa_echo_canceller *ec) { + if (ec->params.adrian.aec) { + AEC_done(ec->params.adrian.aec); + ec->params.adrian.aec = NULL; + } +} diff --git a/src/modules/echo-cancel/adrian.h b/src/modules/echo-cancel/adrian.h new file mode 100644 index 0000000..a5e0444 --- /dev/null +++ b/src/modules/echo-cancel/adrian.h @@ -0,0 +1,30 @@ +/*** + This file is part of PulseAudio. + + Copyright 2010 Arun Raghavan + + The actual implementation is taken from the sources at + http://andreadrian.de/intercom/ - for the license, look for + adrian-license.txt in the same directory as this file. + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +/* Forward declarations */ + +typedef struct AEC AEC; + +AEC* AEC_init(int RATE, int have_vector); +void AEC_done(AEC *a); +int AEC_doAEC(AEC *a, int d_, int x_); diff --git a/src/modules/echo-cancel/echo-cancel.h b/src/modules/echo-cancel/echo-cancel.h new file mode 100644 index 0000000..ee67949 --- /dev/null +++ b/src/modules/echo-cancel/echo-cancel.h @@ -0,0 +1,189 @@ +/*** + This file is part of PulseAudio. + + Copyright 2010 Arun Raghavan + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifndef fooechocancelhfoo +#define fooechocancelhfoo + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#ifdef HAVE_SPEEX +#include +#include +#endif + +#include "adrian.h" + +/* Common data structures */ + +typedef struct pa_echo_canceller_msg pa_echo_canceller_msg; + +typedef struct pa_echo_canceller_params pa_echo_canceller_params; + +struct pa_echo_canceller_params { + union { + struct { + pa_sample_spec out_ss; + } null; +#ifdef HAVE_SPEEX + struct { + SpeexEchoState *state; + SpeexPreprocessState *pp_state; + } speex; +#endif +#ifdef HAVE_ADRIAN_EC + struct { + uint32_t blocksize; + AEC *aec; + } adrian; +#endif +#ifdef HAVE_WEBRTC + struct { + /* This is a void* so that we don't have to convert this whole file + * to C++ linkage. apm is a pointer to an AudioProcessing object */ + void *apm; + unsigned int blocksize; /* in frames */ + pa_sample_spec rec_ss, play_ss, out_ss; + float *rec_buffer[PA_CHANNELS_MAX], *play_buffer[PA_CHANNELS_MAX]; /* for deinterleaved buffers */ + void *trace_callback; + bool agc; + bool first; + unsigned int agc_start_volume; + } webrtc; +#endif + /* each canceller-specific structure goes here */ + }; + + /* Set this if canceller can do drift compensation. Also see set_drift() + * below */ + bool drift_compensation; +}; + +typedef struct pa_echo_canceller pa_echo_canceller; + +struct pa_echo_canceller { + /* Initialise canceller engine. */ + bool (*init) (pa_core *c, + pa_echo_canceller *ec, + pa_sample_spec *rec_ss, + pa_channel_map *rec_map, + pa_sample_spec *play_ss, + pa_channel_map *play_map, + pa_sample_spec *out_ss, + pa_channel_map *out_map, + uint32_t *nframes, + const char *args); + + /* You should have only one of play()+record() or run() set. The first + * works under the assumption that you'll handle buffering and matching up + * samples yourself. If you set run(), module-echo-cancel will handle + * synchronising the playback and record streams. */ + + /* Feed the engine 'nframes' playback frames. */ + void (*play) (pa_echo_canceller *ec, const uint8_t *play); + /* Feed the engine 'nframes' record frames. nframes processed frames are + * returned in out. */ + void (*record) (pa_echo_canceller *ec, const uint8_t *rec, uint8_t *out); + /* Feed the engine nframes playback and record frames, with a reasonable + * effort at keeping the two in sync. nframes processed frames are + * returned in out. */ + void (*run) (pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *play, uint8_t *out); + + /* Optional callback to set the drift, expressed as the ratio of the + * difference in number of playback and capture samples to the number of + * capture samples, for some instant of time. This is used only if the + * canceller signals that it supports drift compensation, and is called + * before record(). The actual implementation needs to derive drift based + * on point samples -- the individual values are not accurate enough to use + * as-is. */ + /* NOTE: the semantics of this function might change in the future. */ + void (*set_drift) (pa_echo_canceller *ec, float drift); + + /* Free up resources. */ + void (*done) (pa_echo_canceller *ec); + + /* Structure with common and engine-specific canceller parameters. */ + pa_echo_canceller_params params; + + /* msgobject that can be used to send messages back to the main thread */ + pa_echo_canceller_msg *msg; +}; + +/* Functions to be used by the canceller analog gain control routines */ +pa_volume_t pa_echo_canceller_get_capture_volume(pa_echo_canceller *ec); +void pa_echo_canceller_set_capture_volume(pa_echo_canceller *ec, pa_volume_t volume); + +/* Computes EC block size in frames (rounded down to nearest power-of-2) based + * on sample rate and milliseconds. */ +uint32_t pa_echo_canceller_blocksize_power2(unsigned rate, unsigned ms); + +/* Null canceller functions */ +bool pa_null_ec_init(pa_core *c, pa_echo_canceller *ec, + pa_sample_spec *rec_ss, pa_channel_map *rec_map, + pa_sample_spec *play_ss, pa_channel_map *play_map, + pa_sample_spec *out_ss, pa_channel_map *out_map, + uint32_t *nframes, const char *args); +void pa_null_ec_run(pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *play, uint8_t *out); +void pa_null_ec_done(pa_echo_canceller *ec); + +#ifdef HAVE_SPEEX +/* Speex canceller functions */ +bool pa_speex_ec_init(pa_core *c, pa_echo_canceller *ec, + pa_sample_spec *rec_ss, pa_channel_map *rec_map, + pa_sample_spec *play_ss, pa_channel_map *play_map, + pa_sample_spec *out_ss, pa_channel_map *out_map, + uint32_t *nframes, const char *args); +void pa_speex_ec_run(pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *play, uint8_t *out); +void pa_speex_ec_done(pa_echo_canceller *ec); +#endif + +#ifdef HAVE_ADRIAN_EC +/* Adrian Andre's echo canceller */ +bool pa_adrian_ec_init(pa_core *c, pa_echo_canceller *ec, + pa_sample_spec *rec_ss, pa_channel_map *rec_map, + pa_sample_spec *play_ss, pa_channel_map *play_map, + pa_sample_spec *out_ss, pa_channel_map *out_map, + uint32_t *nframes, const char *args); +void pa_adrian_ec_run(pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *play, uint8_t *out); +void pa_adrian_ec_done(pa_echo_canceller *ec); +#endif + +#ifdef HAVE_WEBRTC +/* WebRTC canceller functions */ +PA_C_DECL_BEGIN +bool pa_webrtc_ec_init(pa_core *c, pa_echo_canceller *ec, + pa_sample_spec *rec_ss, pa_channel_map *rec_map, + pa_sample_spec *play_ss, pa_channel_map *play_map, + pa_sample_spec *out_ss, pa_channel_map *out_map, + uint32_t *nframes, const char *args); +void pa_webrtc_ec_play(pa_echo_canceller *ec, const uint8_t *play); +void pa_webrtc_ec_record(pa_echo_canceller *ec, const uint8_t *rec, uint8_t *out); +void pa_webrtc_ec_set_drift(pa_echo_canceller *ec, float drift); +void pa_webrtc_ec_run(pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *play, uint8_t *out); +void pa_webrtc_ec_done(pa_echo_canceller *ec); +PA_C_DECL_END +#endif + +#endif /* fooechocancelhfoo */ diff --git a/src/modules/echo-cancel/meson.build b/src/modules/echo-cancel/meson.build new file mode 100644 index 0000000..641cd35 --- /dev/null +++ b/src/modules/echo-cancel/meson.build @@ -0,0 +1,22 @@ +# The webrtc code is split off into a helper library to avoid having automake +# link module-echo-cancel with C++ (which it does if there are any C++ deps, +# even conditional ones). + +# This library requires a symbol from module-echo-cancel, hence we need +# '-Wl,--unresolved-symbols=ignore-in-object-files' otherwise it fails +# at link time. + +libwebrtc_util_sources = [ + 'webrtc.cc' +] + +libwebrtc_util = shared_library('webrtc-util', + libwebrtc_util_sources, + cpp_args : [pa_c_args, server_c_args], + include_directories : [configinc, topinc], + dependencies : [libpulse_dep, libpulsecommon_dep, libpulsecore_dep, libatomic_ops_dep, webrtc_dep, libintl_dep], + link_args : [nodelete_link_args, '-Wl,--unresolved-symbols=ignore-in-object-files'], + install : true, + install_rpath : privlibdir, + install_dir : modlibexecdir, +) diff --git a/src/modules/echo-cancel/module-echo-cancel.c b/src/modules/echo-cancel/module-echo-cancel.c new file mode 100644 index 0000000..f239492 --- /dev/null +++ b/src/modules/echo-cancel/module-echo-cancel.c @@ -0,0 +1,2393 @@ +/*** + This file is part of PulseAudio. + + Copyright 2010 Wim Taymans + + Based on module-virtual-sink.c + module-virtual-source.c + module-loopback.c + + Copyright 2010 Intel Corporation + Contributor: Pierre-Louis Bossart + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include "echo-cancel.h" + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +PA_MODULE_AUTHOR("Wim Taymans"); +PA_MODULE_DESCRIPTION("Echo Cancellation"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(false); +PA_MODULE_USAGE( + _("source_name= " + "source_properties= " + "source_master= " + "sink_name= " + "sink_properties= " + "sink_master= " + "adjust_time= " + "adjust_threshold= " + "format= " + "rate= " + "channels= " + "channel_map= " + "aec_method= " + "aec_args= " + "save_aec= " + "autoloaded= " + "use_volume_sharing= " + "use_master_format= " + )); + +/* NOTE: Make sure the enum and ec_table are maintained in the correct order */ +typedef enum { + PA_ECHO_CANCELLER_INVALID = -1, + PA_ECHO_CANCELLER_NULL, +#ifdef HAVE_SPEEX + PA_ECHO_CANCELLER_SPEEX, +#endif +#ifdef HAVE_ADRIAN_EC + PA_ECHO_CANCELLER_ADRIAN, +#endif +#ifdef HAVE_WEBRTC + PA_ECHO_CANCELLER_WEBRTC, +#endif +} pa_echo_canceller_method_t; + +#ifdef HAVE_WEBRTC +#define DEFAULT_ECHO_CANCELLER "webrtc" +#else +#define DEFAULT_ECHO_CANCELLER "speex" +#endif + +static const pa_echo_canceller ec_table[] = { + { + /* Null, Dummy echo canceller (just copies data) */ + .init = pa_null_ec_init, + .run = pa_null_ec_run, + .done = pa_null_ec_done, + }, +#ifdef HAVE_SPEEX + { + /* Speex */ + .init = pa_speex_ec_init, + .run = pa_speex_ec_run, + .done = pa_speex_ec_done, + }, +#endif +#ifdef HAVE_ADRIAN_EC + { + /* Adrian Andre's NLMS implementation */ + .init = pa_adrian_ec_init, + .run = pa_adrian_ec_run, + .done = pa_adrian_ec_done, + }, +#endif +#ifdef HAVE_WEBRTC + { + /* WebRTC's audio processing engine */ + .init = pa_webrtc_ec_init, + .play = pa_webrtc_ec_play, + .record = pa_webrtc_ec_record, + .set_drift = pa_webrtc_ec_set_drift, + .run = pa_webrtc_ec_run, + .done = pa_webrtc_ec_done, + }, +#endif +}; + +#define DEFAULT_RATE 32000 +#define DEFAULT_CHANNELS 1 +#define DEFAULT_ADJUST_TIME_USEC (1*PA_USEC_PER_SEC) +#define DEFAULT_ADJUST_TOLERANCE (5*PA_USEC_PER_MSEC) +#define DEFAULT_SAVE_AEC false +#define DEFAULT_AUTOLOADED false +#define DEFAULT_USE_MASTER_FORMAT false + +#define MEMBLOCKQ_MAXLENGTH (16*1024*1024) + +#define MAX_LATENCY_BLOCKS 10 + +/* Can only be used in main context */ +#define IS_ACTIVE(u) (((u)->source->state == PA_SOURCE_RUNNING) && \ + ((u)->sink->state == PA_SINK_RUNNING)) + +/* This module creates a new (virtual) source and sink. + * + * The data sent to the new sink is kept in a memblockq before being + * forwarded to the real sink_master. + * + * Data read from source_master is matched against the saved sink data and + * echo canceled data is then pushed onto the new source. + * + * Both source and sink masters have their own threads to push/pull data + * respectively. We however perform all our actions in the source IO thread. + * To do this we send all played samples to the source IO thread where they + * are then pushed into the memblockq. + * + * Alignment is performed in two steps: + * + * 1) when something happens that requires quick adjustment of the alignment of + * capture and playback samples, we perform a resync. This adjusts the + * position in the playback memblock to the requested sample. Quick + * adjustments include moving the playback samples before the capture + * samples (because else the echo canceller does not work) or when the + * playback pointer drifts too far away. + * + * 2) periodically check the difference between capture and playback. We use a + * low and high watermark for adjusting the alignment. Playback should always + * be before capture and the difference should not be bigger than one frame + * size. We would ideally like to resample the sink_input but most driver + * don't give enough accuracy to be able to do that right now. + */ + +struct userdata; + +struct pa_echo_canceller_msg { + pa_msgobject parent; + bool dead; + struct userdata *userdata; +}; + +PA_DEFINE_PRIVATE_CLASS(pa_echo_canceller_msg, pa_msgobject); +#define PA_ECHO_CANCELLER_MSG(o) (pa_echo_canceller_msg_cast(o)) + +struct snapshot { + pa_usec_t sink_now; + pa_usec_t sink_latency; + size_t sink_delay; + int64_t send_counter; + + pa_usec_t source_now; + pa_usec_t source_latency; + size_t source_delay; + int64_t recv_counter; + size_t rlen; + size_t plen; +}; + +struct userdata { + pa_core *core; + pa_module *module; + + bool dead; + bool save_aec; + + pa_echo_canceller *ec; + uint32_t source_output_blocksize; + uint32_t source_blocksize; + uint32_t sink_blocksize; + + bool need_realign; + + /* to wakeup the source I/O thread */ + pa_asyncmsgq *asyncmsgq; + pa_rtpoll_item *rtpoll_item_read, *rtpoll_item_write; + + pa_source *source; + bool source_auto_desc; + pa_source_output *source_output; + pa_memblockq *source_memblockq; /* echo canceller needs fixed sized chunks */ + size_t source_skip; + + pa_sink *sink; + bool sink_auto_desc; + pa_sink_input *sink_input; + pa_memblockq *sink_memblockq; + int64_t send_counter; /* updated in sink IO thread */ + int64_t recv_counter; + size_t sink_skip; + + /* Bytes left over from previous iteration */ + size_t sink_rem; + size_t source_rem; + + pa_atomic_t request_resync; + + pa_time_event *time_event; + pa_usec_t adjust_time; + int adjust_threshold; + + FILE *captured_file; + FILE *played_file; + FILE *canceled_file; + FILE *drift_file; + + bool use_volume_sharing; + + struct { + pa_cvolume current_volume; + } thread_info; +}; + +static void source_output_snapshot_within_thread(struct userdata *u, struct snapshot *snapshot); + +static const char* const valid_modargs[] = { + "source_name", + "source_properties", + "source_master", + "sink_name", + "sink_properties", + "sink_master", + "adjust_time", + "adjust_threshold", + "format", + "rate", + "channels", + "channel_map", + "aec_method", + "aec_args", + "save_aec", + "autoloaded", + "use_volume_sharing", + "use_master_format", + NULL +}; + +enum { + SOURCE_OUTPUT_MESSAGE_POST = PA_SOURCE_OUTPUT_MESSAGE_MAX, + SOURCE_OUTPUT_MESSAGE_REWIND, + SOURCE_OUTPUT_MESSAGE_LATENCY_SNAPSHOT, + SOURCE_OUTPUT_MESSAGE_APPLY_DIFF_TIME +}; + +enum { + SINK_INPUT_MESSAGE_LATENCY_SNAPSHOT +}; + +enum { + ECHO_CANCELLER_MESSAGE_SET_VOLUME, +}; + +static int64_t calc_diff(struct userdata *u, struct snapshot *snapshot) { + int64_t diff_time, buffer_latency; + pa_usec_t plen, rlen, source_delay, sink_delay, recv_counter, send_counter; + + /* get latency difference between playback and record */ + plen = pa_bytes_to_usec(snapshot->plen, &u->sink_input->sample_spec); + rlen = pa_bytes_to_usec(snapshot->rlen, &u->source_output->sample_spec); + if (plen > rlen) + buffer_latency = plen - rlen; + else + buffer_latency = 0; + + source_delay = pa_bytes_to_usec(snapshot->source_delay, &u->source_output->sample_spec); + sink_delay = pa_bytes_to_usec(snapshot->sink_delay, &u->sink_input->sample_spec); + buffer_latency += source_delay + sink_delay; + + /* add the latency difference due to samples not yet transferred */ + send_counter = pa_bytes_to_usec(snapshot->send_counter, &u->sink->sample_spec); + recv_counter = pa_bytes_to_usec(snapshot->recv_counter, &u->sink->sample_spec); + if (recv_counter <= send_counter) + buffer_latency += (int64_t) (send_counter - recv_counter); + else + buffer_latency = PA_CLIP_SUB(buffer_latency, (int64_t) (recv_counter - send_counter)); + + /* capture and playback are perfectly aligned when diff_time is 0 */ + diff_time = (snapshot->sink_now + snapshot->sink_latency - buffer_latency) - + (snapshot->source_now - snapshot->source_latency); + + pa_log_debug("Diff %lld (%lld - %lld + %lld) %lld %lld %lld %lld", (long long) diff_time, + (long long) snapshot->sink_latency, + (long long) buffer_latency, (long long) snapshot->source_latency, + (long long) source_delay, (long long) sink_delay, + (long long) (send_counter - recv_counter), + (long long) (snapshot->sink_now - snapshot->source_now)); + + return diff_time; +} + +/* Called from main context */ +static void time_callback(pa_mainloop_api *a, pa_time_event *e, const struct timeval *t, void *userdata) { + struct userdata *u = userdata; + uint32_t old_rate, base_rate, new_rate; + int64_t diff_time; + /*size_t fs*/ + struct snapshot latency_snapshot; + + pa_assert(u); + pa_assert(a); + pa_assert(u->time_event == e); + pa_assert_ctl_context(); + + if (!IS_ACTIVE(u)) + return; + + /* update our snapshots */ + pa_asyncmsgq_send(u->source_output->source->asyncmsgq, PA_MSGOBJECT(u->source_output), SOURCE_OUTPUT_MESSAGE_LATENCY_SNAPSHOT, &latency_snapshot, 0, NULL); + pa_asyncmsgq_send(u->sink_input->sink->asyncmsgq, PA_MSGOBJECT(u->sink_input), SINK_INPUT_MESSAGE_LATENCY_SNAPSHOT, &latency_snapshot, 0, NULL); + + /* calculate drift between capture and playback */ + diff_time = calc_diff(u, &latency_snapshot); + + /*fs = pa_frame_size(&u->source_output->sample_spec);*/ + old_rate = u->sink_input->sample_spec.rate; + base_rate = u->source_output->sample_spec.rate; + + if (diff_time < 0) { + /* recording before playback, we need to adjust quickly. The echo + * canceller does not work in this case. */ + pa_asyncmsgq_post(u->asyncmsgq, PA_MSGOBJECT(u->source_output), SOURCE_OUTPUT_MESSAGE_APPLY_DIFF_TIME, + NULL, diff_time, NULL, NULL); + /*new_rate = base_rate - ((pa_usec_to_bytes(-diff_time, &u->source_output->sample_spec) / fs) * PA_USEC_PER_SEC) / u->adjust_time;*/ + new_rate = base_rate; + } + else { + if (diff_time > u->adjust_threshold) { + /* diff too big, quickly adjust */ + pa_asyncmsgq_post(u->asyncmsgq, PA_MSGOBJECT(u->source_output), SOURCE_OUTPUT_MESSAGE_APPLY_DIFF_TIME, + NULL, diff_time, NULL, NULL); + } + + /* recording behind playback, we need to slowly adjust the rate to match */ + /*new_rate = base_rate + ((pa_usec_to_bytes(diff_time, &u->source_output->sample_spec) / fs) * PA_USEC_PER_SEC) / u->adjust_time;*/ + + /* assume equal samplerates for now */ + new_rate = base_rate; + } + + /* make sure we don't make too big adjustments because that sounds horrible */ + if (new_rate > base_rate * 1.1 || new_rate < base_rate * 0.9) + new_rate = base_rate; + + if (new_rate != old_rate) { + pa_log_info("Old rate %lu Hz, new rate %lu Hz", (unsigned long) old_rate, (unsigned long) new_rate); + + pa_sink_input_set_rate(u->sink_input, new_rate); + } + + pa_core_rttime_restart(u->core, u->time_event, pa_rtclock_now() + u->adjust_time); +} + +/* Called from source I/O thread context */ +static int source_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SOURCE(o)->userdata; + + switch (code) { + + case PA_SOURCE_MESSAGE_GET_LATENCY: + + /* The source is _put() before the source output is, so let's + * make sure we don't access it in that time. Also, the + * source output is first shut down, the source second. */ + if (!PA_SOURCE_IS_LINKED(u->source->thread_info.state) || + !PA_SOURCE_OUTPUT_IS_LINKED(u->source_output->thread_info.state)) { + *((int64_t*) data) = 0; + return 0; + } + + *((int64_t*) data) = + + /* Get the latency of the master source */ + pa_source_get_latency_within_thread(u->source_output->source, true) + + /* Add the latency internal to our source output on top */ + pa_bytes_to_usec(pa_memblockq_get_length(u->source_output->thread_info.delay_memblockq), &u->source_output->source->sample_spec) + + /* and the buffering we do on the source */ + pa_bytes_to_usec(u->source_output_blocksize, &u->source_output->source->sample_spec); + + return 0; + + case PA_SOURCE_MESSAGE_SET_VOLUME_SYNCED: + u->thread_info.current_volume = u->source->reference_volume; + break; + } + + return pa_source_process_msg(o, code, data, offset, chunk); +} + +/* Called from sink I/O thread context */ +static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SINK(o)->userdata; + + switch (code) { + + case PA_SINK_MESSAGE_GET_LATENCY: + + /* The sink is _put() before the sink input is, so let's + * make sure we don't access it in that time. Also, the + * sink input is first shut down, the sink second. */ + if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) || + !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state)) { + *((int64_t*) data) = 0; + return 0; + } + + *((int64_t*) data) = + + /* Get the latency of the master sink */ + pa_sink_get_latency_within_thread(u->sink_input->sink, true) + + + /* Add the latency internal to our sink input on top */ + pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->sink_input->sink->sample_spec); + + return 0; + } + + return pa_sink_process_msg(o, code, data, offset, chunk); +} + +/* Called from main context */ +static int source_set_state_in_main_thread_cb(pa_source *s, pa_source_state_t state, pa_suspend_cause_t suspend_cause) { + struct userdata *u; + + pa_source_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SOURCE_IS_LINKED(state) || + !PA_SOURCE_OUTPUT_IS_LINKED(u->source_output->state)) + return 0; + + if (state == PA_SOURCE_RUNNING) { + /* restart timer when both sink and source are active */ + if ((u->sink->state == PA_SINK_RUNNING) && u->adjust_time) + pa_core_rttime_restart(u->core, u->time_event, pa_rtclock_now() + u->adjust_time); + + pa_atomic_store(&u->request_resync, 1); + pa_source_output_cork(u->source_output, false); + } else if (state == PA_SOURCE_SUSPENDED) { + pa_source_output_cork(u->source_output, true); + } + + return 0; +} + +/* Called from main context */ +static int sink_set_state_in_main_thread_cb(pa_sink *s, pa_sink_state_t state, pa_suspend_cause_t suspend_cause) { + struct userdata *u; + + pa_sink_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SINK_IS_LINKED(state) || + !PA_SINK_INPUT_IS_LINKED(u->sink_input->state)) + return 0; + + if (state == PA_SINK_RUNNING) { + /* restart timer when both sink and source are active */ + if ((u->source->state == PA_SOURCE_RUNNING) && u->adjust_time) + pa_core_rttime_restart(u->core, u->time_event, pa_rtclock_now() + u->adjust_time); + + pa_atomic_store(&u->request_resync, 1); + pa_sink_input_cork(u->sink_input, false); + } else if (state == PA_SINK_SUSPENDED) { + pa_sink_input_cork(u->sink_input, true); + } + + return 0; +} + +/* Called from the IO thread. */ +static int sink_set_state_in_io_thread_cb(pa_sink *s, pa_sink_state_t new_state, pa_suspend_cause_t new_suspend_cause) { + struct userdata *u; + + pa_assert(s); + pa_assert_se(u = s->userdata); + + /* When set to running or idle for the first time, request a rewind + * of the master sink to make sure we are heard immediately */ + if (PA_SINK_IS_OPENED(new_state) && s->thread_info.state == PA_SINK_INIT) { + pa_log_debug("Requesting rewind due to state change."); + pa_sink_input_request_rewind(u->sink_input, 0, false, true, true); + } + + return 0; +} + +/* Called from source I/O thread context */ +static void source_update_requested_latency_cb(pa_source *s) { + struct userdata *u; + pa_usec_t latency; + + pa_source_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SOURCE_IS_LINKED(u->source->thread_info.state) || + !PA_SOURCE_OUTPUT_IS_LINKED(u->source_output->thread_info.state)) + return; + + pa_log_debug("Source update requested latency"); + + /* Cap the maximum latency so we don't have to process too large chunks */ + latency = PA_MIN(pa_source_get_requested_latency_within_thread(s), + pa_bytes_to_usec(u->source_blocksize, &s->sample_spec) * MAX_LATENCY_BLOCKS); + + pa_source_output_set_requested_latency_within_thread(u->source_output, latency); +} + +/* Called from sink I/O thread context */ +static void sink_update_requested_latency_cb(pa_sink *s) { + struct userdata *u; + pa_usec_t latency; + + pa_sink_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) || + !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state)) + return; + + pa_log_debug("Sink update requested latency"); + + /* Cap the maximum latency so we don't have to process too large chunks */ + latency = PA_MIN(pa_sink_get_requested_latency_within_thread(s), + pa_bytes_to_usec(u->sink_blocksize, &s->sample_spec) * MAX_LATENCY_BLOCKS); + + pa_sink_input_set_requested_latency_within_thread(u->sink_input, latency); +} + +/* Called from sink I/O thread context */ +static void sink_request_rewind_cb(pa_sink *s) { + struct userdata *u; + + pa_sink_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) || + !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state)) + return; + + pa_log_debug("Sink request rewind %lld", (long long) s->thread_info.rewind_nbytes); + + /* Just hand this one over to the master sink */ + pa_sink_input_request_rewind(u->sink_input, + s->thread_info.rewind_nbytes, true, false, false); +} + +/* Called from main context */ +static void source_set_volume_cb(pa_source *s) { + struct userdata *u; + + pa_source_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SOURCE_IS_LINKED(s->state) || + !PA_SOURCE_OUTPUT_IS_LINKED(u->source_output->state)) + return; + + pa_source_output_set_volume(u->source_output, &s->real_volume, s->save_volume, true); +} + +/* Called from main context */ +static void sink_set_volume_cb(pa_sink *s) { + struct userdata *u; + + pa_sink_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SINK_IS_LINKED(s->state) || + !PA_SINK_INPUT_IS_LINKED(u->sink_input->state)) + return; + + pa_sink_input_set_volume(u->sink_input, &s->real_volume, s->save_volume, true); +} + +/* Called from main context. */ +static void source_get_volume_cb(pa_source *s) { + struct userdata *u; + pa_cvolume v; + + pa_source_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SOURCE_IS_LINKED(s->state) || + !PA_SOURCE_OUTPUT_IS_LINKED(u->source_output->state)) + return; + + pa_source_output_get_volume(u->source_output, &v, true); + + if (pa_cvolume_equal(&s->real_volume, &v)) + /* no change */ + return; + + s->real_volume = v; + pa_source_set_soft_volume(s, NULL); +} + +/* Called from main context */ +static void source_set_mute_cb(pa_source *s) { + struct userdata *u; + + pa_source_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SOURCE_IS_LINKED(s->state) || + !PA_SOURCE_OUTPUT_IS_LINKED(u->source_output->state)) + return; + + pa_source_output_set_mute(u->source_output, s->muted, s->save_muted); +} + +/* Called from main context */ +static void sink_set_mute_cb(pa_sink *s) { + struct userdata *u; + + pa_sink_assert_ref(s); + pa_assert_se(u = s->userdata); + + if (!PA_SINK_IS_LINKED(s->state) || + !PA_SINK_INPUT_IS_LINKED(u->sink_input->state)) + return; + + pa_sink_input_set_mute(u->sink_input, s->muted, s->save_muted); +} + +/* Called from source I/O thread context. */ +static void apply_diff_time(struct userdata *u, int64_t diff_time) { + int64_t diff; + + if (diff_time < 0) { + diff = pa_usec_to_bytes(-diff_time, &u->sink_input->sample_spec); + + if (diff > 0) { + /* add some extra safety samples to compensate for jitter in the + * timings */ + diff += 10 * pa_frame_size (&u->sink_input->sample_spec); + + pa_log("Playback after capture (%lld), drop sink %lld", (long long) diff_time, (long long) diff); + + u->sink_skip = diff; + u->source_skip = 0; + } + } else if (diff_time > 0) { + diff = pa_usec_to_bytes(diff_time, &u->source_output->sample_spec); + + if (diff > 0) { + pa_log("Playback too far ahead (%lld), drop source %lld", (long long) diff_time, (long long) diff); + + u->source_skip = diff; + u->sink_skip = 0; + } + } +} + +/* Called from source I/O thread context. */ +static void do_resync(struct userdata *u) { + int64_t diff_time; + struct snapshot latency_snapshot; + + pa_log("Doing resync"); + + /* update our snapshot */ + /* 1. Get sink input latency snapshot, might cause buffers to be sent to source thread */ + pa_asyncmsgq_send(u->sink_input->sink->asyncmsgq, PA_MSGOBJECT(u->sink_input), SINK_INPUT_MESSAGE_LATENCY_SNAPSHOT, &latency_snapshot, 0, NULL); + /* 2. Pick up any in-flight buffers (and discard if needed) */ + while (pa_asyncmsgq_process_one(u->asyncmsgq)) + ; + /* 3. Now get the source output latency snapshot */ + source_output_snapshot_within_thread(u, &latency_snapshot); + + /* calculate drift between capture and playback */ + diff_time = calc_diff(u, &latency_snapshot); + + /* and adjust for the drift */ + apply_diff_time(u, diff_time); +} + +/* 1. Calculate drift at this point, pass to canceller + * 2. Push out playback samples in blocksize chunks + * 3. Push out capture samples in blocksize chunks + * 4. ??? + * 5. Profit + * + * Called from source I/O thread context. + */ +static void do_push_drift_comp(struct userdata *u) { + size_t rlen, plen; + pa_memchunk rchunk, pchunk, cchunk; + uint8_t *rdata, *pdata, *cdata; + float drift; + int unused PA_GCC_UNUSED; + + rlen = pa_memblockq_get_length(u->source_memblockq); + plen = pa_memblockq_get_length(u->sink_memblockq); + + /* Estimate snapshot drift as follows: + * pd: amount of data consumed since last time + * rd: amount of data consumed since last time + * + * drift = (pd - rd) / rd; + * + * We calculate pd and rd as the memblockq length less the number of + * samples left from the last iteration (to avoid double counting + * those remainder samples. + */ + drift = ((float)(plen - u->sink_rem) - (rlen - u->source_rem)) / ((float)(rlen - u->source_rem)); + u->sink_rem = plen % u->sink_blocksize; + u->source_rem = rlen % u->source_output_blocksize; + + if (u->save_aec) { + if (u->drift_file) + fprintf(u->drift_file, "d %a\n", drift); + } + + /* Send in the playback samples first */ + while (plen >= u->sink_blocksize) { + pa_memblockq_peek_fixed_size(u->sink_memblockq, u->sink_blocksize, &pchunk); + pdata = pa_memblock_acquire(pchunk.memblock); + pdata += pchunk.index; + + u->ec->play(u->ec, pdata); + + if (u->save_aec) { + if (u->drift_file) + fprintf(u->drift_file, "p %d\n", u->sink_blocksize); + if (u->played_file) + unused = fwrite(pdata, 1, u->sink_blocksize, u->played_file); + } + + pa_memblock_release(pchunk.memblock); + pa_memblockq_drop(u->sink_memblockq, u->sink_blocksize); + pa_memblock_unref(pchunk.memblock); + + plen -= u->sink_blocksize; + } + + /* And now the capture samples */ + while (rlen >= u->source_output_blocksize) { + pa_memblockq_peek_fixed_size(u->source_memblockq, u->source_output_blocksize, &rchunk); + + rdata = pa_memblock_acquire(rchunk.memblock); + rdata += rchunk.index; + + cchunk.index = 0; + cchunk.length = u->source_output_blocksize; + cchunk.memblock = pa_memblock_new(u->source->core->mempool, cchunk.length); + cdata = pa_memblock_acquire(cchunk.memblock); + + u->ec->set_drift(u->ec, drift); + u->ec->record(u->ec, rdata, cdata); + + if (u->save_aec) { + if (u->drift_file) + fprintf(u->drift_file, "c %d\n", u->source_output_blocksize); + if (u->captured_file) + unused = fwrite(rdata, 1, u->source_output_blocksize, u->captured_file); + if (u->canceled_file) + unused = fwrite(cdata, 1, u->source_output_blocksize, u->canceled_file); + } + + pa_memblock_release(cchunk.memblock); + pa_memblock_release(rchunk.memblock); + + pa_memblock_unref(rchunk.memblock); + + pa_source_post(u->source, &cchunk); + pa_memblock_unref(cchunk.memblock); + + pa_memblockq_drop(u->source_memblockq, u->source_output_blocksize); + rlen -= u->source_output_blocksize; + } +} + +/* This one's simpler than the drift compensation case -- we just iterate over + * the capture buffer, and pass the canceller blocksize bytes of playback and + * capture data. If playback is currently inactive, we just push silence. + * + * Called from source I/O thread context. */ +static void do_push(struct userdata *u) { + size_t rlen, plen; + pa_memchunk rchunk, pchunk, cchunk; + uint8_t *rdata, *pdata, *cdata; + int unused PA_GCC_UNUSED; + + rlen = pa_memblockq_get_length(u->source_memblockq); + plen = pa_memblockq_get_length(u->sink_memblockq); + + while (rlen >= u->source_output_blocksize) { + + /* take fixed blocks from recorded and played samples */ + pa_memblockq_peek_fixed_size(u->source_memblockq, u->source_output_blocksize, &rchunk); + pa_memblockq_peek_fixed_size(u->sink_memblockq, u->sink_blocksize, &pchunk); + + /* we ran out of played data and pchunk has been filled with silence bytes */ + if (plen < u->sink_blocksize) + pa_memblockq_seek(u->sink_memblockq, u->sink_blocksize - plen, PA_SEEK_RELATIVE, true); + + rdata = pa_memblock_acquire(rchunk.memblock); + rdata += rchunk.index; + pdata = pa_memblock_acquire(pchunk.memblock); + pdata += pchunk.index; + + cchunk.index = 0; + cchunk.length = u->source_blocksize; + cchunk.memblock = pa_memblock_new(u->source->core->mempool, cchunk.length); + cdata = pa_memblock_acquire(cchunk.memblock); + + if (u->save_aec) { + if (u->captured_file) + unused = fwrite(rdata, 1, u->source_output_blocksize, u->captured_file); + if (u->played_file) + unused = fwrite(pdata, 1, u->sink_blocksize, u->played_file); + } + + /* perform echo cancellation */ + u->ec->run(u->ec, rdata, pdata, cdata); + + if (u->save_aec) { + if (u->canceled_file) + unused = fwrite(cdata, 1, u->source_blocksize, u->canceled_file); + } + + pa_memblock_release(cchunk.memblock); + pa_memblock_release(pchunk.memblock); + pa_memblock_release(rchunk.memblock); + + /* drop consumed source samples */ + pa_memblockq_drop(u->source_memblockq, u->source_output_blocksize); + pa_memblock_unref(rchunk.memblock); + rlen -= u->source_output_blocksize; + + /* drop consumed sink samples */ + pa_memblockq_drop(u->sink_memblockq, u->sink_blocksize); + pa_memblock_unref(pchunk.memblock); + + if (plen >= u->sink_blocksize) + plen -= u->sink_blocksize; + else + plen = 0; + + /* forward the (echo-canceled) data to the virtual source */ + pa_source_post(u->source, &cchunk); + pa_memblock_unref(cchunk.memblock); + } +} + +/* Called from source I/O thread context. */ +static void source_output_push_cb(pa_source_output *o, const pa_memchunk *chunk) { + struct userdata *u; + size_t rlen, plen, to_skip; + pa_memchunk rchunk; + + pa_source_output_assert_ref(o); + pa_source_output_assert_io_context(o); + pa_assert_se(u = o->userdata); + + if (!PA_SOURCE_IS_LINKED(u->source->thread_info.state)) + return; + + if (!PA_SOURCE_OUTPUT_IS_LINKED(u->source_output->thread_info.state)) { + pa_log("Push when no link?"); + return; + } + + /* handle queued messages, do any message sending of our own */ + while (pa_asyncmsgq_process_one(u->asyncmsgq) > 0) + ; + + pa_memblockq_push_align(u->source_memblockq, chunk); + + rlen = pa_memblockq_get_length(u->source_memblockq); + plen = pa_memblockq_get_length(u->sink_memblockq); + + /* Let's not do anything else till we have enough data to process */ + if (rlen < u->source_output_blocksize) + return; + + /* See if we need to drop samples in order to sync */ + if (pa_atomic_cmpxchg (&u->request_resync, 1, 0)) { + do_resync(u); + } + + /* Okay, skip cancellation for skipped source samples if needed. */ + if (PA_UNLIKELY(u->source_skip)) { + /* The slightly tricky bit here is that we drop all but modulo + * blocksize bytes and then adjust for that last bit on the sink side. + * We do this because the source data is coming at a fixed rate, which + * means the only way to try to catch up is drop sink samples and let + * the canceller cope up with this. */ + to_skip = rlen >= u->source_skip ? u->source_skip : rlen; + to_skip -= to_skip % u->source_output_blocksize; + + if (to_skip) { + pa_memblockq_peek_fixed_size(u->source_memblockq, to_skip, &rchunk); + pa_source_post(u->source, &rchunk); + + pa_memblock_unref(rchunk.memblock); + pa_memblockq_drop(u->source_memblockq, to_skip); + + rlen -= to_skip; + u->source_skip -= to_skip; + } + + if (rlen && u->source_skip % u->source_output_blocksize) { + u->sink_skip += (uint64_t) (u->source_output_blocksize - (u->source_skip % u->source_output_blocksize)) * u->sink_blocksize / u->source_output_blocksize; + u->source_skip -= (u->source_skip % u->source_output_blocksize); + } + } + + /* And for the sink, these samples have been played back already, so we can + * just drop them and get on with it. */ + if (PA_UNLIKELY(u->sink_skip)) { + to_skip = plen >= u->sink_skip ? u->sink_skip : plen; + + pa_memblockq_drop(u->sink_memblockq, to_skip); + + plen -= to_skip; + u->sink_skip -= to_skip; + } + + /* process and push out samples */ + if (u->ec->params.drift_compensation) + do_push_drift_comp(u); + else + do_push(u); +} + +/* Called from sink I/O thread context. */ +static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert(chunk); + pa_assert_se(u = i->userdata); + + if (!PA_SINK_IS_LINKED(u->sink->thread_info.state)) + return -1; + + if (u->sink->thread_info.rewind_requested) + pa_sink_process_rewind(u->sink, 0); + + pa_sink_render_full(u->sink, nbytes, chunk); + + if (i->thread_info.underrun_for > 0) { + pa_log_debug("Handling end of underrun."); + pa_atomic_store(&u->request_resync, 1); + } + + /* let source thread handle the chunk. pass the sample count as well so that + * the source IO thread can update the right variables. */ + pa_asyncmsgq_post(u->asyncmsgq, PA_MSGOBJECT(u->source_output), SOURCE_OUTPUT_MESSAGE_POST, + NULL, 0, chunk, NULL); + u->send_counter += chunk->length; + + return 0; +} + +/* Called from source I/O thread context. */ +static void source_output_process_rewind_cb(pa_source_output *o, size_t nbytes) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_source_output_assert_io_context(o); + pa_assert_se(u = o->userdata); + + /* If the source is not yet linked, there is nothing to rewind */ + if (!PA_SOURCE_IS_LINKED(u->source->thread_info.state)) + return; + + pa_source_process_rewind(u->source, nbytes); + + /* go back on read side, we need to use older sink data for this */ + pa_memblockq_rewind(u->sink_memblockq, nbytes); + + /* manipulate write index */ + pa_memblockq_seek(u->source_memblockq, -nbytes, PA_SEEK_RELATIVE, true); + + pa_log_debug("Source rewind (%lld) %lld", (long long) nbytes, + (long long) pa_memblockq_get_length (u->source_memblockq)); +} + +/* Called from sink I/O thread context. */ +static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + /* If the sink is not yet linked, there is nothing to rewind */ + if (!PA_SINK_IS_LINKED(u->sink->thread_info.state)) + return; + + pa_log_debug("Sink process rewind %lld", (long long) nbytes); + + pa_sink_process_rewind(u->sink, nbytes); + + pa_asyncmsgq_post(u->asyncmsgq, PA_MSGOBJECT(u->source_output), SOURCE_OUTPUT_MESSAGE_REWIND, NULL, (int64_t) nbytes, NULL, NULL); + u->send_counter -= nbytes; +} + +/* Called from source I/O thread context. */ +static void source_output_snapshot_within_thread(struct userdata *u, struct snapshot *snapshot) { + size_t delay, rlen, plen; + pa_usec_t now, latency; + + now = pa_rtclock_now(); + latency = pa_source_get_latency_within_thread(u->source_output->source, false); + delay = pa_memblockq_get_length(u->source_output->thread_info.delay_memblockq); + + delay = (u->source_output->thread_info.resampler ? pa_resampler_request(u->source_output->thread_info.resampler, delay) : delay); + rlen = pa_memblockq_get_length(u->source_memblockq); + plen = pa_memblockq_get_length(u->sink_memblockq); + + snapshot->source_now = now; + snapshot->source_latency = latency; + snapshot->source_delay = delay; + snapshot->recv_counter = u->recv_counter; + snapshot->rlen = rlen + u->sink_skip; + snapshot->plen = plen + u->source_skip; +} + +/* Called from source I/O thread context. */ +static int source_output_process_msg_cb(pa_msgobject *obj, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SOURCE_OUTPUT(obj)->userdata; + + switch (code) { + + case SOURCE_OUTPUT_MESSAGE_POST: + + pa_source_output_assert_io_context(u->source_output); + + if (u->source_output->source->thread_info.state == PA_SOURCE_RUNNING) + pa_memblockq_push_align(u->sink_memblockq, chunk); + else + pa_memblockq_flush_write(u->sink_memblockq, true); + + u->recv_counter += (int64_t) chunk->length; + + return 0; + + case SOURCE_OUTPUT_MESSAGE_REWIND: + pa_source_output_assert_io_context(u->source_output); + + /* manipulate write index, never go past what we have */ + if (PA_SOURCE_IS_OPENED(u->source_output->source->thread_info.state)) + pa_memblockq_seek(u->sink_memblockq, -offset, PA_SEEK_RELATIVE, true); + else + pa_memblockq_flush_write(u->sink_memblockq, true); + + pa_log_debug("Sink rewind (%lld)", (long long) offset); + + u->recv_counter -= offset; + + return 0; + + case SOURCE_OUTPUT_MESSAGE_LATENCY_SNAPSHOT: { + struct snapshot *snapshot = (struct snapshot *) data; + + source_output_snapshot_within_thread(u, snapshot); + return 0; + } + + case SOURCE_OUTPUT_MESSAGE_APPLY_DIFF_TIME: + apply_diff_time(u, offset); + return 0; + + } + + return pa_source_output_process_msg(obj, code, data, offset, chunk); +} + +/* Called from sink I/O thread context. */ +static int sink_input_process_msg_cb(pa_msgobject *obj, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SINK_INPUT(obj)->userdata; + + switch (code) { + + case SINK_INPUT_MESSAGE_LATENCY_SNAPSHOT: { + size_t delay; + pa_usec_t now, latency; + struct snapshot *snapshot = (struct snapshot *) data; + + pa_sink_input_assert_io_context(u->sink_input); + + now = pa_rtclock_now(); + latency = pa_sink_get_latency_within_thread(u->sink_input->sink, false); + delay = pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq); + + delay = (u->sink_input->thread_info.resampler ? pa_resampler_request(u->sink_input->thread_info.resampler, delay) : delay); + + snapshot->sink_now = now; + snapshot->sink_latency = latency; + snapshot->sink_delay = delay; + snapshot->send_counter = u->send_counter; + return 0; + } + } + + return pa_sink_input_process_msg(obj, code, data, offset, chunk); +} + +/* Called from sink I/O thread context. */ +static void sink_input_update_max_rewind_cb(pa_sink_input *i, size_t nbytes) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_log_debug("Sink input update max rewind %lld", (long long) nbytes); + + /* FIXME: Too small max_rewind: + * https://bugs.freedesktop.org/show_bug.cgi?id=53709 */ + pa_memblockq_set_maxrewind(u->sink_memblockq, nbytes); + pa_sink_set_max_rewind_within_thread(u->sink, nbytes); +} + +/* Called from source I/O thread context. */ +static void source_output_update_max_rewind_cb(pa_source_output *o, size_t nbytes) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_assert_se(u = o->userdata); + + pa_log_debug("Source output update max rewind %lld", (long long) nbytes); + + pa_source_set_max_rewind_within_thread(u->source, nbytes); +} + +/* Called from sink I/O thread context. */ +static void sink_input_update_max_request_cb(pa_sink_input *i, size_t nbytes) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_log_debug("Sink input update max request %lld", (long long) nbytes); + + pa_sink_set_max_request_within_thread(u->sink, nbytes); +} + +/* Called from sink I/O thread context. */ +static void sink_input_update_sink_requested_latency_cb(pa_sink_input *i) { + struct userdata *u; + pa_usec_t latency; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + latency = pa_sink_get_requested_latency_within_thread(i->sink); + + pa_log_debug("Sink input update requested latency %lld", (long long) latency); +} + +/* Called from source I/O thread context. */ +static void source_output_update_source_requested_latency_cb(pa_source_output *o) { + struct userdata *u; + pa_usec_t latency; + + pa_source_output_assert_ref(o); + pa_assert_se(u = o->userdata); + + latency = pa_source_get_requested_latency_within_thread(o->source); + + pa_log_debug("Source output update requested latency %lld", (long long) latency); +} + +/* Called from sink I/O thread context. */ +static void sink_input_update_sink_latency_range_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_log_debug("Sink input update latency range %lld %lld", + (long long) i->sink->thread_info.min_latency, + (long long) i->sink->thread_info.max_latency); + + pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency); +} + +/* Called from source I/O thread context. */ +static void source_output_update_source_latency_range_cb(pa_source_output *o) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_assert_se(u = o->userdata); + + pa_log_debug("Source output update latency range %lld %lld", + (long long) o->source->thread_info.min_latency, + (long long) o->source->thread_info.max_latency); + + pa_source_set_latency_range_within_thread(u->source, o->source->thread_info.min_latency, o->source->thread_info.max_latency); +} + +/* Called from sink I/O thread context. */ +static void sink_input_update_sink_fixed_latency_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_log_debug("Sink input update fixed latency %lld", + (long long) i->sink->thread_info.fixed_latency); + + pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency); +} + +/* Called from source I/O thread context. */ +static void source_output_update_source_fixed_latency_cb(pa_source_output *o) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_assert_se(u = o->userdata); + + pa_log_debug("Source output update fixed latency %lld", + (long long) o->source->thread_info.fixed_latency); + + pa_source_set_fixed_latency_within_thread(u->source, o->source->thread_info.fixed_latency); +} + +/* Called from source I/O thread context. */ +static void source_output_attach_cb(pa_source_output *o) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_source_output_assert_io_context(o); + pa_assert_se(u = o->userdata); + + pa_source_set_rtpoll(u->source, o->source->thread_info.rtpoll); + pa_source_set_latency_range_within_thread(u->source, o->source->thread_info.min_latency, o->source->thread_info.max_latency); + pa_source_set_fixed_latency_within_thread(u->source, o->source->thread_info.fixed_latency); + pa_source_set_max_rewind_within_thread(u->source, pa_source_output_get_max_rewind(o)); + + pa_log_debug("Source output %d attach", o->index); + + if (PA_SOURCE_IS_LINKED(u->source->thread_info.state)) + pa_source_attach_within_thread(u->source); + + u->rtpoll_item_read = pa_rtpoll_item_new_asyncmsgq_read( + o->source->thread_info.rtpoll, + PA_RTPOLL_LATE, + u->asyncmsgq); +} + +/* Called from sink I/O thread context. */ +static void sink_input_attach_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_sink_set_rtpoll(u->sink, i->sink->thread_info.rtpoll); + pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency); + + /* (8.1) IF YOU NEED A FIXED BLOCK SIZE ADD THE LATENCY FOR ONE + * BLOCK MINUS ONE SAMPLE HERE. SEE (7) */ + pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency); + + /* (8.2) IF YOU NEED A FIXED BLOCK SIZE ROUND + * pa_sink_input_get_max_request(i) UP TO MULTIPLES OF IT + * HERE. SEE (6) */ + pa_sink_set_max_request_within_thread(u->sink, pa_sink_input_get_max_request(i)); + + /* FIXME: Too small max_rewind: + * https://bugs.freedesktop.org/show_bug.cgi?id=53709 */ + pa_sink_set_max_rewind_within_thread(u->sink, pa_sink_input_get_max_rewind(i)); + + pa_log_debug("Sink input %d attach", i->index); + + u->rtpoll_item_write = pa_rtpoll_item_new_asyncmsgq_write( + i->sink->thread_info.rtpoll, + PA_RTPOLL_LATE, + u->asyncmsgq); + + if (PA_SINK_IS_LINKED(u->sink->thread_info.state)) + pa_sink_attach_within_thread(u->sink); +} + +/* Called from source I/O thread context. */ +static void source_output_detach_cb(pa_source_output *o) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_source_output_assert_io_context(o); + pa_assert_se(u = o->userdata); + + if (PA_SOURCE_IS_LINKED(u->source->thread_info.state)) + pa_source_detach_within_thread(u->source); + pa_source_set_rtpoll(u->source, NULL); + + pa_log_debug("Source output %d detach", o->index); + + if (u->rtpoll_item_read) { + pa_rtpoll_item_free(u->rtpoll_item_read); + u->rtpoll_item_read = NULL; + } +} + +/* Called from sink I/O thread context. */ +static void sink_input_detach_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + if (PA_SINK_IS_LINKED(u->sink->thread_info.state)) + pa_sink_detach_within_thread(u->sink); + + pa_sink_set_rtpoll(u->sink, NULL); + + pa_log_debug("Sink input %d detach", i->index); + + if (u->rtpoll_item_write) { + pa_rtpoll_item_free(u->rtpoll_item_write); + u->rtpoll_item_write = NULL; + } +} + +/* Called from source I/O thread context except when cork() is called without valid source. */ +static void source_output_state_change_cb(pa_source_output *o, pa_source_output_state_t state) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_assert_se(u = o->userdata); + + pa_log_debug("Source output %d state %d", o->index, state); +} + +/* Called from sink I/O thread context. */ +static void sink_input_state_change_cb(pa_sink_input *i, pa_sink_input_state_t state) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_log_debug("Sink input %d state %d", i->index, state); +} + +/* Called from main context. */ +static void source_output_kill_cb(pa_source_output *o) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_assert_ctl_context(); + pa_assert_se(u = o->userdata); + + u->dead = true; + + /* The order here matters! We first kill the source so that streams can + * properly be moved away while the source output is still connected to + * the master. */ + pa_source_output_cork(u->source_output, true); + pa_source_unlink(u->source); + pa_source_output_unlink(u->source_output); + + pa_source_output_unref(u->source_output); + u->source_output = NULL; + + pa_source_unref(u->source); + u->source = NULL; + + pa_log_debug("Source output kill %d", o->index); + + pa_module_unload_request(u->module, true); +} + +/* Called from main context */ +static void sink_input_kill_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + u->dead = true; + + /* The order here matters! We first kill the sink so that streams + * can properly be moved away while the sink input is still connected + * to the master. */ + pa_sink_input_cork(u->sink_input, true); + pa_sink_unlink(u->sink); + pa_sink_input_unlink(u->sink_input); + + pa_sink_input_unref(u->sink_input); + u->sink_input = NULL; + + pa_sink_unref(u->sink); + u->sink = NULL; + + pa_log_debug("Sink input kill %d", i->index); + + pa_module_unload_request(u->module, true); +} + +/* Called from main context. */ +static bool source_output_may_move_to_cb(pa_source_output *o, pa_source *dest) { + struct userdata *u; + + pa_source_output_assert_ref(o); + pa_assert_ctl_context(); + pa_assert_se(u = o->userdata); + + if (u->dead) + return false; + + return (u->source != dest) && (u->sink != dest->monitor_of); +} + +/* Called from main context */ +static bool sink_input_may_move_to_cb(pa_sink_input *i, pa_sink *dest) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + if (u->dead) + return false; + + return u->sink != dest; +} + +/* Called from main context. */ +static void source_output_moving_cb(pa_source_output *o, pa_source *dest) { + struct userdata *u; + uint32_t idx; + pa_source_output *output; + + pa_source_output_assert_ref(o); + pa_assert_ctl_context(); + pa_assert_se(u = o->userdata); + + if (dest) { + pa_source_set_asyncmsgq(u->source, dest->asyncmsgq); + pa_source_update_flags(u->source, PA_SOURCE_LATENCY|PA_SOURCE_DYNAMIC_LATENCY, dest->flags); + } else + pa_source_set_asyncmsgq(u->source, NULL); + + /* Propagate asyncmsq change to attached virtual sources */ + PA_IDXSET_FOREACH(output, u->source->outputs, idx) { + if (output->destination_source && output->moving) + output->moving(output, u->source); + } + + if (u->source_auto_desc && dest) { + const char *y, *z; + pa_proplist *pl; + + pl = pa_proplist_new(); + if (u->sink_input->sink) { + pa_proplist_sets(pl, PA_PROP_DEVICE_MASTER_DEVICE, u->sink_input->sink->name); + y = pa_proplist_gets(u->sink_input->sink->proplist, PA_PROP_DEVICE_DESCRIPTION); + } else + y = ""; /* Probably in the middle of a move */ + z = pa_proplist_gets(dest->proplist, PA_PROP_DEVICE_DESCRIPTION); + pa_proplist_setf(pl, PA_PROP_DEVICE_DESCRIPTION, "%s (echo cancelled with %s)", z ? z : dest->name, + y ? y : u->sink_input->sink->name); + + pa_source_update_proplist(u->source, PA_UPDATE_REPLACE, pl); + pa_proplist_free(pl); + } +} + +/* Called from main context */ +static void sink_input_moving_cb(pa_sink_input *i, pa_sink *dest) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + if (dest) { + pa_sink_set_asyncmsgq(u->sink, dest->asyncmsgq); + pa_sink_update_flags(u->sink, PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY, dest->flags); + } else + pa_sink_set_asyncmsgq(u->sink, NULL); + + if (u->sink_auto_desc && dest) { + const char *y, *z; + pa_proplist *pl; + + pl = pa_proplist_new(); + if (u->source_output->source) { + pa_proplist_sets(pl, PA_PROP_DEVICE_MASTER_DEVICE, u->source_output->source->name); + y = pa_proplist_gets(u->source_output->source->proplist, PA_PROP_DEVICE_DESCRIPTION); + } else + y = ""; /* Probably in the middle of a move */ + z = pa_proplist_gets(dest->proplist, PA_PROP_DEVICE_DESCRIPTION); + pa_proplist_setf(pl, PA_PROP_DEVICE_DESCRIPTION, "%s (echo cancelled with %s)", z ? z : dest->name, + y ? y : u->source_output->source->name); + + pa_sink_update_proplist(u->sink, PA_UPDATE_REPLACE, pl); + pa_proplist_free(pl); + } +} + +/* Called from main context */ +static void sink_input_volume_changed_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_sink_volume_changed(u->sink, &i->volume); +} + +/* Called from main context */ +static void sink_input_mute_changed_cb(pa_sink_input *i) { + struct userdata *u; + + pa_sink_input_assert_ref(i); + pa_assert_se(u = i->userdata); + + pa_sink_mute_changed(u->sink, i->muted); +} + +/* Called from main context */ +static int canceller_process_msg_cb(pa_msgobject *o, int code, void *userdata, int64_t offset, pa_memchunk *chunk) { + struct pa_echo_canceller_msg *msg; + struct userdata *u; + + pa_assert(o); + + msg = PA_ECHO_CANCELLER_MSG(o); + + /* When the module is unloaded, there may still remain queued messages for + * the canceller. Messages are sent to the main thread using the master + * source's asyncmsgq, and that message queue isn't (and can't be, at least + * with the current asyncmsgq API) cleared from the canceller messages when + * module-echo-cancel is unloaded. + * + * The userdata may already have been freed at this point, but the + * asyncmsgq holds a reference to the pa_echo_canceller_msg object, which + * contains a flag to indicate that all remaining messages have to be + * ignored. */ + if (msg->dead) + return 0; + + u = msg->userdata; + + switch (code) { + case ECHO_CANCELLER_MESSAGE_SET_VOLUME: { + pa_volume_t v = PA_PTR_TO_UINT(userdata); + pa_cvolume vol; + + if (u->use_volume_sharing) { + pa_cvolume_set(&vol, u->source->sample_spec.channels, v); + pa_source_set_volume(u->source, &vol, true, false); + } else { + pa_cvolume_set(&vol, u->source_output->sample_spec.channels, v); + pa_source_output_set_volume(u->source_output, &vol, false, true); + } + + break; + } + + default: + pa_assert_not_reached(); + break; + } + + return 0; +} + +/* Called by the canceller, so source I/O thread context. */ +pa_volume_t pa_echo_canceller_get_capture_volume(pa_echo_canceller *ec) { +#ifndef ECHO_CANCEL_TEST + return pa_cvolume_avg(&ec->msg->userdata->thread_info.current_volume); +#else + return PA_VOLUME_NORM; +#endif +} + +/* Called by the canceller, so source I/O thread context. */ +void pa_echo_canceller_set_capture_volume(pa_echo_canceller *ec, pa_volume_t v) { +#ifndef ECHO_CANCEL_TEST + if (pa_cvolume_avg(&ec->msg->userdata->thread_info.current_volume) != v) { + pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(ec->msg), ECHO_CANCELLER_MESSAGE_SET_VOLUME, PA_UINT_TO_PTR(v), + 0, NULL, NULL); + } +#endif +} + +uint32_t pa_echo_canceller_blocksize_power2(unsigned rate, unsigned ms) { + unsigned nframes = (rate * ms) / 1000; + uint32_t y = 1 << ((8 * sizeof(uint32_t)) - 2); + + pa_assert(rate >= 4000); + pa_assert(ms >= 1); + + /* nframes should be a power of 2, round down to nearest power of two */ + while (y > nframes) + y >>= 1; + + pa_assert(y >= 1); + return y; +} + +static pa_echo_canceller_method_t get_ec_method_from_string(const char *method) { + if (pa_streq(method, "null")) + return PA_ECHO_CANCELLER_NULL; +#ifdef HAVE_SPEEX + if (pa_streq(method, "speex")) + return PA_ECHO_CANCELLER_SPEEX; +#endif +#ifdef HAVE_ADRIAN_EC + if (pa_streq(method, "adrian")) + return PA_ECHO_CANCELLER_ADRIAN; +#endif +#ifdef HAVE_WEBRTC + if (pa_streq(method, "webrtc")) + return PA_ECHO_CANCELLER_WEBRTC; +#endif + return PA_ECHO_CANCELLER_INVALID; +} + +/* Common initialisation bits between module-echo-cancel and the standalone + * test program. + * + * Called from main context. */ +static int init_common(pa_modargs *ma, struct userdata *u, pa_sample_spec *source_ss, pa_channel_map *source_map) { + const char *ec_string; + pa_echo_canceller_method_t ec_method; + + if (pa_modargs_get_sample_spec_and_channel_map(ma, source_ss, source_map, PA_CHANNEL_MAP_DEFAULT) < 0) { + pa_log("Invalid sample format specification or channel map"); + goto fail; + } + + u->ec = pa_xnew0(pa_echo_canceller, 1); + if (!u->ec) { + pa_log("Failed to alloc echo canceller"); + goto fail; + } + + ec_string = pa_modargs_get_value(ma, "aec_method", DEFAULT_ECHO_CANCELLER); + if ((ec_method = get_ec_method_from_string(ec_string)) < 0) { + pa_log("Invalid echo canceller implementation '%s'", ec_string); + goto fail; + } + + pa_log_info("Using AEC engine: %s", ec_string); + + u->ec->init = ec_table[ec_method].init; + u->ec->play = ec_table[ec_method].play; + u->ec->record = ec_table[ec_method].record; + u->ec->set_drift = ec_table[ec_method].set_drift; + u->ec->run = ec_table[ec_method].run; + u->ec->done = ec_table[ec_method].done; + + return 0; + +fail: + return -1; +} + +/* Called from main context. */ +int pa__init(pa_module*m) { + struct userdata *u; + pa_sample_spec source_output_ss, source_ss, sink_ss; + pa_channel_map source_output_map, source_map, sink_map; + pa_modargs *ma; + pa_source *source_master=NULL; + pa_sink *sink_master=NULL; + bool autoloaded; + pa_source_output_new_data source_output_data; + pa_sink_input_new_data sink_input_data; + pa_source_new_data source_data; + pa_sink_new_data sink_data; + pa_memchunk silence; + uint32_t temp; + uint32_t nframes = 0; + bool use_master_format; + pa_usec_t blocksize_usec; + + pa_assert(m); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments."); + goto fail; + } + + if (!(source_master = pa_namereg_get(m->core, pa_modargs_get_value(ma, "source_master", NULL), PA_NAMEREG_SOURCE))) { + pa_log("Master source not found"); + goto fail; + } + pa_assert(source_master); + + if (!(sink_master = pa_namereg_get(m->core, pa_modargs_get_value(ma, "sink_master", NULL), PA_NAMEREG_SINK))) { + pa_log("Master sink not found"); + goto fail; + } + pa_assert(sink_master); + + if (source_master->monitor_of == sink_master) { + pa_log("Can't cancel echo between a sink and its monitor"); + goto fail; + } + + /* Set to true if we just want to inherit sample spec and channel map from the sink and source master */ + use_master_format = DEFAULT_USE_MASTER_FORMAT; + if (pa_modargs_get_value_boolean(ma, "use_master_format", &use_master_format) < 0) { + pa_log("use_master_format= expects a boolean argument"); + goto fail; + } + + source_ss = source_master->sample_spec; + sink_ss = sink_master->sample_spec; + + if (use_master_format) { + source_map = source_master->channel_map; + sink_map = sink_master->channel_map; + } else { + source_ss = source_master->sample_spec; + source_ss.rate = DEFAULT_RATE; + source_ss.channels = DEFAULT_CHANNELS; + pa_channel_map_init_auto(&source_map, source_ss.channels, PA_CHANNEL_MAP_DEFAULT); + + sink_ss = sink_master->sample_spec; + sink_ss.rate = DEFAULT_RATE; + sink_ss.channels = DEFAULT_CHANNELS; + pa_channel_map_init_auto(&sink_map, sink_ss.channels, PA_CHANNEL_MAP_DEFAULT); + } + + u = pa_xnew0(struct userdata, 1); + if (!u) { + pa_log("Failed to alloc userdata"); + goto fail; + } + u->core = m->core; + u->module = m; + m->userdata = u; + u->dead = false; + + u->use_volume_sharing = true; + if (pa_modargs_get_value_boolean(ma, "use_volume_sharing", &u->use_volume_sharing) < 0) { + pa_log("use_volume_sharing= expects a boolean argument"); + goto fail; + } + + temp = DEFAULT_ADJUST_TIME_USEC / PA_USEC_PER_SEC; + if (pa_modargs_get_value_u32(ma, "adjust_time", &temp) < 0) { + pa_log("Failed to parse adjust_time value"); + goto fail; + } + + if (temp != DEFAULT_ADJUST_TIME_USEC / PA_USEC_PER_SEC) + u->adjust_time = temp * PA_USEC_PER_SEC; + else + u->adjust_time = DEFAULT_ADJUST_TIME_USEC; + + temp = DEFAULT_ADJUST_TOLERANCE / PA_USEC_PER_MSEC; + if (pa_modargs_get_value_u32(ma, "adjust_threshold", &temp) < 0) { + pa_log("Failed to parse adjust_threshold value"); + goto fail; + } + + if (temp != DEFAULT_ADJUST_TOLERANCE / PA_USEC_PER_MSEC) + u->adjust_threshold = temp * PA_USEC_PER_MSEC; + else + u->adjust_threshold = DEFAULT_ADJUST_TOLERANCE; + + u->save_aec = DEFAULT_SAVE_AEC; + if (pa_modargs_get_value_boolean(ma, "save_aec", &u->save_aec) < 0) { + pa_log("Failed to parse save_aec value"); + goto fail; + } + + autoloaded = DEFAULT_AUTOLOADED; + if (pa_modargs_get_value_boolean(ma, "autoloaded", &autoloaded) < 0) { + pa_log("Failed to parse autoloaded value"); + goto fail; + } + + if (init_common(ma, u, &source_ss, &source_map) < 0) + goto fail; + + u->asyncmsgq = pa_asyncmsgq_new(0); + if (!u->asyncmsgq) { + pa_log("pa_asyncmsgq_new() failed."); + goto fail; + } + + u->need_realign = true; + + source_output_ss = source_ss; + source_output_map = source_map; + + if (sink_ss.rate != source_ss.rate) { + pa_log_info("Sample rates of play and out stream differ. Adjusting rate of play stream."); + sink_ss.rate = source_ss.rate; + } + + pa_assert(u->ec->init); + if (!u->ec->init(u->core, u->ec, &source_output_ss, &source_output_map, &sink_ss, &sink_map, &source_ss, &source_map, &nframes, pa_modargs_get_value(ma, "aec_args", NULL))) { + pa_log("Failed to init AEC engine"); + goto fail; + } + + pa_assert(source_output_ss.rate == source_ss.rate); + pa_assert(sink_ss.rate == source_ss.rate); + + u->source_output_blocksize = nframes * pa_frame_size(&source_output_ss); + u->source_blocksize = nframes * pa_frame_size(&source_ss); + u->sink_blocksize = nframes * pa_frame_size(&sink_ss); + + if (u->ec->params.drift_compensation) + pa_assert(u->ec->set_drift); + + /* Create source */ + pa_source_new_data_init(&source_data); + source_data.driver = __FILE__; + source_data.module = m; + if (!(source_data.name = pa_xstrdup(pa_modargs_get_value(ma, "source_name", NULL)))) + source_data.name = pa_sprintf_malloc("%s.echo-cancel", source_master->name); + pa_source_new_data_set_sample_spec(&source_data, &source_ss); + pa_source_new_data_set_channel_map(&source_data, &source_map); + pa_proplist_sets(source_data.proplist, PA_PROP_DEVICE_MASTER_DEVICE, source_master->name); + pa_proplist_sets(source_data.proplist, PA_PROP_DEVICE_CLASS, "filter"); + if (!autoloaded) + pa_proplist_sets(source_data.proplist, PA_PROP_DEVICE_INTENDED_ROLES, "phone"); + + if (pa_modargs_get_proplist(ma, "source_properties", source_data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_source_new_data_done(&source_data); + goto fail; + } + + if ((u->source_auto_desc = !pa_proplist_contains(source_data.proplist, PA_PROP_DEVICE_DESCRIPTION))) { + const char *y, *z; + + y = pa_proplist_gets(sink_master->proplist, PA_PROP_DEVICE_DESCRIPTION); + z = pa_proplist_gets(source_master->proplist, PA_PROP_DEVICE_DESCRIPTION); + pa_proplist_setf(source_data.proplist, PA_PROP_DEVICE_DESCRIPTION, "%s (echo cancelled with %s)", + z ? z : source_master->name, y ? y : sink_master->name); + } + + u->source = pa_source_new(m->core, &source_data, (source_master->flags & (PA_SOURCE_LATENCY | PA_SOURCE_DYNAMIC_LATENCY)) + | (u->use_volume_sharing ? PA_SOURCE_SHARE_VOLUME_WITH_MASTER : 0)); + pa_source_new_data_done(&source_data); + + if (!u->source) { + pa_log("Failed to create source."); + goto fail; + } + + u->source->parent.process_msg = source_process_msg_cb; + u->source->set_state_in_main_thread = source_set_state_in_main_thread_cb; + u->source->update_requested_latency = source_update_requested_latency_cb; + pa_source_set_set_mute_callback(u->source, source_set_mute_cb); + if (!u->use_volume_sharing) { + pa_source_set_get_volume_callback(u->source, source_get_volume_cb); + pa_source_set_set_volume_callback(u->source, source_set_volume_cb); + pa_source_enable_decibel_volume(u->source, true); + } + u->source->userdata = u; + + pa_source_set_asyncmsgq(u->source, source_master->asyncmsgq); + + /* Create sink */ + pa_sink_new_data_init(&sink_data); + sink_data.driver = __FILE__; + sink_data.module = m; + if (!(sink_data.name = pa_xstrdup(pa_modargs_get_value(ma, "sink_name", NULL)))) + sink_data.name = pa_sprintf_malloc("%s.echo-cancel", sink_master->name); + pa_sink_new_data_set_sample_spec(&sink_data, &sink_ss); + pa_sink_new_data_set_channel_map(&sink_data, &sink_map); + pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_MASTER_DEVICE, sink_master->name); + pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_CLASS, "filter"); + if (!autoloaded) + pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_INTENDED_ROLES, "phone"); + + if (pa_modargs_get_proplist(ma, "sink_properties", sink_data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_sink_new_data_done(&sink_data); + goto fail; + } + + if ((u->sink_auto_desc = !pa_proplist_contains(sink_data.proplist, PA_PROP_DEVICE_DESCRIPTION))) { + const char *y, *z; + + y = pa_proplist_gets(source_master->proplist, PA_PROP_DEVICE_DESCRIPTION); + z = pa_proplist_gets(sink_master->proplist, PA_PROP_DEVICE_DESCRIPTION); + pa_proplist_setf(sink_data.proplist, PA_PROP_DEVICE_DESCRIPTION, "%s (echo cancelled with %s)", + z ? z : sink_master->name, y ? y : source_master->name); + } + + u->sink = pa_sink_new(m->core, &sink_data, (sink_master->flags & (PA_SINK_LATENCY | PA_SINK_DYNAMIC_LATENCY)) + | (u->use_volume_sharing ? PA_SINK_SHARE_VOLUME_WITH_MASTER : 0)); + pa_sink_new_data_done(&sink_data); + + if (!u->sink) { + pa_log("Failed to create sink."); + goto fail; + } + + u->sink->parent.process_msg = sink_process_msg_cb; + u->sink->set_state_in_main_thread = sink_set_state_in_main_thread_cb; + u->sink->set_state_in_io_thread = sink_set_state_in_io_thread_cb; + u->sink->update_requested_latency = sink_update_requested_latency_cb; + u->sink->request_rewind = sink_request_rewind_cb; + pa_sink_set_set_mute_callback(u->sink, sink_set_mute_cb); + if (!u->use_volume_sharing) { + pa_sink_set_set_volume_callback(u->sink, sink_set_volume_cb); + pa_sink_enable_decibel_volume(u->sink, true); + } + u->sink->userdata = u; + + pa_sink_set_asyncmsgq(u->sink, sink_master->asyncmsgq); + + /* Create source output */ + pa_source_output_new_data_init(&source_output_data); + source_output_data.driver = __FILE__; + source_output_data.module = m; + pa_source_output_new_data_set_source(&source_output_data, source_master, false, true); + source_output_data.destination_source = u->source; + + pa_proplist_sets(source_output_data.proplist, PA_PROP_MEDIA_NAME, "Echo-Cancel Source Stream"); + pa_proplist_sets(source_output_data.proplist, PA_PROP_MEDIA_ROLE, "filter"); + pa_source_output_new_data_set_sample_spec(&source_output_data, &source_output_ss); + pa_source_output_new_data_set_channel_map(&source_output_data, &source_output_map); + source_output_data.flags |= PA_SOURCE_OUTPUT_START_CORKED; + + if (autoloaded) + source_output_data.flags |= PA_SOURCE_OUTPUT_DONT_MOVE; + + pa_source_output_new(&u->source_output, m->core, &source_output_data); + pa_source_output_new_data_done(&source_output_data); + + if (!u->source_output) + goto fail; + + u->source_output->parent.process_msg = source_output_process_msg_cb; + u->source_output->push = source_output_push_cb; + u->source_output->process_rewind = source_output_process_rewind_cb; + u->source_output->update_max_rewind = source_output_update_max_rewind_cb; + u->source_output->update_source_requested_latency = source_output_update_source_requested_latency_cb; + u->source_output->update_source_latency_range = source_output_update_source_latency_range_cb; + u->source_output->update_source_fixed_latency = source_output_update_source_fixed_latency_cb; + u->source_output->kill = source_output_kill_cb; + u->source_output->attach = source_output_attach_cb; + u->source_output->detach = source_output_detach_cb; + u->source_output->state_change = source_output_state_change_cb; + u->source_output->may_move_to = source_output_may_move_to_cb; + u->source_output->moving = source_output_moving_cb; + u->source_output->userdata = u; + + u->source->output_from_master = u->source_output; + + /* Create sink input */ + pa_sink_input_new_data_init(&sink_input_data); + sink_input_data.driver = __FILE__; + sink_input_data.module = m; + pa_sink_input_new_data_set_sink(&sink_input_data, sink_master, false, true); + sink_input_data.origin_sink = u->sink; + pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_NAME, "Echo-Cancel Sink Stream"); + pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_ROLE, "filter"); + pa_sink_input_new_data_set_sample_spec(&sink_input_data, &sink_ss); + pa_sink_input_new_data_set_channel_map(&sink_input_data, &sink_map); + sink_input_data.flags = PA_SINK_INPUT_VARIABLE_RATE | PA_SINK_INPUT_START_CORKED; + + if (autoloaded) + sink_input_data.flags |= PA_SINK_INPUT_DONT_MOVE; + + pa_sink_input_new(&u->sink_input, m->core, &sink_input_data); + pa_sink_input_new_data_done(&sink_input_data); + + if (!u->sink_input) + goto fail; + + u->sink_input->parent.process_msg = sink_input_process_msg_cb; + u->sink_input->pop = sink_input_pop_cb; + u->sink_input->process_rewind = sink_input_process_rewind_cb; + u->sink_input->update_max_rewind = sink_input_update_max_rewind_cb; + u->sink_input->update_max_request = sink_input_update_max_request_cb; + u->sink_input->update_sink_requested_latency = sink_input_update_sink_requested_latency_cb; + u->sink_input->update_sink_latency_range = sink_input_update_sink_latency_range_cb; + u->sink_input->update_sink_fixed_latency = sink_input_update_sink_fixed_latency_cb; + u->sink_input->kill = sink_input_kill_cb; + u->sink_input->attach = sink_input_attach_cb; + u->sink_input->detach = sink_input_detach_cb; + u->sink_input->state_change = sink_input_state_change_cb; + u->sink_input->may_move_to = sink_input_may_move_to_cb; + u->sink_input->moving = sink_input_moving_cb; + if (!u->use_volume_sharing) + u->sink_input->volume_changed = sink_input_volume_changed_cb; + u->sink_input->mute_changed = sink_input_mute_changed_cb; + u->sink_input->userdata = u; + + u->sink->input_to_master = u->sink_input; + + pa_sink_input_get_silence(u->sink_input, &silence); + + u->source_memblockq = pa_memblockq_new("module-echo-cancel source_memblockq", 0, MEMBLOCKQ_MAXLENGTH, 0, + &source_output_ss, 1, 1, 0, &silence); + u->sink_memblockq = pa_memblockq_new("module-echo-cancel sink_memblockq", 0, MEMBLOCKQ_MAXLENGTH, 0, + &sink_ss, 0, 1, 0, &silence); + + pa_memblock_unref(silence.memblock); + + if (!u->source_memblockq || !u->sink_memblockq) { + pa_log("Failed to create memblockq."); + goto fail; + } + + if (u->adjust_time > 0 && !u->ec->params.drift_compensation) + u->time_event = pa_core_rttime_new(m->core, pa_rtclock_now() + u->adjust_time, time_callback, u); + else if (u->ec->params.drift_compensation) { + pa_log_info("Canceller does drift compensation -- built-in compensation will be disabled"); + u->adjust_time = 0; + /* Perform resync just once to give the canceller a leg up */ + pa_atomic_store(&u->request_resync, 1); + } + + if (u->save_aec) { + pa_log("Creating AEC files in /tmp"); + u->captured_file = fopen("/tmp/aec_rec.sw", "wb"); + if (u->captured_file == NULL) + perror ("fopen failed"); + u->played_file = fopen("/tmp/aec_play.sw", "wb"); + if (u->played_file == NULL) + perror ("fopen failed"); + u->canceled_file = fopen("/tmp/aec_out.sw", "wb"); + if (u->canceled_file == NULL) + perror ("fopen failed"); + if (u->ec->params.drift_compensation) { + u->drift_file = fopen("/tmp/aec_drift.txt", "w"); + if (u->drift_file == NULL) + perror ("fopen failed"); + } + } + + u->ec->msg = pa_msgobject_new(pa_echo_canceller_msg); + u->ec->msg->parent.process_msg = canceller_process_msg_cb; + u->ec->msg->userdata = u; + + u->thread_info.current_volume = u->source->reference_volume; + + /* We don't want to deal with too many chunks at a time */ + blocksize_usec = pa_bytes_to_usec(u->source_blocksize, &u->source->sample_spec); + if (u->source->flags & PA_SOURCE_DYNAMIC_LATENCY) + pa_source_set_latency_range(u->source, blocksize_usec, blocksize_usec * MAX_LATENCY_BLOCKS); + pa_source_output_set_requested_latency(u->source_output, blocksize_usec * MAX_LATENCY_BLOCKS); + + blocksize_usec = pa_bytes_to_usec(u->sink_blocksize, &u->sink->sample_spec); + if (u->sink->flags & PA_SINK_DYNAMIC_LATENCY) + pa_sink_set_latency_range(u->sink, blocksize_usec, blocksize_usec * MAX_LATENCY_BLOCKS); + pa_sink_input_set_requested_latency(u->sink_input, blocksize_usec * MAX_LATENCY_BLOCKS); + + /* The order here is important. The input/output must be put first, + * otherwise streams might attach to the sink/source before the + * sink input or source output is attached to the master. */ + pa_sink_input_put(u->sink_input); + pa_source_output_put(u->source_output); + + pa_sink_put(u->sink); + pa_source_put(u->source); + + pa_source_output_cork(u->source_output, false); + pa_sink_input_cork(u->sink_input, false); + + pa_modargs_free(ma); + + return 0; + +fail: + if (ma) + pa_modargs_free(ma); + + pa__done(m); + + return -1; +} + +/* Called from main context. */ +int pa__get_n_used(pa_module *m) { + struct userdata *u; + + pa_assert(m); + pa_assert_se(u = m->userdata); + + return pa_sink_linked_by(u->sink) + pa_source_linked_by(u->source); +} + +/* Called from main context. */ +void pa__done(pa_module*m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + u->dead = true; + + /* See comments in source_output_kill_cb() above regarding + * destruction order! */ + + if (u->time_event) + u->core->mainloop->time_free(u->time_event); + + if (u->source_output) + pa_source_output_cork(u->source_output, true); + if (u->sink_input) + pa_sink_input_cork(u->sink_input, true); + + if (u->source) + pa_source_unlink(u->source); + if (u->sink) + pa_sink_unlink(u->sink); + + if (u->source_output) { + pa_source_output_unlink(u->source_output); + pa_source_output_unref(u->source_output); + } + + if (u->sink_input) { + pa_sink_input_unlink(u->sink_input); + pa_sink_input_unref(u->sink_input); + } + + if (u->source) + pa_source_unref(u->source); + if (u->sink) + pa_sink_unref(u->sink); + + if (u->source_memblockq) + pa_memblockq_free(u->source_memblockq); + if (u->sink_memblockq) + pa_memblockq_free(u->sink_memblockq); + + if (u->ec) { + if (u->ec->done) + u->ec->done(u->ec); + + if (u->ec->msg) { + u->ec->msg->dead = true; + pa_echo_canceller_msg_unref(u->ec->msg); + } + + pa_xfree(u->ec); + } + + if (u->asyncmsgq) + pa_asyncmsgq_unref(u->asyncmsgq); + + if (u->save_aec) { + if (u->played_file) + fclose(u->played_file); + if (u->captured_file) + fclose(u->captured_file); + if (u->canceled_file) + fclose(u->canceled_file); + if (u->drift_file) + fclose(u->drift_file); + } + + pa_xfree(u); +} + +#ifdef ECHO_CANCEL_TEST +/* + * Stand-alone test program for running in the canceller on pre-recorded files. + */ +int main(int argc, char* argv[]) { + struct userdata u; + pa_sample_spec source_output_ss, source_ss, sink_ss; + pa_channel_map source_output_map, source_map, sink_map; + pa_modargs *ma = NULL; + uint8_t *rdata = NULL, *pdata = NULL, *cdata = NULL; + int unused PA_GCC_UNUSED; + int ret = 0, i; + char c; + float drift; + uint32_t nframes; + + if (!getenv("MAKE_CHECK")) + pa_log_set_level(PA_LOG_DEBUG); + + pa_memzero(&u, sizeof(u)); + + if (argc < 4 || argc > 7) { + goto usage; + } + + u.captured_file = fopen(argv[2], "rb"); + if (u.captured_file == NULL) { + perror ("Could not open capture file"); + goto fail; + } + u.played_file = fopen(argv[1], "rb"); + if (u.played_file == NULL) { + perror ("Could not open play file"); + goto fail; + } + u.canceled_file = fopen(argv[3], "wb"); + if (u.canceled_file == NULL) { + perror ("Could not open canceled file"); + goto fail; + } + + u.core = pa_xnew0(pa_core, 1); + u.core->cpu_info.cpu_type = PA_CPU_X86; + u.core->cpu_info.flags.x86 |= PA_CPU_X86_SSE; + + if (!(ma = pa_modargs_new(argc > 4 ? argv[4] : NULL, valid_modargs))) { + pa_log("Failed to parse module arguments."); + goto fail; + } + + source_ss.format = PA_SAMPLE_FLOAT32LE; + source_ss.rate = DEFAULT_RATE; + source_ss.channels = DEFAULT_CHANNELS; + pa_channel_map_init_auto(&source_map, source_ss.channels, PA_CHANNEL_MAP_DEFAULT); + + sink_ss.format = PA_SAMPLE_FLOAT32LE; + sink_ss.rate = DEFAULT_RATE; + sink_ss.channels = DEFAULT_CHANNELS; + pa_channel_map_init_auto(&sink_map, sink_ss.channels, PA_CHANNEL_MAP_DEFAULT); + + if (init_common(ma, &u, &source_ss, &source_map) < 0) + goto fail; + + source_output_ss = source_ss; + source_output_map = source_map; + + if (!u.ec->init(u.core, u.ec, &source_output_ss, &source_output_map, &sink_ss, &sink_map, &source_ss, &source_map, &nframes, + pa_modargs_get_value(ma, "aec_args", NULL))) { + pa_log("Failed to init AEC engine"); + goto fail; + } + u.source_output_blocksize = nframes * pa_frame_size(&source_output_ss); + u.source_blocksize = nframes * pa_frame_size(&source_ss); + u.sink_blocksize = nframes * pa_frame_size(&sink_ss); + + if (u.ec->params.drift_compensation) { + if (argc < 6) { + pa_log("Drift compensation enabled but drift file not specified"); + goto fail; + } + + u.drift_file = fopen(argv[5], "rt"); + + if (u.drift_file == NULL) { + perror ("Could not open drift file"); + goto fail; + } + } + + rdata = pa_xmalloc(u.source_output_blocksize); + pdata = pa_xmalloc(u.sink_blocksize); + cdata = pa_xmalloc(u.source_blocksize); + + if (!u.ec->params.drift_compensation) { + while (fread(rdata, u.source_output_blocksize, 1, u.captured_file) > 0) { + if (fread(pdata, u.sink_blocksize, 1, u.played_file) == 0) { + perror("Played file ended before captured file"); + goto fail; + } + + u.ec->run(u.ec, rdata, pdata, cdata); + + unused = fwrite(cdata, u.source_blocksize, 1, u.canceled_file); + } + } else { + while (fscanf(u.drift_file, "%c", &c) > 0) { + switch (c) { + case 'd': + if (!fscanf(u.drift_file, "%a", &drift)) { + perror("Drift file incomplete"); + goto fail; + } + + u.ec->set_drift(u.ec, drift); + + break; + + case 'c': + if (!fscanf(u.drift_file, "%d", &i)) { + perror("Drift file incomplete"); + goto fail; + } + + if (fread(rdata, i, 1, u.captured_file) <= 0) { + perror("Captured file ended prematurely"); + goto fail; + } + + u.ec->record(u.ec, rdata, cdata); + + unused = fwrite(cdata, i, 1, u.canceled_file); + + break; + + case 'p': + if (!fscanf(u.drift_file, "%d", &i)) { + perror("Drift file incomplete"); + goto fail; + } + + if (fread(pdata, i, 1, u.played_file) <= 0) { + perror("Played file ended prematurely"); + goto fail; + } + + u.ec->play(u.ec, pdata); + + break; + } + } + + if (fread(rdata, i, 1, u.captured_file) > 0) + pa_log("All capture data was not consumed"); + if (fread(pdata, i, 1, u.played_file) > 0) + pa_log("All playback data was not consumed"); + } + + u.ec->done(u.ec); + u.ec->msg->dead = true; + pa_echo_canceller_msg_unref(u.ec->msg); + +out: + if (u.captured_file) + fclose(u.captured_file); + if (u.played_file) + fclose(u.played_file); + if (u.canceled_file) + fclose(u.canceled_file); + if (u.drift_file) + fclose(u.drift_file); + + pa_xfree(rdata); + pa_xfree(pdata); + pa_xfree(cdata); + + pa_xfree(u.ec); + pa_xfree(u.core); + + if (ma) + pa_modargs_free(ma); + + return ret; + +usage: + pa_log("Usage: %s play_file rec_file out_file [module args] [drift_file]", argv[0]); + +fail: + ret = -1; + goto out; +} +#endif /* ECHO_CANCEL_TEST */ diff --git a/src/modules/echo-cancel/null.c b/src/modules/echo-cancel/null.c new file mode 100644 index 0000000..c8ecf27 --- /dev/null +++ b/src/modules/echo-cancel/null.c @@ -0,0 +1,56 @@ +/*** + Copyright 2012 Peter Meerwald + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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. + +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +PA_C_DECL_BEGIN +#include +#include +#include "echo-cancel.h" +PA_C_DECL_END + +bool pa_null_ec_init(pa_core *c, pa_echo_canceller *ec, + pa_sample_spec *rec_ss, pa_channel_map *rec_map, + pa_sample_spec *play_ss, pa_channel_map *play_map, + pa_sample_spec *out_ss, pa_channel_map *out_map, + uint32_t *nframes, const char *args) { + char strss_source[PA_SAMPLE_SPEC_SNPRINT_MAX]; + char strss_sink[PA_SAMPLE_SPEC_SNPRINT_MAX]; + + *nframes = 256; + ec->params.null.out_ss = *out_ss; + + *rec_ss = *out_ss; + *rec_map = *out_map; + + pa_log_debug("null AEC: nframes=%u, sample spec source=%s, sample spec sink=%s", *nframes, + pa_sample_spec_snprint(strss_source, sizeof(strss_source), out_ss), + pa_sample_spec_snprint(strss_sink, sizeof(strss_sink), play_ss)); + + return true; +} + +void pa_null_ec_run(pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *play, uint8_t *out) { + /* The null implementation simply copies the recorded buffer to the output + buffer and ignores the play buffer. */ + memcpy(out, rec, 256 * pa_frame_size(&ec->params.null.out_ss)); +} + +void pa_null_ec_done(pa_echo_canceller *ec) { +} diff --git a/src/modules/echo-cancel/speex.c b/src/modules/echo-cancel/speex.c new file mode 100644 index 0000000..794399a --- /dev/null +++ b/src/modules/echo-cancel/speex.c @@ -0,0 +1,237 @@ +/*** + This file is part of PulseAudio. + + Copyright 2010 Wim Taymans + + Contributor: Arun Raghavan + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include "echo-cancel.h" + +/* should be between 10-20 ms */ +#define DEFAULT_FRAME_SIZE_MS 20 +/* should be between 100-500 ms */ +#define DEFAULT_FILTER_SIZE_MS 200 +#define DEFAULT_AGC_ENABLED true +#define DEFAULT_DENOISE_ENABLED true +#define DEFAULT_DEREVERB_ENABLED true +#define DEFAULT_ECHO_SUPPRESS_ENABLED true +#define DEFAULT_ECHO_SUPPRESS_ATTENUATION 0 + +static const char* const valid_modargs[] = { + "frame_size_ms", + "filter_size_ms", + "agc", + "denoise", + "dereverb", + "echo_suppress", + "echo_suppress_attenuation", + "echo_suppress_attenuation_active", + NULL +}; + +static void speex_ec_fixate_spec(pa_sample_spec *rec_ss, pa_channel_map *rec_map, + pa_sample_spec *play_ss, pa_channel_map *play_map, + pa_sample_spec *out_ss, pa_channel_map *out_map) { + out_ss->format = PA_SAMPLE_S16NE; + + *play_ss = *out_ss; + *play_map = *out_map; + *rec_ss = *out_ss; + *rec_map = *out_map; +} + +static bool pa_speex_ec_preprocessor_init(pa_echo_canceller *ec, pa_sample_spec *out_ss, uint32_t nframes, pa_modargs *ma) { + bool agc; + bool denoise; + bool dereverb; + bool echo_suppress; + int32_t echo_suppress_attenuation; + int32_t echo_suppress_attenuation_active; + + agc = DEFAULT_AGC_ENABLED; + if (pa_modargs_get_value_boolean(ma, "agc", &agc) < 0) { + pa_log("Failed to parse agc value"); + goto fail; + } + + denoise = DEFAULT_DENOISE_ENABLED; + if (pa_modargs_get_value_boolean(ma, "denoise", &denoise) < 0) { + pa_log("Failed to parse denoise value"); + goto fail; + } + + dereverb = DEFAULT_DEREVERB_ENABLED; + if (pa_modargs_get_value_boolean(ma, "dereverb", &dereverb) < 0) { + pa_log("Failed to parse dereverb value"); + goto fail; + } + + echo_suppress = DEFAULT_ECHO_SUPPRESS_ENABLED; + if (pa_modargs_get_value_boolean(ma, "echo_suppress", &echo_suppress) < 0) { + pa_log("Failed to parse echo_suppress value"); + goto fail; + } + + echo_suppress_attenuation = DEFAULT_ECHO_SUPPRESS_ATTENUATION; + if (pa_modargs_get_value_s32(ma, "echo_suppress_attenuation", &echo_suppress_attenuation) < 0) { + pa_log("Failed to parse echo_suppress_attenuation value"); + goto fail; + } + if (echo_suppress_attenuation > 0) { + pa_log("echo_suppress_attenuation should be a negative dB value"); + goto fail; + } + + echo_suppress_attenuation_active = DEFAULT_ECHO_SUPPRESS_ATTENUATION; + if (pa_modargs_get_value_s32(ma, "echo_suppress_attenuation_active", &echo_suppress_attenuation_active) < 0) { + pa_log("Failed to parse echo_suppress_attenuation_active value"); + goto fail; + } + if (echo_suppress_attenuation_active > 0) { + pa_log("echo_suppress_attenuation_active should be a negative dB value"); + goto fail; + } + + if (agc || denoise || dereverb || echo_suppress) { + spx_int32_t tmp; + + if (out_ss->channels != 1) { + pa_log("AGC, denoising, dereverb and echo suppression only work with channels=1"); + goto fail; + } + + ec->params.speex.pp_state = speex_preprocess_state_init(nframes, out_ss->rate); + + tmp = agc; + speex_preprocess_ctl(ec->params.speex.pp_state, SPEEX_PREPROCESS_SET_AGC, &tmp); + + tmp = denoise; + speex_preprocess_ctl(ec->params.speex.pp_state, SPEEX_PREPROCESS_SET_DENOISE, &tmp); + + tmp = dereverb; + speex_preprocess_ctl(ec->params.speex.pp_state, SPEEX_PREPROCESS_SET_DEREVERB, &tmp); + + if (echo_suppress) { + if (echo_suppress_attenuation) + speex_preprocess_ctl(ec->params.speex.pp_state, SPEEX_PREPROCESS_SET_ECHO_SUPPRESS, + &echo_suppress_attenuation); + + if (echo_suppress_attenuation_active) { + speex_preprocess_ctl(ec->params.speex.pp_state, SPEEX_PREPROCESS_SET_ECHO_SUPPRESS_ACTIVE, + &echo_suppress_attenuation_active); + } + } + + speex_preprocess_ctl(ec->params.speex.pp_state, SPEEX_PREPROCESS_SET_ECHO_STATE, + ec->params.speex.state); + + pa_log_info("Loaded speex preprocessor with params: agc=%s, denoise=%s, dereverb=%s, echo_suppress=%s", + pa_yes_no(agc), pa_yes_no(denoise), pa_yes_no(dereverb), pa_yes_no(echo_suppress)); + } else + pa_log_info("All preprocessing options are disabled"); + + return true; + +fail: + return false; +} + +bool pa_speex_ec_init(pa_core *c, pa_echo_canceller *ec, + pa_sample_spec *rec_ss, pa_channel_map *rec_map, + pa_sample_spec *play_ss, pa_channel_map *play_map, + pa_sample_spec *out_ss, pa_channel_map *out_map, + uint32_t *nframes, const char *args) { + int rate; + uint32_t frame_size_ms, filter_size_ms; + pa_modargs *ma; + + if (!(ma = pa_modargs_new(args, valid_modargs))) { + pa_log("Failed to parse submodule arguments."); + goto fail; + } + + filter_size_ms = DEFAULT_FILTER_SIZE_MS; + if (pa_modargs_get_value_u32(ma, "filter_size_ms", &filter_size_ms) < 0 || filter_size_ms < 1 || filter_size_ms > 2000) { + pa_log("Invalid filter_size_ms specification"); + goto fail; + } + + frame_size_ms = DEFAULT_FRAME_SIZE_MS; + if (pa_modargs_get_value_u32(ma, "frame_size_ms", &frame_size_ms) < 0 || frame_size_ms < 1 || frame_size_ms > 200) { + pa_log("Invalid frame_size_ms specification"); + goto fail; + } + + speex_ec_fixate_spec(rec_ss, rec_map, play_ss, play_map, out_ss, out_map); + + rate = out_ss->rate; + *nframes = pa_echo_canceller_blocksize_power2(rate, frame_size_ms); + + pa_log_debug ("Using nframes %d, channels %d, rate %d", *nframes, out_ss->channels, out_ss->rate); + ec->params.speex.state = speex_echo_state_init_mc(*nframes, (rate * filter_size_ms) / 1000, out_ss->channels, out_ss->channels); + + if (!ec->params.speex.state) + goto fail; + + speex_echo_ctl(ec->params.speex.state, SPEEX_ECHO_SET_SAMPLING_RATE, &rate); + + if (!pa_speex_ec_preprocessor_init(ec, out_ss, *nframes, ma)) + goto fail; + + pa_modargs_free(ma); + return true; + +fail: + if (ma) + pa_modargs_free(ma); + if (ec->params.speex.pp_state) { + speex_preprocess_state_destroy(ec->params.speex.pp_state); + ec->params.speex.pp_state = NULL; + } + if (ec->params.speex.state) { + speex_echo_state_destroy(ec->params.speex.state); + ec->params.speex.state = NULL; + } + return false; +} + +void pa_speex_ec_run(pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *play, uint8_t *out) { + speex_echo_cancellation(ec->params.speex.state, (const spx_int16_t *) rec, (const spx_int16_t *) play, + (spx_int16_t *) out); + + /* preprecessor is run after AEC. This is not a mistake! */ + if (ec->params.speex.pp_state) + speex_preprocess_run(ec->params.speex.pp_state, (spx_int16_t *) out); +} + +void pa_speex_ec_done(pa_echo_canceller *ec) { + if (ec->params.speex.pp_state) { + speex_preprocess_state_destroy(ec->params.speex.pp_state); + ec->params.speex.pp_state = NULL; + } + + if (ec->params.speex.state) { + speex_echo_state_destroy(ec->params.speex.state); + ec->params.speex.state = NULL; + } +} diff --git a/src/modules/echo-cancel/webrtc.cc b/src/modules/echo-cancel/webrtc.cc new file mode 100644 index 0000000..ec3ba06 --- /dev/null +++ b/src/modules/echo-cancel/webrtc.cc @@ -0,0 +1,594 @@ +/*** + This file is part of PulseAudio. + + Copyright 2011 Collabora Ltd. + 2015 Aldebaran SoftBank Group + + Contributor: Arun Raghavan + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +PA_C_DECL_BEGIN +#include +#include + +#include +#include "echo-cancel.h" +PA_C_DECL_END + +#include +#include +#include + +#define BLOCK_SIZE_US 10000 + +#define DEFAULT_HIGH_PASS_FILTER true +#define DEFAULT_NOISE_SUPPRESSION true +#define DEFAULT_ANALOG_GAIN_CONTROL true +#define DEFAULT_DIGITAL_GAIN_CONTROL false +#define DEFAULT_MOBILE false +#define DEFAULT_ROUTING_MODE "speakerphone" +#define DEFAULT_COMFORT_NOISE true +#define DEFAULT_DRIFT_COMPENSATION false +#define DEFAULT_VAD true +#define DEFAULT_EXTENDED_FILTER false +#define DEFAULT_INTELLIGIBILITY_ENHANCER false +#define DEFAULT_EXPERIMENTAL_AGC false +#define DEFAULT_AGC_START_VOLUME 85 +#define DEFAULT_BEAMFORMING false +#define DEFAULT_TRACE false + +#define WEBRTC_AGC_MAX_VOLUME 255 + +static const char* const valid_modargs[] = { + "high_pass_filter", + "noise_suppression", + "analog_gain_control", + "digital_gain_control", + "mobile", + "routing_mode", + "comfort_noise", + "drift_compensation", + "voice_detection", + "extended_filter", + "intelligibility_enhancer", + "experimental_agc", + "agc_start_volume", + "beamforming", + "mic_geometry", /* documented in parse_mic_geometry() */ + "target_direction", /* documented in parse_mic_geometry() */ + "trace", + NULL +}; + +static int routing_mode_from_string(const char *rmode) { + if (pa_streq(rmode, "quiet-earpiece-or-headset")) + return webrtc::EchoControlMobile::kQuietEarpieceOrHeadset; + else if (pa_streq(rmode, "earpiece")) + return webrtc::EchoControlMobile::kEarpiece; + else if (pa_streq(rmode, "loud-earpiece")) + return webrtc::EchoControlMobile::kLoudEarpiece; + else if (pa_streq(rmode, "speakerphone")) + return webrtc::EchoControlMobile::kSpeakerphone; + else if (pa_streq(rmode, "loud-speakerphone")) + return webrtc::EchoControlMobile::kLoudSpeakerphone; + else + return -1; +} + +class PaWebrtcTraceCallback : public webrtc::TraceCallback { + void Print(webrtc::TraceLevel level, const char *message, int length) + { + if (level & webrtc::kTraceError || level & webrtc::kTraceCritical) + pa_log(message); + else if (level & webrtc::kTraceWarning) + pa_log_warn(message); + else if (level & webrtc::kTraceInfo) + pa_log_info(message); + else + pa_log_debug(message); + } +}; + +static int webrtc_volume_from_pa(pa_volume_t v) +{ + return (v * WEBRTC_AGC_MAX_VOLUME) / PA_VOLUME_NORM; +} + +static pa_volume_t webrtc_volume_to_pa(int v) +{ + return (v * PA_VOLUME_NORM) / WEBRTC_AGC_MAX_VOLUME; +} + +static void webrtc_ec_fixate_spec(pa_sample_spec *rec_ss, pa_channel_map *rec_map, + pa_sample_spec *play_ss, pa_channel_map *play_map, + pa_sample_spec *out_ss, pa_channel_map *out_map, + bool beamforming) +{ + rec_ss->format = PA_SAMPLE_FLOAT32NE; + play_ss->format = PA_SAMPLE_FLOAT32NE; + + /* AudioProcessing expects one of the following rates */ + if (rec_ss->rate >= 48000) + rec_ss->rate = 48000; + else if (rec_ss->rate >= 32000) + rec_ss->rate = 32000; + else if (rec_ss->rate >= 16000) + rec_ss->rate = 16000; + else + rec_ss->rate = 8000; + + *out_ss = *rec_ss; + *out_map = *rec_map; + + if (beamforming) { + /* The beamformer gives us a single channel */ + out_ss->channels = 1; + pa_channel_map_init_mono(out_map); + } + + /* Playback stream rate needs to be the same as capture */ + play_ss->rate = rec_ss->rate; +} + +static bool parse_point(const char **point, float (&f)[3]) { + int ret, length; + + ret = sscanf(*point, "%g,%g,%g%n", &f[0], &f[1], &f[2], &length); + if (ret != 3) + return false; + + /* Consume the bytes we've read so far */ + *point += length; + + return true; +} + +static bool parse_mic_geometry(const char **mic_geometry, std::vector& geometry) { + /* The microphone geometry is expressed as cartesian point form: + * x1,y1,z1,x2,y2,z2,... + * + * Where x1,y1,z1 is the position of the first microphone with regards to + * the array's "center", x2,y2,z2 the position of the second, and so on. + * + * 'x' is the horizontal coordinate, with positive values being to the + * right from the mic array's perspective. + * + * 'y' is the depth coordinate, with positive values being in front of the + * array. + * + * 'z' is the vertical coordinate, with positive values being above the + * array. + * + * All distances are in meters. + */ + + /* The target direction is expected to be in spherical point form: + * a,e,r + * + * Where 'a' is the azimuth of the target point relative to the center of + * the array, 'e' its elevation, and 'r' the radius. + * + * 0 radians azimuth is to the right of the array, and positive angles + * move in a counter-clockwise direction. + * + * 0 radians elevation is horizontal w.r.t. the array, and positive + * angles go upwards. + * + * radius is distance from the array center in meters. + */ + + long unsigned int i; + float f[3]; + + for (i = 0; i < geometry.size(); i++) { + if (!parse_point(mic_geometry, f)) { + pa_log("Failed to parse channel %lu in mic_geometry", i); + return false; + } + + /* Except for the last point, we should have a trailing comma */ + if (i != geometry.size() - 1) { + if (**mic_geometry != ',') { + pa_log("Failed to parse channel %lu in mic_geometry", i); + return false; + } + + (*mic_geometry)++; + } + + pa_log_debug("Got mic #%lu position: (%g, %g, %g)", i, f[0], f[1], f[2]); + + geometry[i].c[0] = f[0]; + geometry[i].c[1] = f[1]; + geometry[i].c[2] = f[2]; + } + + if (**mic_geometry != '\0') { + pa_log("Failed to parse mic_geometry value: more parameters than expected"); + return false; + } + + return true; +} + +bool pa_webrtc_ec_init(pa_core *c, pa_echo_canceller *ec, + pa_sample_spec *rec_ss, pa_channel_map *rec_map, + pa_sample_spec *play_ss, pa_channel_map *play_map, + pa_sample_spec *out_ss, pa_channel_map *out_map, + uint32_t *nframes, const char *args) { + webrtc::AudioProcessing *apm = NULL; + webrtc::ProcessingConfig pconfig; + webrtc::Config config; + bool hpf, ns, agc, dgc, mobile, cn, vad, ext_filter, intelligibility, experimental_agc, beamforming; + int rm = -1, i; + uint32_t agc_start_volume; + pa_modargs *ma; + bool trace = false; + + if (!(ma = pa_modargs_new(args, valid_modargs))) { + pa_log("Failed to parse submodule arguments."); + goto fail; + } + + hpf = DEFAULT_HIGH_PASS_FILTER; + if (pa_modargs_get_value_boolean(ma, "high_pass_filter", &hpf) < 0) { + pa_log("Failed to parse high_pass_filter value"); + goto fail; + } + + ns = DEFAULT_NOISE_SUPPRESSION; + if (pa_modargs_get_value_boolean(ma, "noise_suppression", &ns) < 0) { + pa_log("Failed to parse noise_suppression value"); + goto fail; + } + + agc = DEFAULT_ANALOG_GAIN_CONTROL; + if (pa_modargs_get_value_boolean(ma, "analog_gain_control", &agc) < 0) { + pa_log("Failed to parse analog_gain_control value"); + goto fail; + } + + dgc = agc ? false : DEFAULT_DIGITAL_GAIN_CONTROL; + if (pa_modargs_get_value_boolean(ma, "digital_gain_control", &dgc) < 0) { + pa_log("Failed to parse digital_gain_control value"); + goto fail; + } + + if (agc && dgc) { + pa_log("You must pick only one between analog and digital gain control"); + goto fail; + } + + mobile = DEFAULT_MOBILE; + if (pa_modargs_get_value_boolean(ma, "mobile", &mobile) < 0) { + pa_log("Failed to parse mobile value"); + goto fail; + } + + ec->params.drift_compensation = DEFAULT_DRIFT_COMPENSATION; + if (pa_modargs_get_value_boolean(ma, "drift_compensation", &ec->params.drift_compensation) < 0) { + pa_log("Failed to parse drift_compensation value"); + goto fail; + } + + if (mobile) { + if (ec->params.drift_compensation) { + pa_log("Can't use drift_compensation in mobile mode"); + goto fail; + } + + if ((rm = routing_mode_from_string(pa_modargs_get_value(ma, "routing_mode", DEFAULT_ROUTING_MODE))) < 0) { + pa_log("Failed to parse routing_mode value"); + goto fail; + } + + cn = DEFAULT_COMFORT_NOISE; + if (pa_modargs_get_value_boolean(ma, "comfort_noise", &cn) < 0) { + pa_log("Failed to parse cn value"); + goto fail; + } + } else { + if (pa_modargs_get_value(ma, "comfort_noise", NULL) || pa_modargs_get_value(ma, "routing_mode", NULL)) { + pa_log("The routing_mode and comfort_noise options are only valid with mobile=true"); + goto fail; + } + } + + vad = DEFAULT_VAD; + if (pa_modargs_get_value_boolean(ma, "voice_detection", &vad) < 0) { + pa_log("Failed to parse voice_detection value"); + goto fail; + } + + ext_filter = DEFAULT_EXTENDED_FILTER; + if (pa_modargs_get_value_boolean(ma, "extended_filter", &ext_filter) < 0) { + pa_log("Failed to parse extended_filter value"); + goto fail; + } + + intelligibility = DEFAULT_INTELLIGIBILITY_ENHANCER; + if (pa_modargs_get_value_boolean(ma, "intelligibility_enhancer", &intelligibility) < 0) { + pa_log("Failed to parse intelligibility_enhancer value"); + goto fail; + } + + experimental_agc = DEFAULT_EXPERIMENTAL_AGC; + if (pa_modargs_get_value_boolean(ma, "experimental_agc", &experimental_agc) < 0) { + pa_log("Failed to parse experimental_agc value"); + goto fail; + } + + agc_start_volume = DEFAULT_AGC_START_VOLUME; + if (pa_modargs_get_value_u32(ma, "agc_start_volume", &agc_start_volume) < 0) { + pa_log("Failed to parse agc_start_volume value"); + goto fail; + } + if (agc_start_volume > WEBRTC_AGC_MAX_VOLUME) { + pa_log("AGC start volume must not exceed %u", WEBRTC_AGC_MAX_VOLUME); + goto fail; + } + ec->params.webrtc.agc_start_volume = agc_start_volume; + + beamforming = DEFAULT_BEAMFORMING; + if (pa_modargs_get_value_boolean(ma, "beamforming", &beamforming) < 0) { + pa_log("Failed to parse beamforming value"); + goto fail; + } + + if (ext_filter) + config.Set(new webrtc::ExtendedFilter(true)); + if (intelligibility) + pa_log_warn("The intelligibility enhancer is not currently supported"); + if (experimental_agc) + config.Set(new webrtc::ExperimentalAgc(true, ec->params.webrtc.agc_start_volume)); + + trace = DEFAULT_TRACE; + if (pa_modargs_get_value_boolean(ma, "trace", &trace) < 0) { + pa_log("Failed to parse trace value"); + goto fail; + } + + if (trace) { + webrtc::Trace::CreateTrace(); + webrtc::Trace::set_level_filter(webrtc::kTraceAll); + ec->params.webrtc.trace_callback = new PaWebrtcTraceCallback(); + webrtc::Trace::SetTraceCallback((PaWebrtcTraceCallback *) ec->params.webrtc.trace_callback); + } + + webrtc_ec_fixate_spec(rec_ss, rec_map, play_ss, play_map, out_ss, out_map, beamforming); + + /* We do this after fixate because we need the capture channel count */ + if (beamforming) { + std::vector geometry(rec_ss->channels); + webrtc::SphericalPointf direction(0.0f, 0.0f, 0.0f); + const char *mic_geometry, *target_direction; + + if (!(mic_geometry = pa_modargs_get_value(ma, "mic_geometry", NULL))) { + pa_log("mic_geometry must be set if beamforming is enabled"); + goto fail; + } + + if (!parse_mic_geometry(&mic_geometry, geometry)) { + pa_log("Failed to parse mic_geometry value"); + goto fail; + } + + if ((target_direction = pa_modargs_get_value(ma, "target_direction", NULL))) { + float f[3]; + + if (!parse_point(&target_direction, f)) { + pa_log("Failed to parse target_direction value"); + goto fail; + } + + if (*target_direction != '\0') { + pa_log("Failed to parse target_direction value: more parameters than expected"); + goto fail; + } + +#define IS_ZERO(f) ((f) < 0.000001 && (f) > -0.000001) + + if (!IS_ZERO(f[1]) || !IS_ZERO(f[2])) { + pa_log("The beamformer currently only supports targeting along the azimuth"); + goto fail; + } + + direction.s[0] = f[0]; + direction.s[1] = f[1]; + direction.s[2] = f[2]; + } + + if (!target_direction) + config.Set(new webrtc::Beamforming(true, geometry)); + else + config.Set(new webrtc::Beamforming(true, geometry, direction)); + } + + apm = webrtc::AudioProcessing::Create(config); + + pconfig = { + webrtc::StreamConfig(rec_ss->rate, rec_ss->channels, false), /* input stream */ + webrtc::StreamConfig(out_ss->rate, out_ss->channels, false), /* output stream */ + webrtc::StreamConfig(play_ss->rate, play_ss->channels, false), /* reverse input stream */ + webrtc::StreamConfig(play_ss->rate, play_ss->channels, false), /* reverse output stream */ + }; + if (apm->Initialize(pconfig) != webrtc::AudioProcessing::kNoError) { + pa_log("Error initialising audio processing module"); + goto fail; + } + + if (hpf) + apm->high_pass_filter()->Enable(true); + + if (!mobile) { + apm->echo_cancellation()->enable_drift_compensation(ec->params.drift_compensation); + apm->echo_cancellation()->Enable(true); + } else { + apm->echo_control_mobile()->set_routing_mode(static_cast(rm)); + apm->echo_control_mobile()->enable_comfort_noise(cn); + apm->echo_control_mobile()->Enable(true); + } + + if (ns) { + apm->noise_suppression()->set_level(webrtc::NoiseSuppression::kHigh); + apm->noise_suppression()->Enable(true); + } + + if (agc || dgc) { + if (mobile && rm <= webrtc::EchoControlMobile::kEarpiece) { + /* Maybe this should be a knob, but we've got a lot of knobs already */ + apm->gain_control()->set_mode(webrtc::GainControl::kFixedDigital); + ec->params.webrtc.agc = false; + } else if (dgc) { + apm->gain_control()->set_mode(webrtc::GainControl::kAdaptiveDigital); + ec->params.webrtc.agc = false; + } else { + apm->gain_control()->set_mode(webrtc::GainControl::kAdaptiveAnalog); + if (apm->gain_control()->set_analog_level_limits(0, WEBRTC_AGC_MAX_VOLUME) != + webrtc::AudioProcessing::kNoError) { + pa_log("Failed to initialise AGC"); + goto fail; + } + ec->params.webrtc.agc = true; + } + + apm->gain_control()->Enable(true); + } + + if (vad) + apm->voice_detection()->Enable(true); + + ec->params.webrtc.apm = apm; + ec->params.webrtc.rec_ss = *rec_ss; + ec->params.webrtc.play_ss = *play_ss; + ec->params.webrtc.out_ss = *out_ss; + ec->params.webrtc.blocksize = (uint64_t) out_ss->rate * BLOCK_SIZE_US / PA_USEC_PER_SEC; + *nframes = ec->params.webrtc.blocksize; + ec->params.webrtc.first = true; + + for (i = 0; i < rec_ss->channels; i++) + ec->params.webrtc.rec_buffer[i] = pa_xnew(float, *nframes); + for (i = 0; i < play_ss->channels; i++) + ec->params.webrtc.play_buffer[i] = pa_xnew(float, *nframes); + + pa_modargs_free(ma); + return true; + +fail: + if (ma) + pa_modargs_free(ma); + if (ec->params.webrtc.trace_callback) { + webrtc::Trace::ReturnTrace(); + delete ((PaWebrtcTraceCallback *) ec->params.webrtc.trace_callback); + } if (apm) + delete apm; + + return false; +} + +void pa_webrtc_ec_play(pa_echo_canceller *ec, const uint8_t *play) { + webrtc::AudioProcessing *apm = (webrtc::AudioProcessing*)ec->params.webrtc.apm; + const pa_sample_spec *ss = &ec->params.webrtc.play_ss; + int n = ec->params.webrtc.blocksize; + float **buf = ec->params.webrtc.play_buffer; + webrtc::StreamConfig config(ss->rate, ss->channels, false); + + pa_deinterleave(play, (void **) buf, ss->channels, pa_sample_size(ss), n); + + pa_assert_se(apm->ProcessReverseStream(buf, config, config, buf) == webrtc::AudioProcessing::kNoError); + + /* FIXME: If ProcessReverseStream() makes any changes to the audio, such as + * applying intelligibility enhancement, those changes don't have any + * effect. This function is called at the source side, but the processing + * would have to be done in the sink to be able to feed the processed audio + * to speakers. */ +} + +void pa_webrtc_ec_record(pa_echo_canceller *ec, const uint8_t *rec, uint8_t *out) { + webrtc::AudioProcessing *apm = (webrtc::AudioProcessing*)ec->params.webrtc.apm; + const pa_sample_spec *rec_ss = &ec->params.webrtc.rec_ss; + const pa_sample_spec *out_ss = &ec->params.webrtc.out_ss; + float **buf = ec->params.webrtc.rec_buffer; + int n = ec->params.webrtc.blocksize; + int old_volume, new_volume; + webrtc::StreamConfig rec_config(rec_ss->rate, rec_ss->channels, false); + webrtc::StreamConfig out_config(out_ss->rate, out_ss->channels, false); + + pa_deinterleave(rec, (void **) buf, rec_ss->channels, pa_sample_size(rec_ss), n); + + if (ec->params.webrtc.agc) { + pa_volume_t v = pa_echo_canceller_get_capture_volume(ec); + old_volume = webrtc_volume_from_pa(v); + apm->gain_control()->set_stream_analog_level(old_volume); + } + + apm->set_stream_delay_ms(0); + pa_assert_se(apm->ProcessStream(buf, rec_config, out_config, buf) == webrtc::AudioProcessing::kNoError); + + if (ec->params.webrtc.agc) { + if (PA_UNLIKELY(ec->params.webrtc.first)) { + /* We start at a sane default volume (taken from the Chromium + * condition on the experimental AGC in audio_processing.h). This is + * needed to make sure that there's enough energy in the capture + * signal for the AGC to work */ + ec->params.webrtc.first = false; + new_volume = ec->params.webrtc.agc_start_volume; + } else { + new_volume = apm->gain_control()->stream_analog_level(); + } + + if (old_volume != new_volume) + pa_echo_canceller_set_capture_volume(ec, webrtc_volume_to_pa(new_volume)); + } + + pa_interleave((const void **) buf, out_ss->channels, out, pa_sample_size(out_ss), n); +} + +void pa_webrtc_ec_set_drift(pa_echo_canceller *ec, float drift) { + webrtc::AudioProcessing *apm = (webrtc::AudioProcessing*)ec->params.webrtc.apm; + + apm->echo_cancellation()->set_stream_drift_samples(drift * ec->params.webrtc.blocksize); +} + +void pa_webrtc_ec_run(pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *play, uint8_t *out) { + pa_webrtc_ec_play(ec, play); + pa_webrtc_ec_record(ec, rec, out); +} + +void pa_webrtc_ec_done(pa_echo_canceller *ec) { + int i; + + if (ec->params.webrtc.trace_callback) { + webrtc::Trace::ReturnTrace(); + delete ((PaWebrtcTraceCallback *) ec->params.webrtc.trace_callback); + } + + if (ec->params.webrtc.apm) { + delete (webrtc::AudioProcessing*)ec->params.webrtc.apm; + ec->params.webrtc.apm = NULL; + } + + for (i = 0; i < ec->params.webrtc.rec_ss.channels; i++) + pa_xfree(ec->params.webrtc.rec_buffer[i]); + for (i = 0; i < ec->params.webrtc.play_ss.channels; i++) + pa_xfree(ec->params.webrtc.play_buffer[i]); +} diff --git a/src/modules/gconf/gconf-helper.c b/src/modules/gconf/gconf-helper.c new file mode 100644 index 0000000..eccd073 --- /dev/null +++ b/src/modules/gconf/gconf-helper.c @@ -0,0 +1,133 @@ +/*** + This file is part of PulseAudio. + + Copyright 2006 Lennart Poettering + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include +#include + +#include + +#define PA_GCONF_ROOT "/system/pulseaudio" +#define PA_GCONF_PATH_MODULES PA_GCONF_ROOT"/modules" + +static void handle_module(GConfClient *client, const char *name) { + gchar p[1024]; + gboolean enabled, locked; + int i; + + pa_snprintf(p, sizeof(p), PA_GCONF_PATH_MODULES"/%s/locked", name); + locked = gconf_client_get_bool(client, p, FALSE); + + if (locked) + return; + + pa_snprintf(p, sizeof(p), PA_GCONF_PATH_MODULES"/%s/enabled", name); + enabled = gconf_client_get_bool(client, p, FALSE); + + printf("%c%s%c", enabled ? '+' : '-', name, 0); + + if (enabled) { + + for (i = 0; i < 10; i++) { + gchar *n, *a; + + pa_snprintf(p, sizeof(p), PA_GCONF_PATH_MODULES"/%s/name%i", name, i); + if (!(n = gconf_client_get_string(client, p, NULL)) || !*n) + break; + + pa_snprintf(p, sizeof(p), PA_GCONF_PATH_MODULES"/%s/args%i", name, i); + a = gconf_client_get_string(client, p, NULL); + + printf("%s%c%s%c", n, 0, a ? a : "", 0); + + g_free(n); + g_free(a); + } + + printf("%c", 0); + } + + fflush(stdout); +} + +static void modules_callback( + GConfClient* client, + guint cnxn_id, + GConfEntry *entry, + gpointer user_data) { + + const char *n; + char buf[128]; + + g_assert(strncmp(entry->key, PA_GCONF_PATH_MODULES"/", sizeof(PA_GCONF_PATH_MODULES)) == 0); + + n = entry->key + sizeof(PA_GCONF_PATH_MODULES); + + g_strlcpy(buf, n, sizeof(buf)); + buf[strcspn(buf, "/")] = 0; + + handle_module(client, buf); +} + +int main(int argc, char *argv[]) { + GMainLoop *g; + GConfClient *client; + GSList *modules, *m; + +#if !GLIB_CHECK_VERSION(2,36,0) + g_type_init(); +#endif + + if (!(client = gconf_client_get_default())) + goto fail; + + gconf_client_add_dir(client, PA_GCONF_ROOT, GCONF_CLIENT_PRELOAD_RECURSIVE, NULL); + gconf_client_notify_add(client, PA_GCONF_PATH_MODULES, modules_callback, NULL, NULL, NULL); + + modules = gconf_client_all_dirs(client, PA_GCONF_PATH_MODULES, NULL); + + for (m = modules; m; m = m->next) { + char *e = strrchr(m->data, '/'); + handle_module(client, e ? e+1 : m->data); + } + + g_slist_free(modules); + + /* Signal the parent that we are now initialized */ + printf("!"); + fflush(stdout); + + g = g_main_loop_new(NULL, FALSE); + g_main_loop_run(g); + g_main_loop_unref(g); + + g_object_unref(G_OBJECT(client)); + + return 0; + +fail: + return 1; +} diff --git a/src/modules/gconf/module-gconf.c b/src/modules/gconf/module-gconf.c new file mode 100644 index 0000000..76a1f19 --- /dev/null +++ b/src/modules/gconf/module-gconf.c @@ -0,0 +1,114 @@ +/*** + This file is part of PulseAudio. + + Copyright 2006 Lennart Poettering + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include +#include +#include + +#include "../stdin-util.h" + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("GConf Adapter"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(true); + +int pa__init(pa_module*m) { + struct userdata *u; + int r; + + u = pa_xnew(struct userdata, 1); + u->core = m->core; + u->module = m; + m->userdata = u; + u->module_infos = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, (pa_free_cb_t) module_info_free); + u->pid = (pid_t) -1; + u->fd = -1; + u->fd_type = 0; + u->io_event = NULL; + u->buf_fill = 0; + + if ((u->fd = pa_start_child_for_read( +#if defined(__linux__) && defined(HAVE_RUNNING_FROM_BUILD_TREE) + pa_run_from_build_tree() ? PA_BUILDDIR "/gconf-helper" : +#endif + PA_GCONF_HELPER, NULL, &u->pid)) < 0) + goto fail; + + u->io_event = m->core->mainloop->io_new( + m->core->mainloop, + u->fd, + PA_IO_EVENT_INPUT, + io_event_cb, + u); + + do { + if ((r = handle_event(u)) < 0) + goto fail; + + /* Read until the client signalled us that it is ready with + * initialization */ + } while (r != 1); + + return 0; + +fail: + pa__done(m); + return -1; +} + +void pa__done(pa_module*m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->pid != (pid_t) -1) { + kill(u->pid, SIGTERM); + + for (;;) { + if (waitpid(u->pid, NULL, 0) >= 0) + break; + + if (errno != EINTR) { + pa_log("waitpid() failed: %s", pa_cstrerror(errno)); + break; + } + } + } + + if (u->io_event) + m->core->mainloop->io_free(u->io_event); + + if (u->fd >= 0) + pa_close(u->fd); + + if (u->module_infos) + pa_hashmap_free(u->module_infos); + + pa_xfree(u); +} diff --git a/src/modules/gsettings/gsettings-helper.c b/src/modules/gsettings/gsettings-helper.c new file mode 100644 index 0000000..1bf2f13 --- /dev/null +++ b/src/modules/gsettings/gsettings-helper.c @@ -0,0 +1,134 @@ +/*** + This file is part of PulseAudio. + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include +#include + +#include + +#define PA_GSETTINGS_MODULE_GROUP_SCHEMA "org.freedesktop.pulseaudio.module-group" +#define PA_GSETTINGS_MODULE_GROUPS_SCHEMA "org.freedesktop.pulseaudio.module-groups" +#define PA_GSETTINGS_MODULE_GROUPS_PATH "/org/freedesktop/pulseaudio/module-groups/" + +static void handle_module_group(gchar *name) { + GSettings *settings; + gchar p[1024]; + gboolean enabled; + int i; + + pa_snprintf(p, sizeof(p), PA_GSETTINGS_MODULE_GROUPS_PATH"%s/", name); + + if (!(settings = g_settings_new_with_path(PA_GSETTINGS_MODULE_GROUP_SCHEMA, + p))) + return; + + enabled = g_settings_get_boolean(settings, "enabled"); + + printf("%c%s%c", enabled ? '+' : '-', name, 0); + + if (enabled) { + for (i = 0; i < 10; i++) { + gchar *n, *a; + + pa_snprintf(p, sizeof(p), "name%d", i); + n = g_settings_get_string(settings, p); + + pa_snprintf(p, sizeof(p), "args%i", i); + a = g_settings_get_string(settings, p); + + printf("%s%c%s%c", n, 0, a, 0); + + g_free(n); + g_free(a); + } + + printf("%c", 0); + } + + fflush(stdout); + + g_object_unref(G_OBJECT(settings)); +} + +static void module_group_callback(GSettings *settings, gchar *key, gpointer user_data) { + handle_module_group(user_data); +} + +int main(int argc, char *argv[]) { + GMainLoop *g; + GSettings *settings; + GPtrArray *groups; + gchar **group_names, **name; + +#if !GLIB_CHECK_VERSION(2,36,0) + g_type_init(); +#endif + + /* gsettings-data-convert copies data from GConf to GSettings. The + * conversion is defined in the pulseaudio.convert file. The conversion is + * done only once, so running the command every time gsettings-helper + * starts is safe. */ + g_spawn_command_line_sync("gsettings-data-convert", NULL, NULL, NULL, NULL); + + if (!(settings = g_settings_new(PA_GSETTINGS_MODULE_GROUPS_SCHEMA))) + goto fail; + + groups = g_ptr_array_new_full(0, g_object_unref); + group_names = g_settings_list_children(settings); + + for (name = group_names; *name; name++) { + GSettings *child = g_settings_get_child(settings, *name); + + /* The child may have been removed between the + * g_settings_list_children() and g_settings_get_child() calls. */ + if (!child) + continue; + + g_ptr_array_add(groups, child); + g_signal_connect(child, "changed", (GCallback) module_group_callback, *name); + handle_module_group(*name); + } + + /* Signal the parent that we are now initialized */ + printf("!"); + fflush(stdout); + + g = g_main_loop_new(NULL, FALSE); + g_main_loop_run(g); + g_main_loop_unref(g); + + g_ptr_array_unref(groups); + + /* group_names can't be freed earlier, because the values are being used as + * the user_data for module_group_callback(). */ + g_strfreev(group_names); + + g_object_unref(G_OBJECT(settings)); + + return 0; + +fail: + return 1; +} diff --git a/src/modules/gsettings/meson.build b/src/modules/gsettings/meson.build new file mode 100644 index 0000000..68a72c3 --- /dev/null +++ b/src/modules/gsettings/meson.build @@ -0,0 +1,38 @@ +# GSettings helper + +gsettings_helper_sources = [ + 'gsettings-helper.c', +] + +gsettings_helper = executable('gsettings-helper', + gsettings_helper_sources, + c_args : pa_c_args, + include_directories : [configinc, topinc], + link_with : [libpulsecommon, libpulse], + dependencies : [gio_dep], + install_dir : pulselibexecdir, + install_rpath : privlibdir, + install : true, +) + +# GSettings schemas + +compile_schemas = find_program('glib-compile-schemas', required : false) +if compile_schemas.found() + test('Validate schema files in ' + meson.current_source_dir(), + compile_schemas, + args: ['--strict', '--dry-run', meson.current_source_dir()] + ) +endif + +install_data('org.freedesktop.pulseaudio.gschema.xml', + install_dir : join_paths(datadir, 'glib-2.0', 'schemas') +) + +meson.add_install_script('meson_post_install.py', datadir) + +# Conversion from GConf to GSettings + +install_data('pulseaudio.convert', + install_dir : join_paths(datadir, 'GConf', 'gsettings') +) diff --git a/src/modules/gsettings/meson_post_install.py b/src/modules/gsettings/meson_post_install.py new file mode 100644 index 0000000..0ddb70d --- /dev/null +++ b/src/modules/gsettings/meson_post_install.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 + +import os +import subprocess +import sys + +datadir = sys.argv[1] + +# Package managers set this so we don't need to run +if not os.environ.get('DESTDIR'): + schemadir = os.path.join(datadir, 'glib-2.0', 'schemas') + print('Compiling gsettings schemas...') + subprocess.call(['glib-compile-schemas', schemadir]) + diff --git a/src/modules/gsettings/module-gsettings.c b/src/modules/gsettings/module-gsettings.c new file mode 100644 index 0000000..0822093 --- /dev/null +++ b/src/modules/gsettings/module-gsettings.c @@ -0,0 +1,118 @@ +/*** + This file is part of PulseAudio. + + Copyright 2006 Lennart Poettering + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include +#include +#include + +#include "../stdin-util.h" + +PA_MODULE_AUTHOR("Sylvain Baubeau"); +PA_MODULE_DESCRIPTION("GSettings Adapter"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(true); + +int pa__init(pa_module*m) { + struct userdata *u; + int r; + + u = pa_xnew(struct userdata, 1); + u->core = m->core; + u->module = m; + m->userdata = u; + u->module_infos = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, (pa_free_cb_t) module_info_free); + u->pid = (pid_t) -1; + u->fd = -1; + u->fd_type = 0; + u->io_event = NULL; + u->buf_fill = 0; + + if ((u->fd = pa_start_child_for_read( +#if defined(__linux__) && defined(HAVE_RUNNING_FROM_BUILD_TREE) +#ifdef MESON_BUILD + pa_run_from_build_tree() ? PA_BUILDDIR PA_PATH_SEP "src" PA_PATH_SEP "modules" PA_PATH_SEP "gsettings" PA_PATH_SEP "gsettings-helper" : +#else + pa_run_from_build_tree() ? PA_BUILDDIR "/gsettings-helper" : +#endif +#endif + PA_GSETTINGS_HELPER, NULL, &u->pid)) < 0) + goto fail; + + u->io_event = m->core->mainloop->io_new( + m->core->mainloop, + u->fd, + PA_IO_EVENT_INPUT, + io_event_cb, + u); + + do { + if ((r = handle_event(u)) < 0) + goto fail; + + /* Read until the client signalled us that it is ready with + * initialization */ + } while (r != 1); + + return 0; + +fail: + pa__done(m); + return -1; +} + +void pa__done(pa_module*m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->pid != (pid_t) -1) { + kill(u->pid, SIGTERM); + + for (;;) { + if (waitpid(u->pid, NULL, 0) >= 0) + break; + + if (errno != EINTR) { + pa_log("waitpid() failed: %s", pa_cstrerror(errno)); + break; + } + } + } + + if (u->io_event) + m->core->mainloop->io_free(u->io_event); + + if (u->fd >= 0) + pa_close(u->fd); + + if (u->module_infos) + pa_hashmap_free(u->module_infos); + + pa_xfree(u); +} diff --git a/src/modules/gsettings/org.freedesktop.pulseaudio.gschema.xml b/src/modules/gsettings/org.freedesktop.pulseaudio.gschema.xml new file mode 100644 index 0000000..9d06383 --- /dev/null +++ b/src/modules/gsettings/org.freedesktop.pulseaudio.gschema.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + '' + Module group name + Module group name + + + + false + + + + false + + + + '' + + + + '' + + + + '' + + + + '' + + + + '' + + + + '' + + + + '' + + + + '' + + + + '' + + + + '' + + + + '' + + + + '' + + + + '' + + + + '' + + + + '' + + + + '' + + + + '' + + + + '' + + + + '' + + + + '' + + + + diff --git a/src/modules/gsettings/pulseaudio.convert b/src/modules/gsettings/pulseaudio.convert new file mode 100644 index 0000000..d9268bf --- /dev/null +++ b/src/modules/gsettings/pulseaudio.convert @@ -0,0 +1,160 @@ +[org.freedesktop.pulseaudio.module-group:/org/freedesktop/pulseaudio/module-groups/combine/] +args0 = /system/pulseaudio/modules/combine/args0 +args1 = /system/pulseaudio/modules/combine/args1 +args2 = /system/pulseaudio/modules/combine/args2 +args3 = /system/pulseaudio/modules/combine/args3 +args4 = /system/pulseaudio/modules/combine/args4 +args5 = /system/pulseaudio/modules/combine/args5 +args6 = /system/pulseaudio/modules/combine/args6 +args7 = /system/pulseaudio/modules/combine/args7 +args8 = /system/pulseaudio/modules/combine/args8 +args9 = /system/pulseaudio/modules/combine/args9 +name0 = /system/pulseaudio/modules/combine/name0 +name1 = /system/pulseaudio/modules/combine/name1 +name2 = /system/pulseaudio/modules/combine/name2 +name3 = /system/pulseaudio/modules/combine/name3 +name4 = /system/pulseaudio/modules/combine/name4 +name5 = /system/pulseaudio/modules/combine/name5 +name6 = /system/pulseaudio/modules/combine/name6 +name7 = /system/pulseaudio/modules/combine/name7 +name8 = /system/pulseaudio/modules/combine/name8 +name9 = /system/pulseaudio/modules/combine/name9 +enabled = /system/pulseaudio/modules/combine/enabled + +[org.freedesktop.pulseaudio.module-group:/org/freedesktop/pulseaudio/module-groups/remote-access/] +args0 = /system/pulseaudio/modules/remote-access/args0 +args1 = /system/pulseaudio/modules/remote-access/args1 +args2 = /system/pulseaudio/modules/remote-access/args2 +args3 = /system/pulseaudio/modules/remote-access/args3 +args4 = /system/pulseaudio/modules/remote-access/args4 +args5 = /system/pulseaudio/modules/remote-access/args5 +args6 = /system/pulseaudio/modules/remote-access/args6 +args7 = /system/pulseaudio/modules/remote-access/args7 +args8 = /system/pulseaudio/modules/remote-access/args8 +args9 = /system/pulseaudio/modules/remote-access/args9 +name0 = /system/pulseaudio/modules/remote-access/name0 +name1 = /system/pulseaudio/modules/remote-access/name1 +name2 = /system/pulseaudio/modules/remote-access/name2 +name3 = /system/pulseaudio/modules/remote-access/name3 +name4 = /system/pulseaudio/modules/remote-access/name4 +name5 = /system/pulseaudio/modules/remote-access/name5 +name6 = /system/pulseaudio/modules/remote-access/name6 +name7 = /system/pulseaudio/modules/remote-access/name7 +name8 = /system/pulseaudio/modules/remote-access/name8 +name9 = /system/pulseaudio/modules/remote-access/name9 +enabled = /system/pulseaudio/modules/remote-access/enabled + +[org.freedesktop.pulseaudio.module-group:/org/freedesktop/pulseaudio/module-groups/zeroconf-discover/] +args0 = /system/pulseaudio/modules/zeroconf-discover/args0 +args1 = /system/pulseaudio/modules/zeroconf-discover/args1 +args2 = /system/pulseaudio/modules/zeroconf-discover/args2 +args3 = /system/pulseaudio/modules/zeroconf-discover/args3 +args4 = /system/pulseaudio/modules/zeroconf-discover/args4 +args5 = /system/pulseaudio/modules/zeroconf-discover/args5 +args6 = /system/pulseaudio/modules/zeroconf-discover/args6 +args7 = /system/pulseaudio/modules/zeroconf-discover/args7 +args8 = /system/pulseaudio/modules/zeroconf-discover/args8 +args9 = /system/pulseaudio/modules/zeroconf-discover/args9 +name0 = /system/pulseaudio/modules/zeroconf-discover/name0 +name1 = /system/pulseaudio/modules/zeroconf-discover/name1 +name2 = /system/pulseaudio/modules/zeroconf-discover/name2 +name3 = /system/pulseaudio/modules/zeroconf-discover/name3 +name4 = /system/pulseaudio/modules/zeroconf-discover/name4 +name5 = /system/pulseaudio/modules/zeroconf-discover/name5 +name6 = /system/pulseaudio/modules/zeroconf-discover/name6 +name7 = /system/pulseaudio/modules/zeroconf-discover/name7 +name8 = /system/pulseaudio/modules/zeroconf-discover/name8 +name9 = /system/pulseaudio/modules/zeroconf-discover/name9 +enabled = /system/pulseaudio/modules/zeroconf-discover/enabled + +[org.freedesktop.pulseaudio.module-group:/org/freedesktop/pulseaudio/module-groups/raop-discover/] +args0 = /system/pulseaudio/modules/raop-discover/args0 +args1 = /system/pulseaudio/modules/raop-discover/args1 +args2 = /system/pulseaudio/modules/raop-discover/args2 +args3 = /system/pulseaudio/modules/raop-discover/args3 +args4 = /system/pulseaudio/modules/raop-discover/args4 +args5 = /system/pulseaudio/modules/raop-discover/args5 +args6 = /system/pulseaudio/modules/raop-discover/args6 +args7 = /system/pulseaudio/modules/raop-discover/args7 +args8 = /system/pulseaudio/modules/raop-discover/args8 +args9 = /system/pulseaudio/modules/raop-discover/args9 +name0 = /system/pulseaudio/modules/raop-discover/name0 +name1 = /system/pulseaudio/modules/raop-discover/name1 +name2 = /system/pulseaudio/modules/raop-discover/name2 +name3 = /system/pulseaudio/modules/raop-discover/name3 +name4 = /system/pulseaudio/modules/raop-discover/name4 +name5 = /system/pulseaudio/modules/raop-discover/name5 +name6 = /system/pulseaudio/modules/raop-discover/name6 +name7 = /system/pulseaudio/modules/raop-discover/name7 +name8 = /system/pulseaudio/modules/raop-discover/name8 +name9 = /system/pulseaudio/modules/raop-discover/name9 +enabled = /system/pulseaudio/modules/raop-discover/enabled + +[org.freedesktop.pulseaudio.module-group:/org/freedesktop/pulseaudio/module-groups/rtp-recv/] +args0 = /system/pulseaudio/modules/rtp-recv/args0 +args1 = /system/pulseaudio/modules/rtp-recv/args1 +args2 = /system/pulseaudio/modules/rtp-recv/args2 +args3 = /system/pulseaudio/modules/rtp-recv/args3 +args4 = /system/pulseaudio/modules/rtp-recv/args4 +args5 = /system/pulseaudio/modules/rtp-recv/args5 +args6 = /system/pulseaudio/modules/rtp-recv/args6 +args7 = /system/pulseaudio/modules/rtp-recv/args7 +args8 = /system/pulseaudio/modules/rtp-recv/args8 +args9 = /system/pulseaudio/modules/rtp-recv/args9 +name0 = /system/pulseaudio/modules/rtp-recv/name0 +name1 = /system/pulseaudio/modules/rtp-recv/name1 +name2 = /system/pulseaudio/modules/rtp-recv/name2 +name3 = /system/pulseaudio/modules/rtp-recv/name3 +name4 = /system/pulseaudio/modules/rtp-recv/name4 +name5 = /system/pulseaudio/modules/rtp-recv/name5 +name6 = /system/pulseaudio/modules/rtp-recv/name6 +name7 = /system/pulseaudio/modules/rtp-recv/name7 +name8 = /system/pulseaudio/modules/rtp-recv/name8 +name9 = /system/pulseaudio/modules/rtp-recv/name9 +enabled = /system/pulseaudio/modules/rtp-recv/enabled + +[org.freedesktop.pulseaudio.module-group:/org/freedesktop/pulseaudio/module-groups/rtp-send/] +args0 = /system/pulseaudio/modules/rtp-send/args0 +args1 = /system/pulseaudio/modules/rtp-send/args1 +args2 = /system/pulseaudio/modules/rtp-send/args2 +args3 = /system/pulseaudio/modules/rtp-send/args3 +args4 = /system/pulseaudio/modules/rtp-send/args4 +args5 = /system/pulseaudio/modules/rtp-send/args5 +args6 = /system/pulseaudio/modules/rtp-send/args6 +args7 = /system/pulseaudio/modules/rtp-send/args7 +args8 = /system/pulseaudio/modules/rtp-send/args8 +args9 = /system/pulseaudio/modules/rtp-send/args9 +name0 = /system/pulseaudio/modules/rtp-send/name0 +name1 = /system/pulseaudio/modules/rtp-send/name1 +name2 = /system/pulseaudio/modules/rtp-send/name2 +name3 = /system/pulseaudio/modules/rtp-send/name3 +name4 = /system/pulseaudio/modules/rtp-send/name4 +name5 = /system/pulseaudio/modules/rtp-send/name5 +name6 = /system/pulseaudio/modules/rtp-send/name6 +name7 = /system/pulseaudio/modules/rtp-send/name7 +name8 = /system/pulseaudio/modules/rtp-send/name8 +name9 = /system/pulseaudio/modules/rtp-send/name9 +enabled = /system/pulseaudio/modules/rtp-send/enabled + +[org.freedesktop.pulseaudio.module-group:/org/freedesktop/pulseaudio/module-groups/upnp-media-server/] +args0 = /system/pulseaudio/modules/upnp-media-server/args0 +args1 = /system/pulseaudio/modules/upnp-media-server/args1 +args2 = /system/pulseaudio/modules/upnp-media-server/args2 +args3 = /system/pulseaudio/modules/upnp-media-server/args3 +args4 = /system/pulseaudio/modules/upnp-media-server/args4 +args5 = /system/pulseaudio/modules/upnp-media-server/args5 +args6 = /system/pulseaudio/modules/upnp-media-server/args6 +args7 = /system/pulseaudio/modules/upnp-media-server/args7 +args8 = /system/pulseaudio/modules/upnp-media-server/args8 +args9 = /system/pulseaudio/modules/upnp-media-server/args9 +name0 = /system/pulseaudio/modules/upnp-media-server/name0 +name1 = /system/pulseaudio/modules/upnp-media-server/name1 +name2 = /system/pulseaudio/modules/upnp-media-server/name2 +name3 = /system/pulseaudio/modules/upnp-media-server/name3 +name4 = /system/pulseaudio/modules/upnp-media-server/name4 +name5 = /system/pulseaudio/modules/upnp-media-server/name5 +name6 = /system/pulseaudio/modules/upnp-media-server/name6 +name7 = /system/pulseaudio/modules/upnp-media-server/name7 +name8 = /system/pulseaudio/modules/upnp-media-server/name8 +name9 = /system/pulseaudio/modules/upnp-media-server/name9 +enabled = /system/pulseaudio/modules/upnp-media-server/enabled diff --git a/src/modules/jack/module-jack-sink.c b/src/modules/jack/module-jack-sink.c new file mode 100644 index 0000000..effa0dd --- /dev/null +++ b/src/modules/jack/module-jack-sink.c @@ -0,0 +1,525 @@ +/*** + This file is part of PulseAudio. + + Copyright 2006 Lennart Poettering + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* General overview: + * + * Because JACK has a very inflexible event loop management which + * doesn't allow us to add our own event sources to the event thread + * we cannot use the JACK real-time thread for dispatching our PA + * work. Instead, we run an additional RT thread which does most of + * the PA handling, and have the JACK RT thread request data from it + * via pa_asyncmsgq. The cost is an additional context switch which + * should hopefully not be that expensive if RT scheduling is + * enabled. A better fix would only be possible with additional event + * source support in JACK. + */ + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("JACK Sink"); +PA_MODULE_LOAD_ONCE(false); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_USAGE( + "sink_name= " + "sink_properties= " + "server_name= " + "client_name= " + "channels= " + "channel_map= " + "connect="); + +#define DEFAULT_SINK_NAME "jack_out" + +struct userdata { + pa_core *core; + pa_module *module; + pa_sink *sink; + + unsigned channels; + + jack_port_t* port[PA_CHANNELS_MAX]; + jack_client_t *client; + + void *buffer[PA_CHANNELS_MAX]; + + pa_thread_mq thread_mq; + pa_asyncmsgq *jack_msgq; + pa_rtpoll *rtpoll; + pa_rtpoll_item *rtpoll_item; + + pa_thread *thread; + + jack_nframes_t frames_in_buffer; + jack_nframes_t saved_frame_time; + bool saved_frame_time_valid; +}; + +static const char* const valid_modargs[] = { + "sink_name", + "sink_properties", + "server_name", + "client_name", + "channels", + "channel_map", + "connect", + NULL +}; + +enum { + SINK_MESSAGE_RENDER = PA_SINK_MESSAGE_MAX, + SINK_MESSAGE_BUFFER_SIZE, + SINK_MESSAGE_ON_SHUTDOWN +}; + +static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *memchunk) { + struct userdata *u = PA_SINK(o)->userdata; + + switch (code) { + + case SINK_MESSAGE_RENDER: + + /* Handle the request from the JACK thread */ + + if (u->sink->thread_info.state == PA_SINK_RUNNING) { + pa_memchunk chunk; + size_t nbytes; + void *p; + + pa_assert(offset > 0); + nbytes = (size_t) offset * pa_frame_size(&u->sink->sample_spec); + + pa_sink_render_full(u->sink, nbytes, &chunk); + + p = pa_memblock_acquire_chunk(&chunk); + pa_deinterleave(p, u->buffer, u->channels, sizeof(float), (unsigned) offset); + pa_memblock_release(chunk.memblock); + + pa_memblock_unref(chunk.memblock); + } else { + unsigned c; + pa_sample_spec ss; + + /* Humm, we're not RUNNING, hence let's write some silence */ + /* This can happen if we're paused, or during shutdown (when we're unlinked but jack is still running). */ + + ss = u->sink->sample_spec; + ss.channels = 1; + + for (c = 0; c < u->channels; c++) + pa_silence_memory(u->buffer[c], (size_t) offset * pa_sample_size(&ss), &ss); + } + + u->frames_in_buffer = (jack_nframes_t) offset; + u->saved_frame_time = * (jack_nframes_t*) data; + u->saved_frame_time_valid = true; + + return 0; + + case SINK_MESSAGE_BUFFER_SIZE: + pa_sink_set_max_request_within_thread(u->sink, (size_t) offset * pa_frame_size(&u->sink->sample_spec)); + return 0; + + case SINK_MESSAGE_ON_SHUTDOWN: + pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL); + return 0; + + case PA_SINK_MESSAGE_GET_LATENCY: { + jack_nframes_t ft, d; + jack_latency_range_t r; + size_t n; + int32_t number_of_frames; + + /* This is the "worst-case" latency */ + jack_port_get_latency_range(u->port[0], JackPlaybackLatency, &r); + number_of_frames = r.max + u->frames_in_buffer; + + if (u->saved_frame_time_valid) { + /* Adjust the worst case latency by the time that + * passed since we last handed data to JACK */ + + ft = jack_frame_time(u->client); + d = ft > u->saved_frame_time ? ft - u->saved_frame_time : 0; + number_of_frames -= d; + } + + /* Convert it to usec */ + if (number_of_frames > 0) { + n = number_of_frames * pa_frame_size(&u->sink->sample_spec); + *((int64_t*) data) = pa_bytes_to_usec(n, &u->sink->sample_spec); + } else { + n = - number_of_frames * pa_frame_size(&u->sink->sample_spec); + *((int64_t*) data) = - (int64_t)pa_bytes_to_usec(n, &u->sink->sample_spec); + } + + return 0; + } + + } + + return pa_sink_process_msg(o, code, data, offset, memchunk); +} + +/* JACK Callback: This is called when JACK needs some data */ +static int jack_process(jack_nframes_t nframes, void *arg) { + struct userdata *u = arg; + unsigned c; + jack_nframes_t frame_time; + pa_assert(u); + + /* We just forward the request to our other RT thread */ + + for (c = 0; c < u->channels; c++) + pa_assert_se(u->buffer[c] = jack_port_get_buffer(u->port[c], nframes)); + + frame_time = jack_frame_time(u->client); + + pa_assert_se(pa_asyncmsgq_send(u->jack_msgq, PA_MSGOBJECT(u->sink), SINK_MESSAGE_RENDER, &frame_time, nframes, NULL) == 0); + return 0; +} + +static void thread_func(void *userdata) { + struct userdata *u = userdata; + + pa_assert(u); + + pa_log_debug("Thread starting up"); + + if (u->core->realtime_scheduling) + pa_thread_make_realtime(u->core->realtime_priority); + + pa_thread_mq_install(&u->thread_mq); + + for (;;) { + int ret; + + if (PA_UNLIKELY(u->sink->thread_info.rewind_requested)) + pa_sink_process_rewind(u->sink, 0); + + if ((ret = pa_rtpoll_run(u->rtpoll)) < 0) + goto fail; + + if (ret == 0) + goto finish; + } + +fail: + /* If this was no regular exit from the loop we have to continue + * processing messages until we received PA_MESSAGE_SHUTDOWN */ + pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL); + pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN); + +finish: + pa_log_debug("Thread shutting down"); +} + +/* JACK Callback: This is called when JACK triggers an error */ +static void jack_error_func(const char*t) { + char *s; + + s = pa_xstrndup(t, strcspn(t, "\n\r")); + pa_log_warn("JACK error >%s<", s); + pa_xfree(s); +} + +/* JACK Callback: This is called when JACK is set up */ +static void jack_init(void *arg) { + struct userdata *u = arg; + + pa_log_info("JACK thread starting up."); + + if (u->core->realtime_scheduling) + pa_thread_make_realtime(u->core->realtime_priority+4); +} + +/* JACK Callback: This is called when JACK kicks us */ +static void jack_shutdown(void* arg) { + struct userdata *u = arg; + + pa_log_info("JACK thread shutting down."); + pa_asyncmsgq_post(u->jack_msgq, PA_MSGOBJECT(u->sink), SINK_MESSAGE_ON_SHUTDOWN, NULL, 0, NULL, NULL); +} + +/* JACK Callback: This is called when JACK changes the buffer size */ +static int jack_buffer_size(jack_nframes_t nframes, void *arg) { + struct userdata *u = arg; + + pa_log_info("JACK buffer size changed."); + pa_asyncmsgq_post(u->jack_msgq, PA_MSGOBJECT(u->sink), SINK_MESSAGE_BUFFER_SIZE, NULL, nframes, NULL, NULL); + return 0; +} + +int pa__init(pa_module*m) { + struct userdata *u = NULL; + pa_sample_spec ss; + pa_channel_map map; + pa_modargs *ma = NULL; + jack_status_t status; + const char *server_name, *client_name; + uint32_t channels = 0; + bool do_connect = true; + unsigned i; + const char **ports = NULL, **p; + pa_sink_new_data data; + jack_latency_range_t r; + size_t n; + + pa_assert(m); + + jack_set_error_function(jack_error_func); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments."); + goto fail; + } + + if (pa_modargs_get_value_boolean(ma, "connect", &do_connect) < 0) { + pa_log("Failed to parse connect= argument."); + goto fail; + } + + server_name = pa_modargs_get_value(ma, "server_name", NULL); + client_name = pa_modargs_get_value(ma, "client_name", "PulseAudio JACK Sink"); + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + u->saved_frame_time_valid = false; + u->rtpoll = pa_rtpoll_new(); + + if (pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll) < 0) { + pa_log("pa_thread_mq_init() failed."); + goto fail; + } + + /* The queue linking the JACK thread and our RT thread */ + u->jack_msgq = pa_asyncmsgq_new(0); + if (!u->jack_msgq) { + pa_log("pa_asyncmsgq_new() failed."); + goto fail; + } + + /* The msgq from the JACK RT thread should have an even higher + * priority than the normal message queues, to match the guarantee + * all other drivers make: supplying the audio device with data is + * the top priority -- and as long as that is possible we don't do + * anything else */ + u->rtpoll_item = pa_rtpoll_item_new_asyncmsgq_read(u->rtpoll, PA_RTPOLL_EARLY-1, u->jack_msgq); + + if (!(u->client = jack_client_open(client_name, server_name ? JackServerName : JackNullOption, &status, server_name))) { + pa_log("jack_client_open() failed."); + goto fail; + } + + ports = jack_get_ports(u->client, NULL, JACK_DEFAULT_AUDIO_TYPE, JackPortIsPhysical|JackPortIsInput); + + channels = 0; + if (ports) + for (p = ports; *p; p++) + channels++; + + if (!channels) + channels = m->core->default_sample_spec.channels; + + if (pa_modargs_get_value_u32(ma, "channels", &channels) < 0 || + !pa_channels_valid(channels)) { + pa_log("Failed to parse channels= argument."); + goto fail; + } + + if (channels == m->core->default_channel_map.channels) + map = m->core->default_channel_map; + else + pa_channel_map_init_extend(&map, channels, PA_CHANNEL_MAP_ALSA); + + if (pa_modargs_get_channel_map(ma, NULL, &map) < 0 || map.channels != channels) { + pa_log("Failed to parse channel_map= argument."); + goto fail; + } + + pa_log_info("Successfully connected as '%s'", jack_get_client_name(u->client)); + + u->channels = ss.channels = (uint8_t) channels; + ss.rate = jack_get_sample_rate(u->client); + ss.format = PA_SAMPLE_FLOAT32NE; + + pa_assert(pa_sample_spec_valid(&ss)); + + for (i = 0; i < ss.channels; i++) { + if (!(u->port[i] = jack_port_register(u->client, pa_channel_position_to_string(map.map[i]), JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput|JackPortIsTerminal, 0))) { + pa_log("jack_port_register() failed."); + goto fail; + } + } + + pa_sink_new_data_init(&data); + data.driver = __FILE__; + data.module = m; + pa_sink_new_data_set_name(&data, pa_modargs_get_value(ma, "sink_name", DEFAULT_SINK_NAME)); + pa_sink_new_data_set_sample_spec(&data, &ss); + pa_sink_new_data_set_channel_map(&data, &map); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_API, "jack"); + if (server_name) + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, server_name); + pa_proplist_setf(data.proplist, PA_PROP_DEVICE_DESCRIPTION, "Jack sink (%s)", jack_get_client_name(u->client)); + pa_proplist_sets(data.proplist, "jack.client_name", jack_get_client_name(u->client)); + + if (pa_modargs_get_proplist(ma, "sink_properties", data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_sink_new_data_done(&data); + goto fail; + } + + u->sink = pa_sink_new(m->core, &data, PA_SINK_LATENCY); + pa_sink_new_data_done(&data); + + if (!u->sink) { + pa_log("Failed to create sink."); + goto fail; + } + + u->sink->parent.process_msg = sink_process_msg; + u->sink->userdata = u; + + pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq); + pa_sink_set_rtpoll(u->sink, u->rtpoll); + pa_sink_set_max_request(u->sink, jack_get_buffer_size(u->client) * pa_frame_size(&u->sink->sample_spec)); + + jack_set_process_callback(u->client, jack_process, u); + jack_on_shutdown(u->client, jack_shutdown, u); + jack_set_thread_init_callback(u->client, jack_init, u); + jack_set_buffer_size_callback(u->client, jack_buffer_size, u); + + if (!(u->thread = pa_thread_new("jack-sink", thread_func, u))) { + pa_log("Failed to create thread."); + goto fail; + } + + if (jack_activate(u->client)) { + pa_log("jack_activate() failed"); + goto fail; + } + + if (do_connect) { + for (i = 0, p = ports; i < ss.channels; i++, p++) { + + if (!p || !*p) { + pa_log("Not enough physical output ports, leaving unconnected."); + break; + } + + pa_log_info("Connecting %s to %s", jack_port_name(u->port[i]), *p); + + if (jack_connect(u->client, jack_port_name(u->port[i]), *p)) { + pa_log("Failed to connect %s to %s, leaving unconnected.", jack_port_name(u->port[i]), *p); + break; + } + } + } + + jack_port_get_latency_range(u->port[0], JackPlaybackLatency, &r); + n = r.max * pa_frame_size(&u->sink->sample_spec); + pa_sink_set_fixed_latency(u->sink, pa_bytes_to_usec(n, &u->sink->sample_spec)); + pa_sink_put(u->sink); + + if (ports) + jack_free(ports); + pa_modargs_free(ma); + + return 0; + +fail: + if (ma) + pa_modargs_free(ma); + + if (ports) + jack_free(ports); + + pa__done(m); + + return -1; +} + +int pa__get_n_used(pa_module *m) { + struct userdata *u; + + pa_assert(m); + pa_assert_se(u = m->userdata); + + return pa_sink_linked_by(u->sink); +} + +void pa__done(pa_module*m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->sink) + pa_sink_unlink(u->sink); + + if (u->client) + jack_client_close(u->client); + + if (u->thread) { + pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL); + pa_thread_free(u->thread); + } + + pa_thread_mq_done(&u->thread_mq); + + if (u->sink) + pa_sink_unref(u->sink); + + if (u->rtpoll_item) + pa_rtpoll_item_free(u->rtpoll_item); + + if (u->jack_msgq) + pa_asyncmsgq_unref(u->jack_msgq); + + if (u->rtpoll) + pa_rtpoll_free(u->rtpoll); + + pa_xfree(u); +} diff --git a/src/modules/jack/module-jack-source.c b/src/modules/jack/module-jack-source.c new file mode 100644 index 0000000..eaf2cd8 --- /dev/null +++ b/src/modules/jack/module-jack-source.c @@ -0,0 +1,465 @@ +/*** + This file is part of PulseAudio. + + Copyright 2006 Lennart Poettering + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* See module-jack-sink for a few comments how this module basically + * works */ + +PA_MODULE_AUTHOR("Lennart Poettering"); +PA_MODULE_DESCRIPTION("JACK Source"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(false); +PA_MODULE_USAGE( + "source_name= " + "source_properties= " + "server_name= " + "client_name= " + "channels= " + "channel_map= " + "connect="); + +#define DEFAULT_SOURCE_NAME "jack_in" + +struct userdata { + pa_core *core; + pa_module *module; + pa_source *source; + + unsigned channels; + + jack_port_t* port[PA_CHANNELS_MAX]; + jack_client_t *client; + + pa_thread_mq thread_mq; + pa_asyncmsgq *jack_msgq; + pa_rtpoll *rtpoll; + pa_rtpoll_item *rtpoll_item; + + pa_thread *thread; + + jack_nframes_t saved_frame_time; + bool saved_frame_time_valid; +}; + +static const char* const valid_modargs[] = { + "source_name", + "source_properties", + "server_name", + "client_name", + "channels", + "channel_map", + "connect", + NULL +}; + +enum { + SOURCE_MESSAGE_POST = PA_SOURCE_MESSAGE_MAX, + SOURCE_MESSAGE_ON_SHUTDOWN +}; + +static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) { + struct userdata *u = PA_SOURCE(o)->userdata; + + switch (code) { + + case SOURCE_MESSAGE_POST: + + /* Handle the new block from the JACK thread */ + pa_assert(chunk); + pa_assert(chunk->length > 0); + + if (u->source->thread_info.state == PA_SOURCE_RUNNING) + pa_source_post(u->source, chunk); + + u->saved_frame_time = (jack_nframes_t) offset; + u->saved_frame_time_valid = true; + + return 0; + + case SOURCE_MESSAGE_ON_SHUTDOWN: + pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL); + return 0; + + case PA_SOURCE_MESSAGE_GET_LATENCY: { + jack_latency_range_t r; + jack_nframes_t l, ft, d; + size_t n; + + /* This is the "worst-case" latency */ + jack_port_get_latency_range(u->port[0], JackCaptureLatency, &r); + l = r.max; + + if (u->saved_frame_time_valid) { + /* Adjust the worst case latency by the time that + * passed since we last handed data to JACK */ + + ft = jack_frame_time(u->client); + d = ft > u->saved_frame_time ? ft - u->saved_frame_time : 0; + l += d; + } + + /* Convert it to usec */ + n = l * pa_frame_size(&u->source->sample_spec); + *((int64_t*) data) = pa_bytes_to_usec(n, &u->source->sample_spec); + + return 0; + } + } + + return pa_source_process_msg(o, code, data, offset, chunk); +} + +static int jack_process(jack_nframes_t nframes, void *arg) { + unsigned c; + struct userdata *u = arg; + const void *buffer[PA_CHANNELS_MAX]; + void *p; + jack_nframes_t frame_time; + pa_memchunk chunk; + + pa_assert(u); + + for (c = 0; c < u->channels; c++) + pa_assert_se(buffer[c] = jack_port_get_buffer(u->port[c], nframes)); + + /* We interleave the data and pass it on to the other RT thread */ + + pa_memchunk_reset(&chunk); + chunk.length = nframes * pa_frame_size(&u->source->sample_spec); + chunk.memblock = pa_memblock_new(u->core->mempool, chunk.length); + p = pa_memblock_acquire(chunk.memblock); + pa_interleave(buffer, u->channels, p, sizeof(float), nframes); + pa_memblock_release(chunk.memblock); + + frame_time = jack_frame_time(u->client); + + pa_asyncmsgq_post(u->jack_msgq, PA_MSGOBJECT(u->source), SOURCE_MESSAGE_POST, NULL, frame_time, &chunk, NULL); + + pa_memblock_unref(chunk.memblock); + + return 0; +} + +static void thread_func(void *userdata) { + struct userdata *u = userdata; + + pa_assert(u); + + pa_log_debug("Thread starting up"); + + if (u->core->realtime_scheduling) + pa_thread_make_realtime(u->core->realtime_priority); + + pa_thread_mq_install(&u->thread_mq); + + for (;;) { + int ret; + + if ((ret = pa_rtpoll_run(u->rtpoll)) < 0) + goto fail; + + if (ret == 0) + goto finish; + } + +fail: + /* If this was no regular exit from the loop we have to continue + * processing messages until we received PA_MESSAGE_SHUTDOWN */ + pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL); + pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN); + +finish: + pa_log_debug("Thread shutting down"); +} + +static void jack_error_func(const char*t) { + char *s; + + s = pa_xstrndup(t, strcspn(t, "\n\r")); + pa_log_warn("JACK error >%s<", s); + pa_xfree(s); +} + +static void jack_init(void *arg) { + struct userdata *u = arg; + + pa_log_info("JACK thread starting up."); + + if (u->core->realtime_scheduling) + pa_thread_make_realtime(u->core->realtime_priority+4); +} + +static void jack_shutdown(void* arg) { + struct userdata *u = arg; + + pa_log_info("JACK thread shutting down.."); + pa_asyncmsgq_post(u->jack_msgq, PA_MSGOBJECT(u->source), SOURCE_MESSAGE_ON_SHUTDOWN, NULL, 0, NULL, NULL); +} + +int pa__init(pa_module*m) { + struct userdata *u = NULL; + pa_sample_spec ss; + pa_channel_map map; + pa_modargs *ma = NULL; + jack_status_t status; + const char *server_name, *client_name; + uint32_t channels = 0; + bool do_connect = true; + unsigned i; + const char **ports = NULL, **p; + pa_source_new_data data; + jack_latency_range_t r; + size_t n; + + pa_assert(m); + + jack_set_error_function(jack_error_func); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments."); + goto fail; + } + + if (pa_modargs_get_value_boolean(ma, "connect", &do_connect) < 0) { + pa_log("Failed to parse connect= argument."); + goto fail; + } + + server_name = pa_modargs_get_value(ma, "server_name", NULL); + client_name = pa_modargs_get_value(ma, "client_name", "PulseAudio JACK Source"); + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + u->saved_frame_time_valid = false; + u->rtpoll = pa_rtpoll_new(); + + if (pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll) < 0) { + pa_log("pa_thread_mq_init() failed."); + goto fail; + } + + u->jack_msgq = pa_asyncmsgq_new(0); + if (!u->jack_msgq) { + pa_log("pa_asyncmsgq_new() failed."); + goto fail; + } + + u->rtpoll_item = pa_rtpoll_item_new_asyncmsgq_read(u->rtpoll, PA_RTPOLL_EARLY-1, u->jack_msgq); + + if (!(u->client = jack_client_open(client_name, server_name ? JackServerName : JackNullOption, &status, server_name))) { + pa_log("jack_client_open() failed."); + goto fail; + } + + ports = jack_get_ports(u->client, NULL, JACK_DEFAULT_AUDIO_TYPE, JackPortIsPhysical|JackPortIsOutput); + + channels = 0; + if (ports) + for (p = ports; *p; p++) + channels++; + + if (!channels) + channels = m->core->default_sample_spec.channels; + + if (pa_modargs_get_value_u32(ma, "channels", &channels) < 0 || + !pa_channels_valid(channels)) { + pa_log("failed to parse channels= argument."); + goto fail; + } + + if (channels == m->core->default_channel_map.channels) + map = m->core->default_channel_map; + else + pa_channel_map_init_extend(&map, channels, PA_CHANNEL_MAP_ALSA); + + if (pa_modargs_get_channel_map(ma, NULL, &map) < 0 || map.channels != channels) { + pa_log("failed to parse channel_map= argument."); + goto fail; + } + + pa_log_info("Successfully connected as '%s'", jack_get_client_name(u->client)); + + u->channels = ss.channels = (uint8_t) channels; + ss.rate = jack_get_sample_rate(u->client); + ss.format = PA_SAMPLE_FLOAT32NE; + + pa_assert(pa_sample_spec_valid(&ss)); + + for (i = 0; i < ss.channels; i++) { + if (!(u->port[i] = jack_port_register(u->client, pa_channel_position_to_string(map.map[i]), JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput|JackPortIsTerminal, 0))) { + pa_log("jack_port_register() failed."); + goto fail; + } + } + + pa_source_new_data_init(&data); + data.driver = __FILE__; + data.module = m; + pa_source_new_data_set_name(&data, pa_modargs_get_value(ma, "source_name", DEFAULT_SOURCE_NAME)); + pa_source_new_data_set_sample_spec(&data, &ss); + pa_source_new_data_set_channel_map(&data, &map); + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_API, "jack"); + if (server_name) + pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, server_name); + pa_proplist_setf(data.proplist, PA_PROP_DEVICE_DESCRIPTION, "Jack source (%s)", jack_get_client_name(u->client)); + pa_proplist_sets(data.proplist, "jack.client_name", jack_get_client_name(u->client)); + + if (pa_modargs_get_proplist(ma, "source_properties", data.proplist, PA_UPDATE_REPLACE) < 0) { + pa_log("Invalid properties"); + pa_source_new_data_done(&data); + goto fail; + } + + u->source = pa_source_new(m->core, &data, PA_SOURCE_LATENCY); + pa_source_new_data_done(&data); + + if (!u->source) { + pa_log("Failed to create source."); + goto fail; + } + + u->source->parent.process_msg = source_process_msg; + u->source->userdata = u; + + pa_source_set_asyncmsgq(u->source, u->thread_mq.inq); + pa_source_set_rtpoll(u->source, u->rtpoll); + + jack_set_process_callback(u->client, jack_process, u); + jack_on_shutdown(u->client, jack_shutdown, u); + jack_set_thread_init_callback(u->client, jack_init, u); + + if (!(u->thread = pa_thread_new("jack-source", thread_func, u))) { + pa_log("Failed to create thread."); + goto fail; + } + + if (jack_activate(u->client)) { + pa_log("jack_activate() failed"); + goto fail; + } + + if (do_connect) { + for (i = 0, p = ports; i < ss.channels; i++, p++) { + + if (!p || !*p) { + pa_log("Not enough physical output ports, leaving unconnected."); + break; + } + + pa_log_info("Connecting %s to %s", jack_port_name(u->port[i]), *p); + + if (jack_connect(u->client, *p, jack_port_name(u->port[i]))) { + pa_log("Failed to connect %s to %s, leaving unconnected.", jack_port_name(u->port[i]), *p); + break; + } + } + + } + + jack_port_get_latency_range(u->port[0], JackCaptureLatency, &r); + n = r.max * pa_frame_size(&u->source->sample_spec); + pa_source_set_fixed_latency(u->source, pa_bytes_to_usec(n, &u->source->sample_spec)); + pa_source_put(u->source); + + if (ports) + jack_free(ports); + pa_modargs_free(ma); + + return 0; + +fail: + if (ma) + pa_modargs_free(ma); + + if (ports) + jack_free(ports); + + pa__done(m); + + return -1; +} + +int pa__get_n_used(pa_module *m) { + struct userdata *u; + + pa_assert(m); + pa_assert_se(u = m->userdata); + + return pa_source_linked_by(u->source); +} + +void pa__done(pa_module*m) { + struct userdata *u; + pa_assert(m); + + if (!(u = m->userdata)) + return; + + if (u->source) + pa_source_unlink(u->source); + + if (u->client) + jack_client_close(u->client); + + if (u->thread) { + pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL); + pa_thread_free(u->thread); + } + + pa_thread_mq_done(&u->thread_mq); + + if (u->source) + pa_source_unref(u->source); + + if (u->rtpoll_item) + pa_rtpoll_item_free(u->rtpoll_item); + + if (u->jack_msgq) + pa_asyncmsgq_unref(u->jack_msgq); + + if (u->rtpoll) + pa_rtpoll_free(u->rtpoll); + + pa_xfree(u); +} diff --git a/src/modules/jack/module-jackdbus-detect.c b/src/modules/jack/module-jackdbus-detect.c new file mode 100644 index 0000000..63c4307 --- /dev/null +++ b/src/modules/jack/module-jackdbus-detect.c @@ -0,0 +1,324 @@ +/*** + This file is part of PulseAudio. + + Written by David Henningsson + Copyright 2010 Canonical Ltd. + + Some code taken from other parts of PulseAudio, these are + Copyright 2006-2009 Lennart Poettering + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include +#include +#include + +PA_MODULE_AUTHOR("David Henningsson"); +PA_MODULE_DESCRIPTION("Adds JACK sink/source ports when JACK is started"); +PA_MODULE_LOAD_ONCE(true); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_USAGE( + "channels= " + "source_channels= " + "sink_channels= " + "connect="); + +#define JACK_SERVICE_NAME "org.jackaudio.service" +#define JACK_INTERFACE_NAME "org.jackaudio.JackControl" +#define JACK_INTERFACE_PATH "/org/jackaudio/Controller" + +#define SERVICE_FILTER \ + "type='signal'," \ + "sender='" DBUS_SERVICE_DBUS "'," \ + "interface='" DBUS_INTERFACE_DBUS "'," \ + "member='NameOwnerChanged'," \ + "arg0='" JACK_SERVICE_NAME "'" + +#define RUNNING_FILTER(_a) \ + "type='signal'," \ + "sender='" JACK_SERVICE_NAME "'," \ + "interface='" JACK_INTERFACE_NAME "'," \ + "member='" _a "'" + +static const char* const valid_modargs[] = { + "channels", + "source_channels", + "sink_channels", + "connect", + NULL +}; + +#define JACK_SS_SINK 0 +#define JACK_SS_SOURCE 1 +#define JACK_SS_COUNT 2 + +static const char* const modnames[JACK_SS_COUNT] = { + "module-jack-sink", + "module-jack-source" +}; + +struct userdata { + pa_module *module; + pa_core *core; + pa_dbus_connection *connection; + bool filter_added, match_added; + bool is_service_started; + bool autoconnect_ports; + uint32_t channels[JACK_SS_COUNT]; + /* Using index here protects us from module unloading without us knowing */ + int jack_module_index[JACK_SS_COUNT]; +}; + +static void ensure_ports_stopped(struct userdata* u) { + int i; + pa_assert(u); + + for (i = 0; i < JACK_SS_COUNT; i++) + if (u->jack_module_index[i]) { + pa_module_unload_request_by_index(u->core, u->jack_module_index[i], true); + u->jack_module_index[i] = 0; + pa_log_info("Stopped %s.", modnames[i]); + } +} + +static void ensure_ports_started(struct userdata* u) { + int i; + pa_assert(u); + + for (i = 0; i < JACK_SS_COUNT; i++) + if (!u->jack_module_index[i]) { + char* args; + pa_module* m; + if (u->channels[i] > 0) { + args = pa_sprintf_malloc("connect=%s channels=%" PRIu32, pa_yes_no(u->autoconnect_ports), u->channels[i]); + } else { + args = pa_sprintf_malloc("connect=%s", pa_yes_no(u->autoconnect_ports)); + } + pa_module_load(&m, u->core, modnames[i], args); + pa_xfree(args); + + if (m) { + pa_log_info("Successfully started %s.", modnames[i]); + u->jack_module_index[i] = m->index; + } + else + pa_log_info("Failed to start %s.", modnames[i]); + } +} + +static bool check_service_started(struct userdata* u) { + DBusError error; + DBusMessage *m = NULL, *reply = NULL; + bool new_status = false; + dbus_bool_t call_result; + pa_assert(u); + + dbus_error_init(&error); + + /* Just a safety check; it isn't such a big deal if the name disappears just after the call. */ + if (!dbus_bus_name_has_owner(pa_dbus_connection_get(u->connection), + JACK_SERVICE_NAME, &error)) { + pa_log_debug("jackdbus isn't running."); + goto finish; + } + + if (!(m = dbus_message_new_method_call(JACK_SERVICE_NAME, JACK_INTERFACE_PATH, JACK_INTERFACE_NAME, "IsStarted"))) { + pa_log("Failed to allocate IsStarted() method call."); + goto finish; + } + + if (!(reply = dbus_connection_send_with_reply_and_block(pa_dbus_connection_get(u->connection), m, -1, &error))) { + pa_log("IsStarted() call failed: %s: %s", error.name, error.message); + goto finish; + } + + if (!dbus_message_get_args(reply, &error, DBUS_TYPE_BOOLEAN, &call_result, DBUS_TYPE_INVALID)) { + pa_log("IsStarted() call return failed: %s: %s", error.name, error.message); + goto finish; + } + + new_status = call_result; + +finish: + if (m) + dbus_message_unref(m); + if (reply) + dbus_message_unref(reply); + + dbus_error_free(&error); + if (new_status) + ensure_ports_started(u); + else + ensure_ports_stopped(u); + u->is_service_started = new_status; + return new_status; +} + +static DBusHandlerResult dbus_filter_handler(DBusConnection *c, DBusMessage *s, void *userdata) { + struct userdata *u = NULL; + DBusError error; + + pa_assert(userdata); + u = ((pa_module*) userdata)->userdata; + pa_assert(u); + + dbus_error_init(&error); + + if (dbus_message_is_signal(s, DBUS_INTERFACE_DBUS, "NameOwnerChanged")) { + const char *name, *old, *new; + if (!dbus_message_get_args(s, &error, + DBUS_TYPE_STRING, &name, + DBUS_TYPE_STRING, &old, + DBUS_TYPE_STRING, &new, + DBUS_TYPE_INVALID)) + goto finish; + if (!pa_streq(name, JACK_SERVICE_NAME)) + goto finish; + + ensure_ports_stopped(u); + check_service_started(u); + } + + else if (dbus_message_is_signal(s, JACK_INTERFACE_NAME, "ServerStarted")) { + ensure_ports_stopped(u); + check_service_started(u); + } + + else if (dbus_message_is_signal(s, JACK_INTERFACE_NAME, "ServerStopped")) { + ensure_ports_stopped(u); + } + +finish: + dbus_error_free(&error); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +} + +int pa__init(pa_module *m) { + DBusError error; + pa_dbus_connection *connection = NULL; + struct userdata *u = NULL; + pa_modargs *ma; + uint32_t channels = 0; + int i; + + pa_assert(m); + + dbus_error_init(&error); + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments"); + goto fail; + } + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + u->autoconnect_ports = true; + + if (pa_modargs_get_value_boolean(ma, "connect", &u->autoconnect_ports) < 0) { + pa_log("Failed to parse connect= argument."); + goto fail; + } + + if (pa_modargs_get_value_u32(ma, "channels", &channels) < 0 || (channels > 0 && !pa_channels_valid(channels))) { + pa_log("Failed to parse channels= argument."); + goto fail; + } + for (i = 0; i < JACK_SS_COUNT; i++) { + u->channels[i] = channels; + } + + if (pa_modargs_get_value_u32(ma, "source_channels", &u->channels[JACK_SS_SOURCE]) < 0 || (u->channels[JACK_SS_SOURCE] > 0 && !pa_channels_valid(u->channels[JACK_SS_SOURCE]))) { + pa_log("Failed to parse source_channels= argument."); + goto fail; + } + + if (pa_modargs_get_value_u32(ma, "sink_channels", &u->channels[JACK_SS_SINK]) < 0 || (u->channels[JACK_SS_SINK] > 0 && !pa_channels_valid(u->channels[JACK_SS_SINK]))) { + pa_log("Failed to parse sink_channels= argument."); + goto fail; + } + + if (!(connection = pa_dbus_bus_get(m->core, DBUS_BUS_SESSION, &error)) || dbus_error_is_set(&error)) { + + if (connection) + pa_dbus_connection_unref(connection); + + pa_log_error("Unable to contact D-Bus session bus: %s: %s", error.name, error.message); + goto fail; + } + u->connection = connection; + + if (!dbus_connection_add_filter(pa_dbus_connection_get(connection), dbus_filter_handler, m, NULL)) { + pa_log_error("Unable to add D-Bus filter"); + goto fail; + } + u->filter_added = 1; + + if (pa_dbus_add_matches( + pa_dbus_connection_get(connection), &error, SERVICE_FILTER, + RUNNING_FILTER("ServerStarted"), RUNNING_FILTER("ServerStopped"), NULL) < 0) { + pa_log_error("Unable to subscribe to signals: %s: %s", error.name, error.message); + goto fail; + } + u->match_added = 1; + + check_service_started(u); + + pa_modargs_free(ma); + return 0; + +fail: + if (ma) + pa_modargs_free(ma); + + dbus_error_free(&error); + pa__done(m); + + return -1; +} + +void pa__done(pa_module *m) { + struct userdata *u; + + pa_assert(m); + + if (!(u = m->userdata)) + return; + + ensure_ports_stopped(u); + + if (u->match_added) { + pa_dbus_remove_matches( + pa_dbus_connection_get(u->connection), SERVICE_FILTER, + RUNNING_FILTER("ServerStarted"), RUNNING_FILTER("ServerStopped"), NULL); + } + + if (u->filter_added) { + dbus_connection_remove_filter(pa_dbus_connection_get(u->connection), dbus_filter_handler, m); + } + + if (u->connection) { + pa_dbus_connection_unref(u->connection); + } + + pa_xfree(u); +} diff --git a/src/modules/ladspa.h b/src/modules/ladspa.h new file mode 100644 index 0000000..a5fd464 --- /dev/null +++ b/src/modules/ladspa.h @@ -0,0 +1,602 @@ +/* ladspa.h + + Linux Audio Developer's Simple Plugin API Version 1.1[LGPL]. + Copyright (C) 2000-2002 Richard W.E. Furse, Paul Barton-Davis, + Stefan Westerfeld. + + This library 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 2.1 of + the License, or (at your option) any later version. + + This library 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 library; if not, see . +*/ + +#ifndef LADSPA_INCLUDED +#define LADSPA_INCLUDED + +#define LADSPA_VERSION "1.1" +#define LADSPA_VERSION_MAJOR 1 +#define LADSPA_VERSION_MINOR 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/*****************************************************************************/ + +/* Overview: + + There is a large number of synthesis packages in use or development + on the Linux platform at this time. This API (`The Linux Audio + Developer's Simple Plugin API') attempts to give programmers the + ability to write simple `plugin' audio processors in C/C++ and link + them dynamically (`plug') into a range of these packages (`hosts'). + It should be possible for any host and any plugin to communicate + completely through this interface. + + This API is deliberately short and simple. To achieve compatibility + with a range of promising Linux sound synthesis packages it + attempts to find the `greatest common divisor' in their logical + behaviour. Having said this, certain limiting decisions are + implicit, notably the use of a fixed type (LADSPA_Data) for all + data transfer and absence of a parameterised `initialisation' + phase. See below for the LADSPA_Data typedef. + + Plugins are expected to distinguish between control and audio + data. Plugins have `ports' that are inputs or outputs for audio or + control data and each plugin is `run' for a `block' corresponding + to a short time interval measured in samples. Audio data is + communicated using arrays of LADSPA_Data, allowing a block of audio + to be processed by the plugin in a single pass. Control data is + communicated using single LADSPA_Data values. Control data has a + single value at the start of a call to the `run()' or `run_adding()' + function, and may be considered to remain this value for its + duration. The plugin may assume that all its input and output ports + have been connected to the relevant data location (see the + `connect_port()' function below) before it is asked to run. + + Plugins will reside in shared object files suitable for dynamic + linking by dlopen() and family. The file will provide a number of + `plugin types' that can be used to instantiate actual plugins + (sometimes known as `plugin instances') that can be connected + together to perform tasks. + + This API contains very limited error-handling. */ + +/*****************************************************************************/ + +/* Fundamental data type passed in and out of plugin. This data type + is used to communicate audio samples and control values. It is + assumed that the plugin will work sensibly given any numeric input + value although it may have a preferred range (see hints below). + + For audio it is generally assumed that 1.0f is the `0dB' reference + amplitude and is a `normal' signal level. */ + +typedef float LADSPA_Data; + +/*****************************************************************************/ + +/* Special Plugin Properties: + + Optional features of the plugin type are encapsulated in the + LADSPA_Properties type. This is assembled by ORing individual + properties together. */ + +typedef int LADSPA_Properties; + +/* Property LADSPA_PROPERTY_REALTIME indicates that the plugin has a + real-time dependency (e.g. listens to a MIDI device) and so its + output must not be cached or subject to significant latency. */ +#define LADSPA_PROPERTY_REALTIME 0x1 + +/* Property LADSPA_PROPERTY_INPLACE_BROKEN indicates that the plugin + may cease to work correctly if the host elects to use the same data + location for both input and output (see connect_port()). This + should be avoided as enabling this flag makes it impossible for + hosts to use the plugin to process audio `in-place.' */ +#define LADSPA_PROPERTY_INPLACE_BROKEN 0x2 + +/* Property LADSPA_PROPERTY_HARD_RT_CAPABLE indicates that the plugin + is capable of running not only in a conventional host but also in a + `hard real-time' environment. To qualify for this the plugin must + satisfy all of the following: + + (1) The plugin must not use malloc(), free() or other heap memory + management within its run() or run_adding() functions. All new + memory used in run() must be managed via the stack. These + restrictions only apply to the run() function. + + (2) The plugin will not attempt to make use of any library + functions with the exceptions of functions in the ANSI standard C + and C maths libraries, which the host is expected to provide. + + (3) The plugin will not access files, devices, pipes, sockets, IPC + or any other mechanism that might result in process or thread + blocking. + + (4) The plugin will take an amount of time to execute a run() or + run_adding() call approximately of form (A+B*SampleCount) where A + and B depend on the machine and host in use. This amount of time + may not depend on input signals or plugin state. The host is left + the responsibility to perform timings to estimate upper bounds for + A and B. */ +#define LADSPA_PROPERTY_HARD_RT_CAPABLE 0x4 + +#define LADSPA_IS_REALTIME(x) ((x) & LADSPA_PROPERTY_REALTIME) +#define LADSPA_IS_INPLACE_BROKEN(x) ((x) & LADSPA_PROPERTY_INPLACE_BROKEN) +#define LADSPA_IS_HARD_RT_CAPABLE(x) ((x) & LADSPA_PROPERTY_HARD_RT_CAPABLE) + +/*****************************************************************************/ + +/* Plugin Ports: + + Plugins have `ports' that are inputs or outputs for audio or + data. Ports can communicate arrays of LADSPA_Data (for audio + inputs/outputs) or single LADSPA_Data values (for control + input/outputs). This information is encapsulated in the + LADSPA_PortDescriptor type which is assembled by ORing individual + properties together. + + Note that a port must be an input or an output port but not both + and that a port must be a control or audio port but not both. */ + +typedef int LADSPA_PortDescriptor; + +/* Property LADSPA_PORT_INPUT indicates that the port is an input. */ +#define LADSPA_PORT_INPUT 0x1 + +/* Property LADSPA_PORT_OUTPUT indicates that the port is an output. */ +#define LADSPA_PORT_OUTPUT 0x2 + +/* Property LADSPA_PORT_CONTROL indicates that the port is a control + port. */ +#define LADSPA_PORT_CONTROL 0x4 + +/* Property LADSPA_PORT_AUDIO indicates that the port is a audio + port. */ +#define LADSPA_PORT_AUDIO 0x8 + +#define LADSPA_IS_PORT_INPUT(x) ((x) & LADSPA_PORT_INPUT) +#define LADSPA_IS_PORT_OUTPUT(x) ((x) & LADSPA_PORT_OUTPUT) +#define LADSPA_IS_PORT_CONTROL(x) ((x) & LADSPA_PORT_CONTROL) +#define LADSPA_IS_PORT_AUDIO(x) ((x) & LADSPA_PORT_AUDIO) + +/*****************************************************************************/ + +/* Plugin Port Range Hints: + + The host may wish to provide a representation of data entering or + leaving a plugin (e.g. to generate a GUI automatically). To make + this more meaningful, the plugin should provide `hints' to the host + describing the usual values taken by the data. + + Note that these are only hints. The host may ignore them and the + plugin must not assume that data supplied to it is meaningful. If + the plugin receives invalid input data it is expected to continue + to run without failure and, where possible, produce a sensible + output (e.g. a high-pass filter given a negative cutoff frequency + might switch to an all-pass mode). + + Hints are meaningful for all input and output ports but hints for + input control ports are expected to be particularly useful. + + More hint information is encapsulated in the + LADSPA_PortRangeHintDescriptor type which is assembled by ORing + individual hint types together. Hints may require further + LowerBound and UpperBound information. + + All the hint information for a particular port is aggregated in the + LADSPA_PortRangeHint structure. */ + +typedef int LADSPA_PortRangeHintDescriptor; + +/* Hint LADSPA_HINT_BOUNDED_BELOW indicates that the LowerBound field + of the LADSPA_PortRangeHint should be considered meaningful. The + value in this field should be considered the (inclusive) lower + bound of the valid range. If LADSPA_HINT_SAMPLE_RATE is also + specified then the value of LowerBound should be multiplied by the + sample rate. */ +#define LADSPA_HINT_BOUNDED_BELOW 0x1 + +/* Hint LADSPA_HINT_BOUNDED_ABOVE indicates that the UpperBound field + of the LADSPA_PortRangeHint should be considered meaningful. The + value in this field should be considered the (inclusive) upper + bound of the valid range. If LADSPA_HINT_SAMPLE_RATE is also + specified then the value of UpperBound should be multiplied by the + sample rate. */ +#define LADSPA_HINT_BOUNDED_ABOVE 0x2 + +/* Hint LADSPA_HINT_TOGGLED indicates that the data item should be + considered a Boolean toggle. Data less than or equal to zero should + be considered `off' or `false,' and data above zero should be + considered `on' or `true.' LADSPA_HINT_TOGGLED may not be used in + conjunction with any other hint except LADSPA_HINT_DEFAULT_0 or + LADSPA_HINT_DEFAULT_1. */ +#define LADSPA_HINT_TOGGLED 0x4 + +/* Hint LADSPA_HINT_SAMPLE_RATE indicates that any bounds specified + should be interpreted as multiples of the sample rate. For + instance, a frequency range from 0Hz to the Nyquist frequency (half + the sample rate) could be requested by this hint in conjunction + with LowerBound = 0 and UpperBound = 0.5. Hosts that support bounds + at all must support this hint to retain meaning. */ +#define LADSPA_HINT_SAMPLE_RATE 0x8 + +/* Hint LADSPA_HINT_LOGARITHMIC indicates that it is likely that the + user will find it more intuitive to view values using a logarithmic + scale. This is particularly useful for frequencies and gains. */ +#define LADSPA_HINT_LOGARITHMIC 0x10 + +/* Hint LADSPA_HINT_INTEGER indicates that a user interface would + probably wish to provide a stepped control taking only integer + values. Any bounds set should be slightly wider than the actual + integer range required to avoid floating point rounding errors. For + instance, the integer set {0,1,2,3} might be described as [-0.1, + 3.1]. */ +#define LADSPA_HINT_INTEGER 0x20 + +/* The various LADSPA_HINT_HAS_DEFAULT_* hints indicate a `normal' + value for the port that is sensible as a default. For instance, + this value is suitable for use as an initial value in a user + interface or as a value the host might assign to a control port + when the user has not provided one. Defaults are encoded using a + mask so only one default may be specified for a port. Some of the + hints make use of lower and upper bounds, in which case the + relevant bound or bounds must be available and + LADSPA_HINT_SAMPLE_RATE must be applied as usual. The resulting + default must be rounded if LADSPA_HINT_INTEGER is present. Default + values were introduced in LADSPA v1.1. */ +#define LADSPA_HINT_DEFAULT_MASK 0x3C0 + +/* This default values indicates that no default is provided. */ +#define LADSPA_HINT_DEFAULT_NONE 0x0 + +/* This default hint indicates that the suggested lower bound for the + port should be used. */ +#define LADSPA_HINT_DEFAULT_MINIMUM 0x40 + +/* This default hint indicates that a low value between the suggested + lower and upper bounds should be chosen. For ports with + LADSPA_HINT_LOGARITHMIC, this should be exp(log(lower) * 0.75 + + log(upper) * 0.25). Otherwise, this should be (lower * 0.75 + upper + * 0.25). */ +#define LADSPA_HINT_DEFAULT_LOW 0x80 + +/* This default hint indicates that a middle value between the + suggested lower and upper bounds should be chosen. For ports with + LADSPA_HINT_LOGARITHMIC, this should be exp(log(lower) * 0.5 + + log(upper) * 0.5). Otherwise, this should be (lower * 0.5 + upper * + 0.5). */ +#define LADSPA_HINT_DEFAULT_MIDDLE 0xC0 + +/* This default hint indicates that a high value between the suggested + lower and upper bounds should be chosen. For ports with + LADSPA_HINT_LOGARITHMIC, this should be exp(log(lower) * 0.25 + + log(upper) * 0.75). Otherwise, this should be (lower * 0.25 + upper + * 0.75). */ +#define LADSPA_HINT_DEFAULT_HIGH 0x100 + +/* This default hint indicates that the suggested upper bound for the + port should be used. */ +#define LADSPA_HINT_DEFAULT_MAXIMUM 0x140 + +/* This default hint indicates that the number 0 should be used. Note + that this default may be used in conjunction with + LADSPA_HINT_TOGGLED. */ +#define LADSPA_HINT_DEFAULT_0 0x200 + +/* This default hint indicates that the number 1 should be used. Note + that this default may be used in conjunction with + LADSPA_HINT_TOGGLED. */ +#define LADSPA_HINT_DEFAULT_1 0x240 + +/* This default hint indicates that the number 100 should be used. */ +#define LADSPA_HINT_DEFAULT_100 0x280 + +/* This default hint indicates that the Hz frequency of `concert A' + should be used. This will be 440 unless the host uses an unusual + tuning convention, in which case it may be within a few Hz. */ +#define LADSPA_HINT_DEFAULT_440 0x2C0 + +#define LADSPA_IS_HINT_BOUNDED_BELOW(x) ((x) & LADSPA_HINT_BOUNDED_BELOW) +#define LADSPA_IS_HINT_BOUNDED_ABOVE(x) ((x) & LADSPA_HINT_BOUNDED_ABOVE) +#define LADSPA_IS_HINT_TOGGLED(x) ((x) & LADSPA_HINT_TOGGLED) +#define LADSPA_IS_HINT_SAMPLE_RATE(x) ((x) & LADSPA_HINT_SAMPLE_RATE) +#define LADSPA_IS_HINT_LOGARITHMIC(x) ((x) & LADSPA_HINT_LOGARITHMIC) +#define LADSPA_IS_HINT_INTEGER(x) ((x) & LADSPA_HINT_INTEGER) + +#define LADSPA_IS_HINT_HAS_DEFAULT(x) ((x) & LADSPA_HINT_DEFAULT_MASK) +#define LADSPA_IS_HINT_DEFAULT_MINIMUM(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_MINIMUM) +#define LADSPA_IS_HINT_DEFAULT_LOW(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_LOW) +#define LADSPA_IS_HINT_DEFAULT_MIDDLE(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_MIDDLE) +#define LADSPA_IS_HINT_DEFAULT_HIGH(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_HIGH) +#define LADSPA_IS_HINT_DEFAULT_MAXIMUM(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_MAXIMUM) +#define LADSPA_IS_HINT_DEFAULT_0(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_0) +#define LADSPA_IS_HINT_DEFAULT_1(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_1) +#define LADSPA_IS_HINT_DEFAULT_100(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_100) +#define LADSPA_IS_HINT_DEFAULT_440(x) (((x) & LADSPA_HINT_DEFAULT_MASK) \ + == LADSPA_HINT_DEFAULT_440) + +typedef struct _LADSPA_PortRangeHint { + + /* Hints about the port. */ + LADSPA_PortRangeHintDescriptor HintDescriptor; + + /* Meaningful when hint LADSPA_HINT_BOUNDED_BELOW is active. When + LADSPA_HINT_SAMPLE_RATE is also active then this value should be + multiplied by the relevant sample rate. */ + LADSPA_Data LowerBound; + + /* Meaningful when hint LADSPA_HINT_BOUNDED_ABOVE is active. When + LADSPA_HINT_SAMPLE_RATE is also active then this value should be + multiplied by the relevant sample rate. */ + LADSPA_Data UpperBound; + +} LADSPA_PortRangeHint; + +/*****************************************************************************/ + +/* Plugin Handles: + + This plugin handle indicates a particular instance of the plugin + concerned. It is valid to compare this to NULL (0 for C++) but + otherwise the host should not attempt to interpret it. The plugin + may use it to reference internal instance data. */ + +typedef void * LADSPA_Handle; + +/*****************************************************************************/ + +/* Descriptor for a Type of Plugin: + + This structure is used to describe a plugin type. It provides a + number of functions to examine the type, instantiate it, link it to + buffers and workspaces and to run it. */ + +typedef struct _LADSPA_Descriptor { + + /* This numeric identifier indicates the plugin type + uniquely. Plugin programmers may reserve ranges of IDs from a + central body to avoid clashes. Hosts may assume that IDs are + below 0x1000000. */ + unsigned long UniqueID; + + /* This identifier can be used as a unique, case-sensitive + identifier for the plugin type within the plugin file. Plugin + types should be identified by file and label rather than by index + or plugin name, which may be changed in new plugin + versions. Labels must not contain white-space characters. */ + const char * Label; + + /* This indicates a number of properties of the plugin. */ + LADSPA_Properties Properties; + + /* This member points to the null-terminated name of the plugin + (e.g. "Sine Oscillator"). */ + const char * Name; + + /* This member points to the null-terminated string indicating the + maker of the plugin. This can be an empty string but not NULL. */ + const char * Maker; + + /* This member points to the null-terminated string indicating any + copyright applying to the plugin. If no Copyright applies the + string "None" should be used. */ + const char * Copyright; + + /* This indicates the number of ports (input AND output) present on + the plugin. */ + unsigned long PortCount; + + /* This member indicates an array of port descriptors. Valid indices + vary from 0 to PortCount-1. */ + const LADSPA_PortDescriptor * PortDescriptors; + + /* This member indicates an array of null-terminated strings + describing ports (e.g. "Frequency (Hz)"). Valid indices vary from + 0 to PortCount-1. */ + const char * const * PortNames; + + /* This member indicates an array of range hints for each port (see + above). Valid indices vary from 0 to PortCount-1. */ + const LADSPA_PortRangeHint * PortRangeHints; + + /* This may be used by the plugin developer to pass any custom + implementation data into an instantiate call. It must not be used + or interpreted by the host. It is expected that most plugin + writers will not use this facility as LADSPA_Handle should be + used to hold instance data. */ + void * ImplementationData; + + /* This member is a function pointer that instantiates a plugin. A + handle is returned indicating the new plugin instance. The + instantiation function accepts a sample rate as a parameter. The + plugin descriptor from which this instantiate function was found + must also be passed. This function must return NULL if + instantiation fails. + + Note that instance initialisation should generally occur in + activate() rather than here. */ + LADSPA_Handle (*instantiate)(const struct _LADSPA_Descriptor * Descriptor, + unsigned long SampleRate); + + /* This member is a function pointer that connects a port on an + instantiated plugin to a memory location at which a block of data + for the port will be read/written. The data location is expected + to be an array of LADSPA_Data for audio ports or a single + LADSPA_Data value for control ports. Memory issues will be + managed by the host. The plugin must read/write the data at these + locations every time run() or run_adding() is called and the data + present at the time of this connection call should not be + considered meaningful. + + connect_port() may be called more than once for a plugin instance + to allow the host to change the buffers that the plugin is + reading or writing. These calls may be made before or after + activate() or deactivate() calls. + + connect_port() must be called at least once for each port before + run() or run_adding() is called. When working with blocks of + LADSPA_Data the plugin should pay careful attention to the block + size passed to the run function as the block allocated may only + just be large enough to contain the block of samples. + + Plugin writers should be aware that the host may elect to use the + same buffer for more than one port and even use the same buffer + for both input and output (see LADSPA_PROPERTY_INPLACE_BROKEN). + However, overlapped buffers or use of a single buffer for both + audio and control data may result in unexpected behaviour. */ + void (*connect_port)(LADSPA_Handle Instance, + unsigned long Port, + LADSPA_Data * DataLocation); + + /* This member is a function pointer that initialises a plugin + instance and activates it for use. This is separated from + instantiate() to aid real-time support and so that hosts can + reinitialise a plugin instance by calling deactivate() and then + activate(). In this case the plugin instance must reset all state + information dependent on the history of the plugin instance + except for any data locations provided by connect_port() and any + gain set by set_run_adding_gain(). If there is nothing for + activate() to do then the plugin writer may provide a NULL rather + than an empty function. + + When present, hosts must call this function once before run() (or + run_adding()) is called for the first time. This call should be + made as close to the run() call as possible and indicates to + real-time plugins that they are now live. Plugins should not rely + on a prompt call to run() after activate(). activate() may not be + called again unless deactivate() is called first. Note that + connect_port() may be called before or after a call to + activate(). */ + void (*activate)(LADSPA_Handle Instance); + + /* This method is a function pointer that runs an instance of a + plugin for a block. Two parameters are required: the first is a + handle to the particular instance to be run and the second + indicates the block size (in samples) for which the plugin + instance may run. + + Note that if an activate() function exists then it must be called + before run() or run_adding(). If deactivate() is called for a + plugin instance then the plugin instance may not be reused until + activate() has been called again. + + If the plugin has the property LADSPA_PROPERTY_HARD_RT_CAPABLE + then there are various things that the plugin should not do + within the run() or run_adding() functions (see above). */ + void (*run)(LADSPA_Handle Instance, + unsigned long SampleCount); + + /* This method is a function pointer that runs an instance of a + plugin for a block. This has identical behaviour to run() except + in the way data is output from the plugin. When run() is used, + values are written directly to the memory areas associated with + the output ports. However when run_adding() is called, values + must be added to the values already present in the memory + areas. Furthermore, output values written must be scaled by the + current gain set by set_run_adding_gain() (see below) before + addition. + + run_adding() is optional. When it is not provided by a plugin, + this function pointer must be set to NULL. When it is provided, + the function set_run_adding_gain() must be provided also. */ + void (*run_adding)(LADSPA_Handle Instance, + unsigned long SampleCount); + + /* This method is a function pointer that sets the output gain for + use when run_adding() is called (see above). If this function is + never called the gain is assumed to default to 1. Gain + information should be retained when activate() or deactivate() + are called. + + This function should be provided by the plugin if and only if the + run_adding() function is provided. When it is absent this + function pointer must be set to NULL. */ + void (*set_run_adding_gain)(LADSPA_Handle Instance, + LADSPA_Data Gain); + + /* This is the counterpart to activate() (see above). If there is + nothing for deactivate() to do then the plugin writer may provide + a NULL rather than an empty function. + + Hosts must deactivate all activated units after they have been + run() (or run_adding()) for the last time. This call should be + made as close to the last run() call as possible and indicates to + real-time plugins that they are no longer live. Plugins should + not rely on prompt deactivation. Note that connect_port() may be + called before or after a call to deactivate(). + + Deactivation is not similar to pausing as the plugin instance + will be reinitialised when activate() is called to reuse it. */ + void (*deactivate)(LADSPA_Handle Instance); + + /* Once an instance of a plugin has been finished with it can be + deleted using the following function. The instance handle passed + ceases to be valid after this call. + + If activate() was called for a plugin instance then a + corresponding call to deactivate() must be made before cleanup() + is called. */ + void (*cleanup)(LADSPA_Handle Instance); + +} LADSPA_Descriptor; + +/**********************************************************************/ + +/* Accessing a Plugin: */ + +/* The exact mechanism by which plugins are loaded is host-dependent, + however all most hosts will need to know is the name of shared + object file containing the plugin types. To allow multiple hosts to + share plugin types, hosts may wish to check for environment + variable LADSPA_PATH. If present, this should contain a + colon-separated path indicating directories that should be searched + (in order) when loading plugin types. + + A plugin programmer must include a function called + "ladspa_descriptor" with the following function prototype within + the shared object file. This function will have C-style linkage (if + you are using C++ this is taken care of by the `extern "C"' clause + at the top of the file). + + A host will find the plugin shared object file by one means or + another, find the ladspa_descriptor() function, call it, and + proceed from there. + + Plugin types are accessed by index (not ID) using values from 0 + upwards. Out of range indexes must result in this function + returning NULL, so the plugin count can be determined by checking + for the least index that results in NULL being returned. */ + +const LADSPA_Descriptor * ladspa_descriptor(unsigned long Index); + +/* Datatype corresponding to the ladspa_descriptor() function. */ +typedef const LADSPA_Descriptor * +(*LADSPA_Descriptor_Function)(unsigned long Index); + +/**********************************************************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* LADSPA_INCLUDED */ + +/* EOF */ diff --git a/src/modules/macosx/module-bonjour-publish.c b/src/modules/macosx/module-bonjour-publish.c new file mode 100644 index 0000000..8f8a530 --- /dev/null +++ b/src/modules/macosx/module-bonjour-publish.c @@ -0,0 +1,509 @@ +/*** + This file is part of PulseAudio. + + Copyright 2009 Daniel Mack + based on module-zeroconf-publish.c + + PulseAudio 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 2.1 of the + License, or (at your option) any later version. + + PulseAudio 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 Lesser General Public + License along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +PA_MODULE_AUTHOR("Daniel Mack"); +PA_MODULE_DESCRIPTION("Mac OS X Bonjour Service Publisher"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(true); + +#define SERVICE_TYPE_SINK "_pulse-sink._tcp" +#define SERVICE_TYPE_SOURCE "_pulse-source._tcp" +#define SERVICE_TYPE_SERVER "_pulse-server._tcp" + +static const char* const valid_modargs[] = { + NULL +}; + +enum service_subtype { + SUBTYPE_HARDWARE, + SUBTYPE_VIRTUAL, + SUBTYPE_MONITOR +}; + +struct service { + struct userdata *userdata; + DNSServiceRef service; + DNSRecordRef rec, rec2; + char *service_name; + pa_object *device; + enum service_subtype subtype; +}; + +struct userdata { + pa_core *core; + pa_module *module; + + pa_hashmap *services; + char *service_name; + + pa_hook_slot *sink_new_slot, *source_new_slot, *sink_unlink_slot, *source_unlink_slot, *sink_changed_slot, *source_changed_slot; + + pa_native_protocol *native; + DNSServiceRef main_service; +}; + +static void get_service_data(struct service *s, pa_sample_spec *ret_ss, pa_channel_map *ret_map, const char **ret_name, pa_proplist **ret_proplist, enum service_subtype *ret_subtype) { + pa_assert(s); + pa_assert(ret_ss); + pa_assert(ret_proplist); + pa_assert(ret_subtype); + + if (pa_sink_isinstance(s->device)) { + pa_sink *sink = PA_SINK(s->device); + + *ret_ss = sink->sample_spec; + *ret_map = sink->channel_map; + *ret_name = sink->name; + *ret_proplist = sink->proplist; + *ret_subtype = sink->flags & PA_SINK_HARDWARE ? SUBTYPE_HARDWARE : SUBTYPE_VIRTUAL; + + } else if (pa_source_isinstance(s->device)) { + pa_source *source = PA_SOURCE(s->device); + + *ret_ss = source->sample_spec; + *ret_map = source->channel_map; + *ret_name = source->name; + *ret_proplist = source->proplist; + *ret_subtype = source->monitor_of ? SUBTYPE_MONITOR : (source->flags & PA_SOURCE_HARDWARE ? SUBTYPE_HARDWARE : SUBTYPE_VIRTUAL); + + } else + pa_assert_not_reached(); +} + +static void txt_record_server_data(pa_core *c, TXTRecordRef *txt) { + char s[128]; + char *t; + + pa_assert(c); + + TXTRecordSetValue(txt, "server-version", strlen(PACKAGE_NAME" "PACKAGE_VERSION), PACKAGE_NAME" "PACKAGE_VERSION); + + t = pa_get_user_name_malloc(); + TXTRecordSetValue(txt, "user-name", strlen(t), t); + pa_xfree(t); + + t = pa_machine_id(); + TXTRecordSetValue(txt, "machine-id", strlen(t), t); + pa_xfree(t); + + t = pa_uname_string(); + TXTRecordSetValue(txt, "uname", strlen(t), t); + pa_xfree(t); + + t = pa_get_fqdn(s, sizeof(s)); + TXTRecordSetValue(txt, "fqdn", strlen(t), t); + + snprintf(s, sizeof(s), "0x%08x", c->cookie); + TXTRecordSetValue(txt, "cookie", strlen(s), s); +} + +static void service_free(struct service *s); + +static void dns_service_register_reply(DNSServiceRef sdRef, + DNSServiceFlags flags, + DNSServiceErrorType errorCode, + const char *name, + const char *regtype, + const char *domain, + void *context) { + struct service *s = context; + + pa_assert(s); + + switch (errorCode) { + case kDNSServiceErr_NameConflict: + pa_log("DNS service reported kDNSServiceErr_NameConflict\n"); + service_free(s); + break; + + case kDNSServiceErr_NoError: + default: + break; + } +} + +static uint16_t compute_port(struct userdata *u) { + pa_strlist *i; + + pa_assert(u); + + for (i = pa_native_protocol_servers(u->native); i; i = pa_strlist_next(i)) { + pa_parsed_address a; + + if (pa_parse_address(pa_strlist_data(i), &a) >= 0 && + (a.type == PA_PARSED_ADDRESS_TCP4 || + a.type == PA_PARSED_ADDRESS_TCP6 || + a.type == PA_PARSED_ADDRESS_TCP_AUTO) && + a.port > 0) { + + pa_xfree(a.path_or_host); + return htons(a.port); + } + + pa_xfree(a.path_or_host); + } + + return htons(PA_NATIVE_DEFAULT_PORT); +} + +static int publish_service(struct service *s) { + int r = -1; + TXTRecordRef txt; + DNSServiceErrorType err; + const char *name = NULL, *t; + pa_proplist *proplist = NULL; + pa_sample_spec ss; + pa_channel_map map; + char cm[PA_CHANNEL_MAP_SNPRINT_MAX], tmp[64]; + enum service_subtype subtype; + + const char * const subtype_text[] = { + [SUBTYPE_HARDWARE] = "hardware", + [SUBTYPE_VIRTUAL] = "virtual", + [SUBTYPE_MONITOR] = "monitor" + }; + + pa_assert(s); + + if (s->service) { + DNSServiceRefDeallocate(s->service); + s->service = NULL; + } + + TXTRecordCreate(&txt, 0, NULL); + + txt_record_server_data(s->userdata->core, &txt); + + get_service_data(s, &ss, &map, &name, &proplist, &subtype); + TXTRecordSetValue(&txt, "device", strlen(name), name); + + snprintf(tmp, sizeof(tmp), "%u", ss.rate); + TXTRecordSetValue(&txt, "rate", strlen(tmp), tmp); + + snprintf(tmp, sizeof(tmp), "%u", ss.channels); + TXTRecordSetValue(&txt, "channels", strlen(tmp), tmp); + + t = pa_sample_format_to_string(ss.format); + TXTRecordSetValue(&txt, "format", strlen(t), t); + + t = pa_channel_map_snprint(cm, sizeof(cm), &map); + TXTRecordSetValue(&txt, "channel_map", strlen(t), t); + + t = subtype_text[subtype]; + TXTRecordSetValue(&txt, "subtype", strlen(t), t); + + if ((t = pa_proplist_gets(proplist, PA_PROP_DEVICE_DESCRIPTION))) + TXTRecordSetValue(&txt, "description", strlen(t), t); + if ((t = pa_proplist_gets(proplist, PA_PROP_DEVICE_ICON_NAME))) + TXTRecordSetValue(&txt, "icon-name", strlen(t), t); + if ((t = pa_proplist_gets(proplist, PA_PROP_DEVICE_VENDOR_NAME))) + TXTRecordSetValue(&txt, "vendor-name", strlen(t), t); + if ((t = pa_proplist_gets(proplist, PA_PROP_DEVICE_PRODUCT_NAME))) + TXTRecordSetValue(&txt, "product-name", strlen(t), t); + if ((t = pa_proplist_gets(proplist, PA_PROP_DEVICE_CLASS))) + TXTRecordSetValue(&txt, "class", strlen(t), t); + if ((t = pa_proplist_gets(proplist, PA_PROP_DEVICE_FORM_FACTOR))) + TXTRecordSetValue(&txt, "form-factor", strlen(t), t); + + err = DNSServiceRegister(&s->service, + 0, /* flags */ + kDNSServiceInterfaceIndexAny, + s->service_name, + pa_sink_isinstance(s->device) ? SERVICE_TYPE_SINK : SERVICE_TYPE_SOURCE, + NULL, /* domain */ + NULL, /* host */ + compute_port(s->userdata), + TXTRecordGetLength(&txt), + TXTRecordGetBytesPtr(&txt), + dns_service_register_reply, s); + + if (err != kDNSServiceErr_NoError) { + pa_log("DNSServiceRegister() returned err %d", err); + goto finish; + } + + pa_log_debug("Successfully registered Bonjour services for >%s<.", s->service_name); + return 0; + +finish: + + /* Remove this service */ + if (r < 0) + service_free(s); + + TXTRecordDeallocate(&txt); + + return r; +} + +static struct service *get_service(struct userdata *u, pa_object *device) { + struct service *s; + char *hn, *un; + const char *n; + + pa_assert(u); + pa_object_assert_ref(device); + + if ((s = pa_hashmap_get(u->services, device))) + return s; + + s = pa_xnew0(struct service, 1); + s->userdata = u; + s->device = device; + + if (pa_sink_isinstance(device)) { + if (!(n = pa_proplist_gets(PA_SINK(device)->proplist, PA_PROP_DEVICE_DESCRIPTION))) + n = PA_SINK(device)->name; + } else { + if (!(n = pa_proplist_gets(PA_SOURCE(device)->proplist, PA_PROP_DEVICE_DESCRIPTION))) + n = PA_SOURCE(device)->name; + } + + hn = pa_get_host_name_malloc(); + un = pa_get_user_name_malloc(); + + s->service_name = pa_truncate_utf8(pa_sprintf_malloc("%s@%s: %s", un, hn, n), kDNSServiceMaxDomainName-1); + + pa_xfree(un); + pa_xfree(hn); + + pa_hashmap_put(u->services, s->device, s); + + return s; +} + +static void service_free(struct service *s) { + pa_assert(s); + + pa_hashmap_remove(s->userdata->services, s->device); + + if (s->service) + DNSServiceRefDeallocate(s->service); + + pa_xfree(s->service_name); + pa_xfree(s); +} + +static bool shall_ignore(pa_object *o) { + pa_object_assert_ref(o); + + if (pa_sink_isinstance(o)) + return !!(PA_SINK(o)->flags & PA_SINK_NETWORK); + + if (pa_source_isinstance(o)) + return PA_SOURCE(o)->monitor_of || (PA_SOURCE(o)->flags & PA_SOURCE_NETWORK); + + pa_assert_not_reached(); +} + +static pa_hook_result_t device_new_or_changed_cb(pa_core *c, pa_object *o, struct userdata *u) { + pa_assert(c); + pa_object_assert_ref(o); + + if (!shall_ignore(o)) + publish_service(get_service(u, o)); + + return PA_HOOK_OK; +} + +static pa_hook_result_t device_unlink_cb(pa_core *c, pa_object *o, struct userdata *u) { + struct service *s; + + pa_assert(c); + pa_object_assert_ref(o); + + if ((s = pa_hashmap_get(u->services, o))) + service_free(s); + + return PA_HOOK_OK; +} + +static int publish_main_service(struct userdata *u) { + DNSServiceErrorType err; + TXTRecordRef txt; + + pa_assert(u); + + if (u->main_service) { + DNSServiceRefDeallocate(u->main_service); + u->main_service = NULL; + } + + TXTRecordCreate(&txt, 0, NULL); + txt_record_server_data(u->core, &txt); + + err = DNSServiceRegister(&u->main_service, + 0, /* flags */ + kDNSServiceInterfaceIndexAny, + u->service_name, + SERVICE_TYPE_SERVER, + NULL, /* domain */ + NULL, /* host */ + compute_port(u), + TXTRecordGetLength(&txt), + TXTRecordGetBytesPtr(&txt), + NULL, NULL); + + if (err != kDNSServiceErr_NoError) { + pa_log("%s(): DNSServiceRegister() returned err %d", __func__, err); + return err; + } + + TXTRecordDeallocate(&txt); + + return 0; +} + +static int publish_all_services(struct userdata *u) { + pa_sink *sink; + pa_source *source; + uint32_t idx; + + pa_assert(u); + + pa_log_debug("Publishing services in Bonjour"); + + for (sink = PA_SINK(pa_idxset_first(u->core->sinks, &idx)); sink; sink = PA_SINK(pa_idxset_next(u->core->sinks, &idx))) + if (!shall_ignore(PA_OBJECT(sink))) + publish_service(get_service(u, PA_OBJECT(sink))); + + for (source = PA_SOURCE(pa_idxset_first(u->core->sources, &idx)); source; source = PA_SOURCE(pa_idxset_next(u->core->sources, &idx))) + if (!shall_ignore(PA_OBJECT(source))) + publish_service(get_service(u, PA_OBJECT(source))); + + return publish_main_service(u); +} + +static void unpublish_all_services(struct userdata *u) { + void *state = NULL; + struct service *s; + + pa_assert(u); + + pa_log_debug("Unpublishing services in Bonjour"); + + while ((s = pa_hashmap_iterate(u->services, &state, NULL))) + service_free(s); + + if (u->main_service) + DNSServiceRefDeallocate(u->main_service); +} + +int pa__init(pa_module*m) { + + struct userdata *u; + pa_modargs *ma = NULL; + char *hn, *un; + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments."); + goto fail; + } + + m->userdata = u = pa_xnew0(struct userdata, 1); + u->core = m->core; + u->module = m; + u->native = pa_native_protocol_get(u->core); + + u->services = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func); + + u->sink_new_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_PUT], PA_HOOK_LATE, (pa_hook_cb_t) device_new_or_changed_cb, u); + u->sink_changed_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_PROPLIST_CHANGED], PA_HOOK_LATE, (pa_hook_cb_t) device_new_or_changed_cb, u); + u->sink_unlink_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_UNLINK], PA_HOOK_LATE, (pa_hook_cb_t) device_unlink_cb, u); + u->source_new_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_PUT], PA_HOOK_LATE, (pa_hook_cb_t) device_new_or_changed_cb, u); + u->source_changed_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_PROPLIST_CHANGED], PA_HOOK_LATE, (pa_hook_cb_t) device_new_or_changed_cb, u); + u->source_unlink_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_UNLINK], PA_HOOK_LATE, (pa_hook_cb_t) device_unlink_cb, u); + + un = pa_get_user_name_malloc(); + hn = pa_get_host_name_malloc(); + u->service_name = pa_truncate_utf8(pa_sprintf_malloc("%s@%s", un, hn), kDNSServiceMaxDomainName-1); + pa_xfree(un); + pa_xfree(hn); + + publish_all_services(u); + pa_modargs_free(ma); + + return 0; + +fail: + pa__done(m); + + if (ma) + pa_modargs_free(ma); + + return -1; +} + +void pa__done(pa_module*m) { + struct userdata*u; + pa_assert(m); + + if (!(u = m->userdata)) + return; + + unpublish_all_services(u); + + if (u->services) + pa_hashmap_free(u->services); + + if (u->sink_new_slot) + pa_hook_slot_free(u->sink_new_slot); + if (u->source_new_slot) + pa_hook_slot_free(u->source_new_slot); + if (u->sink_changed_slot) + pa_hook_slot_free(u->sink_changed_slot); + if (u->source_changed_slot) + pa_hook_slot_free(u->source_changed_slot); + if (u->sink_unlink_slot) + pa_hook_slot_free(u->sink_unlink_slot); + if (u->source_unlink_slot) + pa_hook_slot_free(u->source_unlink_slot); + + if (u->native) + pa_native_protocol_unref(u->native); + + pa_xfree(u->service_name); + pa_xfree(u); +} diff --git a/src/modules/macosx/module-coreaudio-detect.c b/src/modules/macosx/module-coreaudio-detect.c new file mode 100644 index 0000000..1fd2ede --- /dev/null +++ b/src/modules/macosx/module-coreaudio-detect.c @@ -0,0 +1,304 @@ +/*** + This file is part of PulseAudio. + + Copyright 2009,2010 Daniel Mack + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include + +#include +#include +#include +#include +#include + +#include + +#define DEVICE_MODULE_NAME "module-coreaudio-device" + +PA_MODULE_AUTHOR("Daniel Mack"); +PA_MODULE_DESCRIPTION("CoreAudio device detection"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(true); +PA_MODULE_USAGE("ioproc_frames= " + "record= " + "playback= "); + +static const char* const valid_modargs[] = { + "ioproc_frames", + "record", + "playback", + NULL +}; + +typedef struct ca_device ca_device; + +struct ca_device { + AudioObjectID id; + unsigned int module_index; + PA_LLIST_FIELDS(ca_device); +}; + +struct userdata { + int detect_fds[2]; + pa_io_event *detect_io; + unsigned int ioproc_frames; + bool record; + bool playback; + PA_LLIST_HEAD(ca_device, devices); +}; + +static int ca_device_added(struct pa_module *m, AudioObjectID id) { + AudioObjectPropertyAddress property_address; + OSStatus err; + pa_module *mod; + struct userdata *u; + struct ca_device *dev; + char *args, tmp[64]; + UInt32 size; + + pa_assert(m); + pa_assert_se(u = m->userdata); + + /* To prevent generating a black hole that will suck us in, + don't create sources/sinks for PulseAudio virtual devices */ + + property_address.mSelector = kAudioDevicePropertyDeviceManufacturer; + property_address.mScope = kAudioObjectPropertyScopeGlobal; + property_address.mElement = kAudioObjectPropertyElementMaster; + + size = sizeof(tmp); + err = AudioObjectGetPropertyData(id, &property_address, 0, NULL, &size, tmp); + + if (!err && pa_streq(tmp, "pulseaudio.org")) + return 0; + + if (u->ioproc_frames) + args = pa_sprintf_malloc("object_id=%d ioproc_frames=%d record=%d playback=%d", (int) id, u->ioproc_frames, (int) u->record, (int) u->playback); + else + args = pa_sprintf_malloc("object_id=%d record=%d playback=%d", (int) id, (int) u->record, (int) u->playback); + + pa_log_debug("Loading %s with arguments '%s'", DEVICE_MODULE_NAME, args); + pa_module_load(&mod, m->core, DEVICE_MODULE_NAME, args); + pa_xfree(args); + + if (!mod) { + pa_log_info("Failed to load module %s with arguments '%s'", DEVICE_MODULE_NAME, args); + return -1; + } + + dev = pa_xnew0(ca_device, 1); + dev->module_index = mod->index; + dev->id = id; + + PA_LLIST_INIT(ca_device, dev); + PA_LLIST_PREPEND(ca_device, u->devices, dev); + + return 0; +} + +static int ca_update_device_list(struct pa_module *m) { + AudioObjectPropertyAddress property_address; + OSStatus err; + UInt32 i, size, num_devices; + AudioDeviceID *device_id; + struct ca_device *dev; + struct userdata *u; + + pa_assert(m); + pa_assert_se(u = m->userdata); + + property_address.mSelector = kAudioHardwarePropertyDevices; + property_address.mScope = kAudioObjectPropertyScopeGlobal; + property_address.mElement = kAudioObjectPropertyElementMaster; + + /* get the number of currently available audio devices */ + err = AudioObjectGetPropertyDataSize(kAudioObjectSystemObject, &property_address, 0, NULL, &size); + if (err) { + pa_log("Unable to get data size for kAudioHardwarePropertyDevices."); + return -1; + } + + num_devices = size / sizeof(AudioDeviceID); + device_id = pa_xnew(AudioDeviceID, num_devices); + + err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &property_address, 0, NULL, &size, device_id); + if (err) { + pa_log("Unable to get kAudioHardwarePropertyDevices."); + pa_xfree(device_id); + return -1; + } + + /* scan for devices which are reported but not in our cached list */ + for (i = 0; i < num_devices; i++) { + bool found = false; + + PA_LLIST_FOREACH(dev, u->devices) + if (dev->id == device_id[i]) { + found = true; + break; + } + + if (!found) + ca_device_added(m, device_id[i]); + } + + /* scan for devices which are in our cached list but are not reported */ +scan_removed: + + PA_LLIST_FOREACH(dev, u->devices) { + bool found = false; + + for (i = 0; i < num_devices; i++) + if (dev->id == device_id[i]) { + found = true; + break; + } + + if (!found) { + pa_log_debug("object id %d has been removed (module index %d) %p", (unsigned int) dev->id, dev->module_index, dev); + pa_module_unload_request_by_index(m->core, dev->module_index, true); + PA_LLIST_REMOVE(ca_device, u->devices, dev); + pa_xfree(dev); + /* the current list item pointer is not valid anymore, so start over. */ + goto scan_removed; + } + } + + pa_xfree(device_id); + return 0; +} + +static OSStatus property_listener_proc(AudioObjectID objectID, UInt32 numberAddresses, + const AudioObjectPropertyAddress inAddresses[], + void *clientData) { + struct userdata *u = clientData; + char dummy = 1; + + pa_assert(u); + + /* dispatch module load/unload operations in main thread */ + write(u->detect_fds[1], &dummy, 1); + + return 0; +} + +static void detect_handle(pa_mainloop_api *a, pa_io_event *e, int fd, pa_io_event_flags_t events, void *userdata) { + pa_module *m = userdata; + char dummy; + + pa_assert(m); + + read(fd, &dummy, 1); + ca_update_device_list(m); +} + +int pa__init(pa_module *m) { + struct userdata *u = pa_xnew0(struct userdata, 1); + AudioObjectPropertyAddress property_address; + pa_modargs *ma; + + pa_assert(m); + pa_assert(m->core); + + m->userdata = u; + + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("Failed to parse module arguments."); + goto fail; + } + + /* + * Set default value to true if not given as a modarg. + * In such a case, pa_modargs_get_value_boolean() will not touch the + * buffer. + */ + u->playback = u->record = true; + + if (pa_modargs_get_value_boolean(ma, "record", &u->record) < 0 || pa_modargs_get_value_boolean(ma, "playback", &u->playback) < 0) { + pa_log("record= and playback= expect boolean argument."); + goto fail; + } + + if (!u->playback && !u->record) { + pa_log("neither playback nor record enabled for device."); + goto fail; + } + + pa_modargs_get_value_u32(ma, "ioproc_frames", &u->ioproc_frames); + + property_address.mSelector = kAudioHardwarePropertyDevices; + property_address.mScope = kAudioObjectPropertyScopeGlobal; + property_address.mElement = kAudioObjectPropertyElementMaster; + + if (AudioObjectAddPropertyListener(kAudioObjectSystemObject, &property_address, property_listener_proc, u)) { + pa_log("AudioObjectAddPropertyListener() failed."); + goto fail; + } + + if (ca_update_device_list(m)) + goto fail; + + pa_assert_se(pipe(u->detect_fds) == 0); + pa_assert_se(u->detect_io = m->core->mainloop->io_new(m->core->mainloop, u->detect_fds[0], PA_IO_EVENT_INPUT, detect_handle, m)); + + return 0; + +fail: + pa_xfree(u); + return -1; +} + +void pa__done(pa_module *m) { + struct userdata *u; + struct ca_device *dev; + AudioObjectPropertyAddress property_address; + + pa_assert(m); + pa_assert_se(u = m->userdata); + + dev = u->devices; + + property_address.mSelector = kAudioHardwarePropertyDevices; + property_address.mScope = kAudioObjectPropertyScopeGlobal; + property_address.mElement = kAudioObjectPropertyElementMaster; + + AudioObjectRemovePropertyListener(kAudioObjectSystemObject, &property_address, property_listener_proc, u); + + while (dev) { + struct ca_device *next = dev->next; + + pa_module_unload_request_by_index(m->core, dev->module_index, true); + pa_xfree(dev); + + dev = next; + } + + if (u->detect_fds[0] >= 0) + close(u->detect_fds[0]); + + if (u->detect_fds[1] >= 0) + close(u->detect_fds[1]); + + if (u->detect_io) + m->core->mainloop->io_free(u->detect_io); + + pa_xfree(u); +} diff --git a/src/modules/macosx/module-coreaudio-device.c b/src/modules/macosx/module-coreaudio-device.c new file mode 100644 index 0000000..9bdac11 --- /dev/null +++ b/src/modules/macosx/module-coreaudio-device.c @@ -0,0 +1,985 @@ +/*** + This file is part of PulseAudio. + + Copyright 2009,2010 Daniel Mack + + PulseAudio 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 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see . +***/ + +/* TODO: + - implement hardware volume controls + - handle audio device stream format changes (will require changes to the core) + - add an "off" mode that removes all sinks and sources +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define DEFAULT_FRAMES_PER_IOPROC 512 + +PA_MODULE_AUTHOR("Daniel Mack"); +PA_MODULE_DESCRIPTION("CoreAudio device"); +PA_MODULE_VERSION(PACKAGE_VERSION); +PA_MODULE_LOAD_ONCE(false); +PA_MODULE_USAGE("object_id= " + "ioproc_frames=