Skip to content

Commit e4048a2

Browse files
fix connected device detection when using latest wireplumber version
1 parent 339c478 commit e4048a2

File tree

4 files changed

+62
-12
lines changed

4 files changed

+62
-12
lines changed

linux/main.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,7 @@ class AirPodsTrayApp : public QObject {
105105
// On startup after reboot, activate A2DP profile for already connected AirPods
106106
QTimer::singleShot(2000, this, [this, address]()
107107
{
108-
QString formattedAddress = address.toString().replace(":", "_");
109-
mediaController->setConnectedDeviceMacAddress(formattedAddress);
108+
mediaController->setConnectedDeviceMacAddress(address.toString());
110109
mediaController->activateA2dpProfile();
111110
LOG_INFO("A2DP profile activation attempted for AirPods found on startup");
112111
});
@@ -427,7 +426,7 @@ public slots:
427426
if (areAirpodsConnected() && m_deviceInfo && !m_deviceInfo->bluetoothAddress().isEmpty())
428427
{
429428
LOG_INFO("AirPods already connected after wake-up, re-activating A2DP profile");
430-
mediaController->setConnectedDeviceMacAddress(m_deviceInfo->bluetoothAddress().replace(":", "_"));
429+
mediaController->setConnectedDeviceMacAddress(m_deviceInfo->bluetoothAddress());
431430

432431
// Always activate A2DP profile after system wake since the profile might have been lost
433432
QTimer::singleShot(1000, this, [this]()
@@ -494,9 +493,7 @@ private slots:
494493
{
495494
if (!address.isEmpty())
496495
{
497-
QString formattedAddress = address;
498-
formattedAddress = formattedAddress.replace(":", "_");
499-
mediaController->setConnectedDeviceMacAddress(formattedAddress);
496+
mediaController->setConnectedDeviceMacAddress(address);
500497
mediaController->activateA2dpProfile();
501498
LOG_INFO("A2DP profile activation attempted for newly connected device");
502499
}
@@ -738,7 +735,7 @@ private slots:
738735
{
739736
parseMetadata(data);
740737
initiateMagicPairing();
741-
mediaController->setConnectedDeviceMacAddress(m_deviceInfo->bluetoothAddress().replace(":", "_"));
738+
mediaController->setConnectedDeviceMacAddress(m_deviceInfo->bluetoothAddress());
742739
if (m_deviceInfo->getEarDetection()->oneOrMorePodsInEar()) // AirPods get added as output device only after this
743740
{
744741
mediaController->activateA2dpProfile();

linux/media/mediacontroller.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,9 @@ void MediaController::followMediaChanges() {
9595
}
9696

9797
bool MediaController::isActiveOutputDeviceAirPods() {
98-
QString defaultSink = m_pulseAudio->getDefaultSink();
99-
LOG_DEBUG("Default sink: " << defaultSink);
100-
return defaultSink.contains(connectedDeviceMacAddress);
98+
QString defaultSinkMacAddress = m_pulseAudio->getDefaultSinkMacAddress();
99+
LOG_DEBUG("Default sink MAC address: " << defaultSinkMacAddress);
100+
return defaultSinkMacAddress == connectedDeviceMacAddress;
101101
}
102102

103103
void MediaController::handleConversationalAwareness(const QByteArray &data) {

linux/media/pulseaudiocontroller.cpp

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,11 +105,60 @@ QString PulseAudioController::getDefaultSink()
105105
waitForOperation(op);
106106
pa_operation_unref(op);
107107
}
108+
108109
pa_threaded_mainloop_unlock(m_mainloop);
109110

110111
return data.sinkName;
111112
}
112113

114+
QString PulseAudioController::getDefaultSinkMacAddress() {
115+
return this->getMacAddressBySinkName(this->getDefaultSink());
116+
}
117+
118+
QString PulseAudioController::getMacAddressBySinkName(const QString &sinkName)
119+
{
120+
if (!m_initialized) return QString();
121+
122+
struct CallbackData {
123+
QString sinkMacAddress;
124+
pa_threaded_mainloop *mainloop;
125+
} data;
126+
data.mainloop = m_mainloop;
127+
128+
auto callback = [](pa_context *c, const pa_sink_info *info, int eol, void *userdata)
129+
{
130+
CallbackData *d = static_cast<CallbackData*>(userdata);
131+
if (eol > 0)
132+
{
133+
pa_threaded_mainloop_signal(d->mainloop, 0);
134+
return;
135+
}
136+
137+
const char *addr = pa_proplist_gets(
138+
info->proplist,
139+
"device.string"
140+
);
141+
142+
if (addr)
143+
{
144+
d->sinkMacAddress = QString::fromUtf8(addr);
145+
pa_threaded_mainloop_signal(d->mainloop, 0);
146+
}
147+
};
148+
149+
pa_threaded_mainloop_lock(m_mainloop);
150+
pa_operation *op = pa_context_get_sink_info_by_name(m_context, sinkName.toLocal8Bit(), callback, &data);
151+
if (op)
152+
{
153+
waitForOperation(op);
154+
pa_operation_unref(op);
155+
}
156+
157+
pa_threaded_mainloop_unlock(m_mainloop);
158+
159+
return data.sinkMacAddress;
160+
}
161+
113162
int PulseAudioController::getSinkVolume(const QString &sinkName)
114163
{
115164
if (!m_initialized) return -1;
@@ -215,8 +264,10 @@ QString PulseAudioController::getCardNameForDevice(const QString &macAddress)
215264
}
216265
if (info)
217266
{
218-
QString name = QString::fromUtf8(info->name);
219-
if (name.startsWith("bluez") && name.contains(d->targetMac))
267+
const QString name = QString::fromUtf8(info->name);
268+
const QString macAddress = pa_proplist_gets(info->proplist, "device.string");
269+
270+
if (d->targetMac == macAddress)
220271
{
221272
d->cardName = name;
222273
pa_threaded_mainloop_signal(d->mainloop, 0);

linux/media/pulseaudiocontroller.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class PulseAudioController : public QObject
1515

1616
bool initialize();
1717
QString getDefaultSink();
18+
QString getDefaultSinkMacAddress();
1819
int getSinkVolume(const QString &sinkName);
1920
bool setSinkVolume(const QString &sinkName, int volumePercent);
2021
bool setCardProfile(const QString &cardName, const QString &profileName);
@@ -32,6 +33,7 @@ class PulseAudioController : public QObject
3233
static void serverInfoCallback(pa_context *c, const pa_server_info *info, void *userdata);
3334

3435
bool waitForOperation(pa_operation *op);
36+
QString getMacAddressBySinkName(const QString &sinkName);
3537
};
3638

3739
#endif // PULSEAUDIOCONTROLLER_H

0 commit comments

Comments
 (0)