Skip to content

Commit 1841412

Browse files
committed
Refactor examples to use lib
1 parent f18c242 commit 1841412

File tree

6 files changed

+28
-111
lines changed

6 files changed

+28
-111
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
/vendor/
22
/composer.lock
3+
/.idea
34
/.phpcs-cache

Makefile

+6-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ vendor/autoload.php: composer.lock
1111
$(COMPOSER) install
1212

1313
phpstan: vendor/bin/phpstan
14-
$(PHP) vendor/bin/phpstan analyse -l max lib -a include/dbus-php.php
14+
$(PHP) vendor/bin/phpstan analyse -l max -a lib/ examples/
1515

1616
phpcs phpcbf: vendor/bin/$@
1717
$(PHP) vendor/bin/$@
18+
19+
examples:
20+
(echo $(PHP) examples/bluez-music-notify.php ; echo $(PHP) examples/bluez-volume-sync.php) | parallel -u
21+
22+
.PHONY: examples

examples/bluez-music-notify.php

+8-41
Original file line numberDiff line numberDiff line change
@@ -3,56 +3,21 @@
33
declare(strict_types=1);
44

55
use Paxal\DBus\DBus;
6-
use Paxal\DBus\DBusMessageIterDecoder;
7-
use Paxal\DBus\Message;
86

97
require_once __DIR__ . '/../vendor/autoload.php';
108
$ffi = require_once __DIR__ . '/../load.php';
119

12-
$err = $ffi->new('struct DBusError');
13-
$ffi->dbus_error_init(FFI::addr($err));
14-
$args = $ffi->new('struct DBusMessageIter');
15-
$conn = $ffi->dbus_bus_get(DBus::BUS_SYSTEM, FFI::addr($err));
16-
17-
$ffi->dbus_bus_add_match(
18-
$conn,
19-
'arg0=org.bluez.MediaPlayer1',
20-
FFI::addr($err)
21-
);
22-
$ffi->dbus_connection_flush($conn);
23-
if ($ffi->dbus_error_is_set(FFI::addr($err))) {
24-
fprintf(stderr, "Match Error (%s)\n", $err->message);
25-
exit(1);
26-
}
27-
28-
$decoder = new DBusMessageIterDecoder($ffi);
29-
10+
$dbus = DBus::connect(DBus::BUS_SYSTEM);
11+
$dbus->addMatch('arg0=org.bluez.MediaPlayer1');
3012
$lastItem = null;
3113
while (true) {
32-
$ffi->dbus_connection_read_write($conn, 0);
33-
$msg = $ffi->dbus_connection_pop_message($conn);
34-
$end = microtime(true);
35-
36-
// loop again if we haven't read a message
37-
if ($msg === null) {
38-
usleep(100000);
14+
usleep(10);
15+
$message = $dbus->waitLoop();
16+
if ($message === null) {
3917
continue;
4018
}
4119

42-
if (! $ffi->dbus_message_iter_init($msg, FFI::addr($args))) {
43-
error_log("Message has no arguments!\n");
44-
continue;
45-
}
46-
47-
$message = new Message();
48-
$message->interface = $ffi->dbus_message_get_interface($msg);
49-
$message->path = $ffi->dbus_message_get_path($msg);
50-
$message->member = $ffi->dbus_message_get_member($msg);
51-
$message->arguments = $decoder->decode($args);
52-
53-
$ffi->dbus_message_unref($msg);
54-
55-
if (strpos($message->path, '/org/bluez') !== 0) {
20+
if (strpos($message->path ?? '', '/org/bluez') !== 0) {
5621
continue;
5722
}
5823

@@ -87,5 +52,7 @@
8752
$lastItem = $item;
8853
$arguments = ['-t', '5000', '-a', 'Music', $track['Title'], $track['Artist'] . ' - ' . $track['Album']];
8954
$escapedArguments = array_map('escapeshellarg', $arguments);
55+
56+
echo sprintf('%s %s', $track['Title'], $track['Artist'] . ' - ' . $track['Album']) . PHP_EOL;
9057
exec('notify-send ' . implode(' ', $escapedArguments));
9158
}

examples/bluez-volume-sync.php

+7-42
Original file line numberDiff line numberDiff line change
@@ -3,58 +3,23 @@
33
declare(strict_types=1);
44

55
use Paxal\DBus\DBus;
6-
use Paxal\DBus\DBusMessageIterDecoder;
7-
use Paxal\DBus\Message;
86

97
const BLUEZ_TO_PA_FACTOR = 65535/127;
108

119
require_once __DIR__ . '/../vendor/autoload.php';
1210
$ffi = require_once __DIR__ . '/../load.php';
1311

14-
$err = $ffi->new('struct DBusError');
15-
$ffi->dbus_error_init(FFI::addr($err));
16-
$args = $ffi->new('struct DBusMessageIter');
17-
$conn = $ffi->dbus_bus_get(DBus::BUS_SYSTEM, FFI::addr($err));
12+
$dbus = DBus::connect(DBus::BUS_SYSTEM);
13+
$dbus->addMatch('arg0=org.bluez.MediaTransport1');
1814

19-
$ffi->dbus_bus_add_match(
20-
$conn,
21-
'arg0=org.bluez.MediaTransport1',
22-
FFI::addr($err)
23-
);
24-
$ffi->dbus_connection_flush($conn);
25-
if ($ffi->dbus_error_is_set(FFI::addr($err))) {
26-
fprintf(STDERR, "Match Error (%s)\n", $err->message);
27-
exit(1);
28-
}
29-
30-
$decoder = new DBusMessageIterDecoder($ffi);
31-
32-
$lastItem = null;
3315
while (true) {
34-
$ffi->dbus_connection_read_write($conn, 0);
35-
$msg = $ffi->dbus_connection_pop_message($conn);
36-
$end = microtime(true);
37-
38-
// loop again if we haven't read a message
39-
if ($msg === null) {
40-
usleep(100000);
16+
$message = $dbus->waitLoop();
17+
if ($message === null) {
18+
usleep(10);
4119
continue;
4220
}
4321

44-
if (! $ffi->dbus_message_iter_init($msg, FFI::addr($args))) {
45-
error_log("Message has no arguments!\n");
46-
continue;
47-
}
48-
49-
$message = new Message();
50-
$message->interface = $ffi->dbus_message_get_interface($msg);
51-
$message->path = $ffi->dbus_message_get_path($msg);
52-
$message->member = $ffi->dbus_message_get_member($msg);
53-
$message->arguments = $decoder->decode($args);
54-
55-
$ffi->dbus_message_unref($msg);
56-
57-
if (strpos($message->path, '/org/bluez') !== 0) {
22+
if (strpos($message->path ?? '', '/org/bluez') !== 0) {
5823
continue;
5924
}
6025

@@ -77,7 +42,7 @@
7742
continue;
7843
}
7944

80-
$addr = preg_replace('@^.*/dev_(.*?)(/.*)$@', '$1', $message->path);
45+
$addr = preg_replace('@^.*/dev_(.*?)(/.*)$@', '$1', (string) $message->path);
8146
$paVolume = (int) (BLUEZ_TO_PA_FACTOR * (int) $volume);
8247
echo 'Set volume to ' . round($paVolume / 65535 * 100) . '%' . PHP_EOL;
8348
exec(sprintf('pactl set-source-volume bluez_source.%s.a2dp_source %s', $addr, $paVolume));

include/ffi.php

-22
This file was deleted.

lib/DBus.php

+6-5
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,14 @@ final class DBus
7272
public const TYPE_DICT_ENTRY_AS_STRING = 'e';
7373

7474
/** @var PaxalDbusPhp */
75-
public static FFI $ffi;
75+
public static $ffi;
7676
private CData $conn;
77+
private static DBusMessageIterDecoder $decoder;
7778

7879
private static function init() : void
7980
{
80-
self::$ffi = require __DIR__ . '/../load.php';
81+
self::$ffi = require __DIR__ . '/../load.php';
82+
self::$decoder = new DBusMessageIterDecoder(self::$ffi);
8183
}
8284

8385
private function __construct(FFI\CData $conn)
@@ -130,8 +132,7 @@ public function waitLoop() : ?Message
130132
return null;
131133
}
132134

133-
$args = self::$ffi->new('struct DBusMessageIter');
134-
$decoder = new DBusMessageIterDecoder(self::$ffi);
135+
$args = self::$ffi->new('struct DBusMessageIter');
135136
if (! self::$ffi->dbus_message_iter_init($msg, FFI::addr($args))) {
136137
trigger_error("Message has no arguments!\n", E_USER_WARNING);
137138

@@ -142,7 +143,7 @@ public function waitLoop() : ?Message
142143
$message->interface = self::$ffi->dbus_message_get_interface($msg);
143144
$message->path = self::$ffi->dbus_message_get_path($msg);
144145
$message->member = self::$ffi->dbus_message_get_member($msg);
145-
$message->arguments = $decoder->decode($args);
146+
$message->arguments = self::$decoder->decode($args);
146147

147148
self::$ffi->dbus_message_unref($msg);
148149

0 commit comments

Comments
 (0)