Skip to content

Commit 0cd19d1

Browse files
committed
linux: add hearing aid
it's just a simple python script, with a toggle in the main app. i dont want to mess with the main app because it uses ATT instead of the AACP protocol which is implemented in the app.
1 parent b5d1ad0 commit 0cd19d1

5 files changed

Lines changed: 443 additions & 0 deletions

File tree

linux/Main.qml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,13 @@ ApplicationWindow {
156156
checked: airPodsTrayApp.deviceInfo.conversationalAwareness
157157
onCheckedChanged: airPodsTrayApp.setConversationalAwareness(checked)
158158
}
159+
160+
Switch {
161+
visible: airPodsTrayApp.airpodsConnected
162+
text: "Hearing Aid"
163+
checked: airPodsTrayApp.deviceInfo.hearingAidEnabled
164+
onCheckedChanged: airPodsTrayApp.setHearingAidEnabled(checked)
165+
}
159166
}
160167

161168
RoundButton {

linux/airpods_packets.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,16 @@ namespace AirPodsPackets
107107
inline std::optional<bool> parseState(const QByteArray &data) { return Type::parseState(data); }
108108
}
109109

110+
// Hearing Aid
111+
namespace HearingAid
112+
{
113+
using Type = BasicControlCommand<0x2C>;
114+
static const QByteArray ENABLED = Type::ENABLED;
115+
static const QByteArray DISABLED = Type::DISABLED;
116+
static const QByteArray HEADER = Type::HEADER;
117+
inline std::optional<bool> parseState(const QByteArray &data) { return Type::parseState(data); }
118+
}
119+
110120
// Allow Off Option
111121
namespace AllowOffOption
112122
{

linux/deviceinfo.hpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class DeviceInfo : public QObject
1515
Q_PROPERTY(QString batteryStatus READ batteryStatus WRITE setBatteryStatus NOTIFY batteryStatusChanged)
1616
Q_PROPERTY(int noiseControlMode READ noiseControlModeInt WRITE setNoiseControlModeInt NOTIFY noiseControlModeChangedInt)
1717
Q_PROPERTY(bool conversationalAwareness READ conversationalAwareness WRITE setConversationalAwareness NOTIFY conversationalAwarenessChanged)
18+
Q_PROPERTY(bool hearingAidEnabled READ hearingAidEnabled WRITE setHearingAidEnabled NOTIFY hearingAidEnabledChanged)
1819
Q_PROPERTY(int adaptiveNoiseLevel READ adaptiveNoiseLevel WRITE setAdaptiveNoiseLevel NOTIFY adaptiveNoiseLevelChanged)
1920
Q_PROPERTY(QString deviceName READ deviceName WRITE setDeviceName NOTIFY deviceNameChanged)
2021
Q_PROPERTY(Battery *battery READ getBattery CONSTANT)
@@ -67,6 +68,16 @@ class DeviceInfo : public QObject
6768
}
6869
}
6970

71+
bool hearingAidEnabled() const { return m_hearingAidEnabled; }
72+
void setHearingAidEnabled(bool enabled)
73+
{
74+
if (m_hearingAidEnabled != enabled)
75+
{
76+
m_hearingAidEnabled = enabled;
77+
emit hearingAidEnabledChanged(enabled);
78+
}
79+
}
80+
7081
int adaptiveNoiseLevel() const { return m_adaptiveNoiseLevel; }
7182
void setAdaptiveNoiseLevel(int level)
7283
{
@@ -159,6 +170,7 @@ class DeviceInfo : public QObject
159170
setNoiseControlMode(NoiseControlMode::Off);
160171
setBluetoothAddress("");
161172
getEarDetection()->reset();
173+
setHearingAidEnabled(false);
162174
}
163175

164176
void saveToSettings(QSettings &settings)
@@ -168,6 +180,7 @@ class DeviceInfo : public QObject
168180
settings.setValue("model", static_cast<int>(model()));
169181
settings.setValue("magicAccIRK", magicAccIRK());
170182
settings.setValue("magicAccEncKey", magicAccEncKey());
183+
settings.setValue("hearingAidEnabled", hearingAidEnabled());
171184
settings.endGroup();
172185
}
173186
void loadFromSettings(const QSettings &settings)
@@ -176,6 +189,7 @@ class DeviceInfo : public QObject
176189
setModel(static_cast<AirPodsModel>(settings.value("DeviceInfo/model", (int)(AirPodsModel::Unknown)).toInt()));
177190
setMagicAccIRK(settings.value("DeviceInfo/magicAccIRK", QByteArray()).toByteArray());
178191
setMagicAccEncKey(settings.value("DeviceInfo/magicAccEncKey", QByteArray()).toByteArray());
192+
setHearingAidEnabled(settings.value("DeviceInfo/hearingAidEnabled", false).toBool());
179193
}
180194

181195
void updateBatteryStatus()
@@ -191,6 +205,7 @@ class DeviceInfo : public QObject
191205
void noiseControlModeChanged(NoiseControlMode mode);
192206
void noiseControlModeChangedInt(int mode);
193207
void conversationalAwarenessChanged(bool enabled);
208+
void hearingAidEnabledChanged(bool enabled);
194209
void adaptiveNoiseLevelChanged(int level);
195210
void deviceNameChanged(const QString &name);
196211
void primaryChanged();
@@ -202,6 +217,7 @@ class DeviceInfo : public QObject
202217
QString m_batteryStatus;
203218
NoiseControlMode m_noiseControlMode = NoiseControlMode::Transparency;
204219
bool m_conversationalAwareness = false;
220+
bool m_hearingAidEnabled = false;
205221
int m_adaptiveNoiseLevel = 50;
206222
QString m_deviceName;
207223
Battery *m_battery;

0 commit comments

Comments
 (0)