Skip to content

Commit d9359cd

Browse files
Copilotkavishdevar
andauthored
android: add option for alternate head tracking packets (#176)
* Initial plan * Add option for alternate head tracking packets Co-authored-by: kavishdevar <46088622+kavishdevar@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: kavishdevar <46088622+kavishdevar@users.noreply.github.com>
1 parent db563fa commit d9359cd

3 files changed

Lines changed: 74 additions & 3 deletions

File tree

android/app/src/main/java/me/kavishdevar/librepods/screens/AppSettingsScreen.kt

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,10 @@ fun AppSettingsScreen(navController: NavController) {
179179
mutableStateOf(sharedPreferences.getBoolean("takeover_when_media_start", true))
180180
}
181181

182+
var useAlternateHeadTrackingPackets by remember {
183+
mutableStateOf(sharedPreferences.getBoolean("use_alternate_head_tracking_packets", false))
184+
}
185+
182186
var mDensity by remember { mutableFloatStateOf(0f) }
183187

184188
fun validateHexInput(input: String): Boolean {
@@ -1040,6 +1044,47 @@ fun AppSettingsScreen(navController: NavController) {
10401044
}
10411045
}
10421046

1047+
Row(
1048+
modifier = Modifier
1049+
.fillMaxWidth()
1050+
.clickable(
1051+
indication = null,
1052+
interactionSource = remember { MutableInteractionSource() }
1053+
) {
1054+
useAlternateHeadTrackingPackets = !useAlternateHeadTrackingPackets
1055+
sharedPreferences.edit().putBoolean("use_alternate_head_tracking_packets", useAlternateHeadTrackingPackets).apply()
1056+
},
1057+
verticalAlignment = Alignment.CenterVertically
1058+
) {
1059+
Column(
1060+
modifier = Modifier
1061+
.weight(1f)
1062+
.padding(vertical = 8.dp)
1063+
.padding(end = 4.dp)
1064+
) {
1065+
Text(
1066+
text = "Use alternate head tracking packets",
1067+
fontSize = 16.sp,
1068+
color = textColor
1069+
)
1070+
Spacer(modifier = Modifier.height(4.dp))
1071+
Text(
1072+
text = "Enable this if head tracking doesn't work for you. This sends different data to AirPods for requesting/stopping head tracking data.",
1073+
fontSize = 14.sp,
1074+
color = textColor.copy(0.6f),
1075+
lineHeight = 16.sp,
1076+
)
1077+
}
1078+
1079+
StyledSwitch(
1080+
checked = useAlternateHeadTrackingPackets,
1081+
onCheckedChange = {
1082+
useAlternateHeadTrackingPackets = it
1083+
sharedPreferences.edit().putBoolean("use_alternate_head_tracking_packets", it).apply()
1084+
}
1085+
)
1086+
}
1087+
10431088
Row(
10441089
modifier = Modifier
10451090
.fillMaxWidth()

android/app/src/main/java/me/kavishdevar/librepods/services/AirPodsService.kt

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1068,7 +1068,7 @@ class AirPodsService : Service(), SharedPreferences.OnSharedPreferenceChangeList
10681068
if (isInCall) return
10691069
if (config.headGestures) {
10701070
initGestureDetector()
1071-
aacpManager.sendStartHeadTracking()
1071+
startHeadTracking()
10721072
gestureDetector?.startDetection { accepted ->
10731073
if (accepted) {
10741074
answerCall()
@@ -2131,12 +2131,22 @@ class AirPodsService : Service(), SharedPreferences.OnSharedPreferenceChangeList
21312131

21322132
fun startHeadTracking() {
21332133
isHeadTrackingActive = true
2134-
aacpManager.sendStartHeadTracking()
2134+
val useAlternatePackets = sharedPreferences.getBoolean("use_alternate_head_tracking_packets", false)
2135+
if (useAlternatePackets) {
2136+
aacpManager.sendDataPacket(aacpManager.createAlternateStartHeadTrackingPacket())
2137+
} else {
2138+
aacpManager.sendStartHeadTracking()
2139+
}
21352140
HeadTracking.reset()
21362141
}
21372142

21382143
fun stopHeadTracking() {
2139-
aacpManager.sendStopHeadTracking()
2144+
val useAlternatePackets = sharedPreferences.getBoolean("use_alternate_head_tracking_packets", false)
2145+
if (useAlternatePackets) {
2146+
aacpManager.sendDataPacket(aacpManager.createAlternateStopHeadTrackingPacket())
2147+
} else {
2148+
aacpManager.sendStopHeadTracking()
2149+
}
21402150
isHeadTrackingActive = false
21412151
}
21422152

android/app/src/main/java/me/kavishdevar/librepods/utils/AACPManager.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,14 @@ class AACPManager {
370370
return opcode + data
371371
}
372372

373+
fun createAlternateStartHeadTrackingPacket(): ByteArray {
374+
val opcode = byteArrayOf(Opcodes.HEADTRACKING, 0x00)
375+
val data = byteArrayOf(
376+
0x00, 0x00, 0x10, 0x00, 0x0F, 0x00, 0x08, 0x73, 0x42, 0x0B, 0x08, 0x10, 0x10, 0x02, 0x1A, 0x05, 0x01, 0x40, 0x9C.toByte(), 0x00, 0x00
377+
)
378+
return opcode + data
379+
}
380+
373381
fun sendStopHeadTracking(): Boolean {
374382
return sendDataPacket(createStopHeadTrackingPacket())
375383
}
@@ -382,6 +390,14 @@ class AACPManager {
382390
return opcode + data
383391
}
384392

393+
fun createAlternateStopHeadTrackingPacket(): ByteArray {
394+
val opcode = byteArrayOf(Opcodes.HEADTRACKING, 0x00)
395+
val data = byteArrayOf(
396+
0x00, 0x00, 0x10, 0x00, 0x0F, 0x00, 0x08, 0x75, 0x42, 0x0B, 0x08, 0x10, 0x10, 0x02, 0x1A, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00
397+
)
398+
return opcode + data
399+
}
400+
385401
fun sendRename(name: String): Boolean {
386402
return sendDataPacket(createRenamePacket(name))
387403
}

0 commit comments

Comments
 (0)