Skip to content

Instantly share code, notes, and snippets.

@rithvikvibhu
Created September 25, 2025 12:45
Show Gist options
  • Save rithvikvibhu/45e24bbe5ade30125f152383daf07016 to your computer and use it in GitHub Desktop.
Save rithvikvibhu/45e24bbe5ade30125f152383daf07016 to your computer and use it in GitHub Desktop.
Apple Airpods Bluetooth Packets

Apple Airpods

Page: Hearing Assitance

Heading Aid toggle

dump: hearing-aid-toggle.pklg

  1. Off -> On
  2. On -> Off

Off -> On

Sends 3 packets:

[ 04 00 04 00 09 00 2F 02 00 00 00 ]
[ 04 00 04 00 09 00 33 01 00 00 00 ]
[ 04 00 04 00 09 00 2C 01 01 00 00 ]

receives a large packet (559 bytes): see dump.

On -> Off

Sends 3 packets:

[ 04 00 04 00 09 00 2F 02 00 00 00 ]  
[ 04 00 04 00 09 00 33 02 00 00 00 ]  
[ 04 00 04 00 09 00 2C 01 02 00 00 ]  

receives a large packet (559 bytes): see dump.

Media Assist toggle

dump: media-assist-toggle.pklg

  1. Off -> On
  2. On -> Off

Off -> On

Sends 2 packets:

[ 04 00 04 00 09 00 33 01 00 00 00 ]
[
    04 00 04 00 53 00 84 00 02 02
    01 01
    08 AC 8E 41 D9 CE 8F 41 1B 2F 8F 41 BA 49 9C 41 BA 49 A8 41 B6 F3 D0 41 C9 76 F6 41 C9 76 F6 41
    08 AC 8E 41 D9 CE 8F 41 1B 2F 8F 41 BA 49 9C 41 BA 49 A8 41 B6 F3 D0 41 C9 76 F6 41 C9 76 F6 41
    08 AC 8E 41 D9 CE 8F 41 1B 2F 8F 41 BA 49 9C 41 BA 49 A8 41 B6 F3 D0 41 C9 76 F6 41 C9 76 F6 41
    08 AC 8E 41 D9 CE 8F 41 1B 2F 8F 41 BA 49 9C 41 BA 49 A8 41 B6 F3 D0 41 C9 76 F6 41 C9 76 F6 41
] -- headphone accomodation

On -> Off

Sends 2 packets:

[ 04 00 04 00 09 00 33 02 00 00 00 ]
[
    04 00 04 00 53 00 84 00 02 02
    02 02
    08 AC 8E 41 D9 CE 8F 41 1B 2F 8F 41 BA 49 9C 41 BA 49 A8 41 B6 F3 D0 41 C9 76 F6 41 C9 76 F6 41
    08 AC 8E 41 D9 CE 8F 41 1B 2F 8F 41 BA 49 9C 41 BA 49 A8 41 B6 F3 D0 41 C9 76 F6 41 C9 76 F6 41
    08 AC 8E 41 D9 CE 8F 41 1B 2F 8F 41 BA 49 9C 41 BA 49 A8 41 B6 F3 D0 41 C9 76 F6 41 C9 76 F6 41
    08 AC 8E 41 D9 CE 8F 41 1B 2F 8F 41 BA 49 9C 41 BA 49 A8 41 B6 F3 D0 41 C9 76 F6 41 C9 76 F6 41
] -- headphone accomodation

Media Assist options

Only visible when Media Assist is enabled.

dump: media-assist-options.pklg

  1. MV: Off -> On

  2. MV: On -> Off

  3. CF: Off -> On

  4. CF: On -> Off

  5. MV: Off -> On

  6. CF: Off -> On

  7. MV: On -> Off

  8. CF: On -> Off

Adjust Music and Video

See existing Headphone Accomodation. Sets Meida byte.

Adjust Calls and FaceTime

See existing Headphone Accomodation. Sets Phone byte.

Hearing Accomodation

Check existing AAP Definition.

Note that the byte before Phone may also be 0x0. See examples in audiogram below.

04 00 04 00 53 00 84 00 02 00 [Phone] [Media] ...

Hearing Assistance Packet

  • 107 bytes
  • 125 Hz and 750 Hz are ignored
  • Other missing values are interpolated with averages (see audiogram 2)
-- header
52 2A 00 02 02 64 00

-- left ear frequencies
for freq_value in left_ear:
    [single-precison 4 byte]

-- left ear adjustments
xx xx xx xx -- balanced amplitude
xx xx xx xx -- tone
xx xx xx xx -- conversation boost
xx xx xx xx -- ambient noise reduction

-- right ear frequencies
for freq_value in right_ear:
    [single-precison 4 byte]

-- right ear adjustments
xx xx xx xx -- balanced amplitude
xx xx xx xx -- tone
xx xx xx xx -- conversation boost
xx xx xx xx -- ambient noise reduction

-- constant
00 00 00 3F

Update Hearing Test Results

dump: update-hearing-test-results-4.pklg

  1. Audiogram 1 - artificial values, easy to map
  2. Audiogram 2 - real test result
  • Sends 8 packets on last page of flow.
  • The first packet (107 bytes) contains all frequencies and adjustments
  • The last packet (140 bytes) is Hearing Accomodation.

Audiogram 1

Audiogram used: sep 24 - avg: 35,55

Frequency (Hz) Left Ear (dB HL) Right Ear (dB HL)
125 30 50
250 31 51
500 32 52
750 33 53
1000 34 54
2000 36 56
3000 37 57
4000 38 58
6000 39 59
8000 40 60
[
    52 2A 00 02 02 64 00
    00 00 F8 41 -- 31
    00 00 00 42 -- 32
    00 00 08 42 -- 34
    00 00 10 42 -- 36
    00 00 14 42 -- 37
    00 00 18 42 -- 38
    00 00 1C 42 -- 39
    00 00 20 42 -- 40
    00 00 00 00 -- balanced amplitude
    00 00 00 00 -- tone
    00 00 00 00 -- conversation boost
    00 00 00 00 -- ambient noise reduction

    00 00 4C 42 -- 51
    00 00 50 42
    00 00 58 42
    00 00 60 42
    00 00 64 42
    00 00 68 42
    00 00 6C 42
    00 00 70 42 -- 60
    00 00 00 00
    00 00 00 00
    00 00 00 00
    00 00 00 00

    00 00 00 3F
]

[ 04 00 04 00 09 00 2C 01 01 00 00 ]
[ 04 00 04 00 09 00 2F 02 00 00 00 ]
[ 04 00 04 00 09 00 33 01 00 00 00 ]
[ 04 00 04 00 09 00 2C 01 01 00 00 ]
[ 04 00 04 00 09 00 0D 03 00 00 00 ] -- set transparency
[ 04 00 04 00 09 00 33 01 00 00 00 ]
[
    04 00 04 00 53 00 84 00 02 00 01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
] -- headphone accomodation

Audiogram 2

Audiogram used: mar 5 - avg: 74,21

Frequency (Hz) Left Ear (dB HL) Right Ear (dB HL)
250 65 20
500 70 20
1000 70 20
2000 70 20
4000 85 25
6000 85 35
8000 90 50
[
    52 2A 00 02 02 64 00
    00 00 82 42
    00 00 8C 42
    00 00 8C 42
    00 00 8C 42
    00 00 9B 42
    00 00 AA 42
    00 00 AA 42
    00 00 B4 42

    00 00 00 00
    00 00 00 00
    00 00 00 00
    00 00 00 00

    00 00 A0 41
    00 00 A0 41
    00 00 A0 41
    00 00 A0 41
    00 00 B4 41
    00 00 C8 41
    00 00 0C 42
    00 00 48 42

    00 00 00 00
    00 00 00 00
    00 00 00 00
    00 00 00 00

    00 00 00 3F
]

[ 04 00 04 00 09 00 2C 01 02 00 00 ]
[ 04 00 04 00 09 00 2F 02 00 00 00 ]
[ 04 00 04 00 09 00 33 01 00 00 00 ]
[ 04 00 04 00 09 00 2C 01 01 00 00 ]
[ 04 00 04 00 09 00 0D 03 00 00 00 ] -- set transparency
[ 04 00 04 00 09 00 33 01 00 00 00 ]
[
    04 00 04 00 53 00 84 00 02 00 01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
] -- headphone accomodation

Page: Adjustments

Amplification

dump: adj-amplification.pklg

  1. 0% (= -1)
  2. 100% (= 1)
  3. ~50% (= ~0)

Amplification is in range -1 to 1.

[
    52 2A 00 02 02 64 00 00 00 F8 41 00 00 00 42 00 00 08 42 00 00 10 42 00 00 14 42 00 00 18 42 00 00 1C 42 00 00 20 42 00 00 80 BF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4C 42 00 00 50 42 00 00 58 42 00 00 60 42 00 00 64 42 00 00 68 42 00 00 6C 42 00 00 70 42 00 00 80 BF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3F
]
[
    52 2A 00 02 02 64 00 00 00 F8 41 00 00 00 42 00 00 08 42 00 00 10 42 00 00 14 42 00 00 18 42 00 00 1C 42 00 00 20 42 00 00 80 3F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4C 42 00 00 50 42 00 00 58 42 00 00 60 42 00 00 64 42 00 00 68 42 00 00 6C 42 00 00 70 42 00 00 80 3F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3F
]
[
    52 2A 00 02 02 64 00 00 00 F8 41 00 00 00 42 00 00 08 42 00 00 10 42 00 00 14 42 00 00 18 42 00 00 1C 42 00 00 20 42 80 16 CE BB 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4C 42 00 00 50 42 00 00 58 42 00 00 60 42 00 00 64 42 00 00 68 42 00 00 6C 42 00 00 70 42 80 16 CE BB 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3F
]

Swipe to Control Amplification

dump: adj-swipe-amplification-toggle.pklg

  1. Off -> On
  2. On -> Off

(enable = 0x01, disabled = 0x02)

Off -> On

[ 04 00 04 00 09 00 2F 01 00 00 00 ]

On -> Off

[ 04 00 04 00 09 00 2F 02 00 00 00 ]

Balance

dump: adj-balance.pklg (amplification at 0 at first)

  1. L
  2. R
  3. mid
  4. increase amplification to max (1)
  5. L
  6. R
  7. mid
Left and Right values

with ampl = ~0:
    L: 0.4937107, -0.5062893 = ~(+0.5, -0.5)
    R: -0.5062893, 0.4937107 = ~(-0.5, +0.5)
    m: 0.0046361387, -0.017214745 = ~(0, 0)

with ampl = 1:
    L: 1.5, 0.5
    R: 0.50642675, 1.4935732 = ~(0.5, 1.5)
    m: 1.0051415, 0.9948585 = ~(1, 1)

Looks like balance moves at most 0.5 amplitude from one ear to the other.

-- with ampl = ~0:
[
    52 2A 00 02 02 64 00 00 00 F8 41 00 00 00 42 00 00 08 42 00 00 10 42 00 00 14 42 00 00 18 42 00 00 1C 42 00 00 20 42 A6 C7 FC 3E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4C 42 00 00 50 42 00 00 58 42 00 00 60 42 00 00 64 42 00 00 68 42 00 00 6C 42 00 00 70 42 2D 9C 01 BF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3F
]
[
    52 2A 00 02 02 64 00 00 00 F8 41 00 00 00 42 00 00 08 42 00 00 10 42 00 00 14 42 00 00 18 42 00 00 1C 42 00 00 20 42 2D 9C 01 BF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4C 42 00 00 50 42 00 00 58 42 00 00 60 42 00 00 64 42 00 00 68 42 00 00 6C 42 00 00 70 42 A6 C7 FC 3E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3F
]
[
    52 2A 00 02 02 64 00 00 00 F8 41 00 00 00 42 00 00 08 42 00 00 10 42 00 00 14 42 00 00 18 42 00 00 1C 42 00 00 20 42 C0 EA 97 3B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4C 42 00 00 50 42 00 00 58 42 00 00 60 42 00 00 64 42 00 00 68 42 00 00 6C 42 00 00 70 42 F0 05 8D BC 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3F
]

-- with ampl = 1:
[
    52 2A 00 02 02 64 00 00 00 F8 41 00 00 00 42 00 00 08 42 00 00 10 42 00 00 14 42 00 00 18 42 00 00 1C 42 00 00 20 42 00 00 C0 3F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4C 42 00 00 50 42 00 00 58 42 00 00 60 42 00 00 64 42 00 00 68 42 00 00 6C 42 00 00 70 42 00 00 00 3F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3F
]
[
    52 2A 00 02 02 64 00 00 00 F8 41 00 00 00 42 00 00 08 42 00 00 10 42 00 00 14 42 00 00 18 42 00 00 1C 42 00 00 20 42 2F A5 01 3F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4C 42 00 00 50 42 00 00 58 42 00 00 60 42 00 00 64 42 00 00 68 42 00 00 6C 42 00 00 70 42 68 2D BF 3F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3F
]
[
    52 2A 00 02 02 64 00 00 00 F8 41 00 00 00 42 00 00 08 42 00 00 10 42 00 00 14 42 00 00 18 42 00 00 1C 42 00 00 20 42 7A A8 80 3F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4C 42 00 00 50 42 00 00 58 42 00 00 60 42 00 00 64 42 00 00 68 42 00 00 6C 42 00 00 70 42 0C AF 7E 3F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3F
]

Tone

dump: adj-tone.pklg

  1. Darker
  2. Brighter
  3. mid

Tone ranges from -1 (darker) to +1 (brighter). Applies to both ears.

-1, -1 0.9357326, 0.9357326 = ~(1, 1) 0, 0

[
    52 2A 00 02 02 64 00 00 00 F8 41 00 00 00 42 00 00 08 42 00 00 10 42 00 00 14 42 00 00 18 42 00 00 1C 42 00 00 20 42 80 08 E7 3C 00 00 80 BF 00 00 00 00 00 00 00 00 00 00 4C 42 00 00 50 42 00 00 58 42 00 00 60 42 00 00 64 42 00 00 68 42 00 00 6C 42 00 00 70 42 80 CB 92 3C 00 00 80 BF 00 00 00 00 00 00 00 00 00 00 00 3F
]
[
    52 2A 00 02 02 64 00 00 00 F8 41 00 00 00 42 00 00 08 42 00 00 10 42 00 00 14 42 00 00 18 42 00 00 1C 42 00 00 20 42 80 08 E7 3C 2C 8C 6F 3F 00 00 00 00 00 00 00 00 00 00 4C 42 00 00 50 42 00 00 58 42 00 00 60 42 00 00 64 42 00 00 68 42 00 00 6C 42 00 00 70 42 80 CB 92 3C 2C 8C 6F 3F 00 00 00 00 00 00 00 00 00 00 00 3F
]
[
    52 2A 00 02 02 64 00 00 00 F8 41 00 00 00 42 00 00 08 42 00 00 10 42 00 00 14 42 00 00 18 42 00 00 1C 42 00 00 20 42 80 08 E7 3C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4C 42 00 00 50 42 00 00 58 42 00 00 60 42 00 00 64 42 00 00 68 42 00 00 6C 42 00 00 70 42 80 CB 92 3C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3F
]

Ambient Noise Reduction

dump: adj-ambient-noise-reduction.pklg

  1. Less
  2. More
  3. mid

Ambient Noise Reduction ranges from 0 (less) to 1 (more). Applies to both ears.

0, 0 1, 1 0.5044987, 0.5044987 = ~(0.5, 0.5)

[
    52 2A 00 02 02 64 00 00 00 F8 41 00 00 00 42 00 00 08 42 00 00 10 42 00 00 14 42 00 00 18 42 00 00 1C 42 00 00 20 42 80 08 E7 3C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4C 42 00 00 50 42 00 00 58 42 00 00 60 42 00 00 64 42 00 00 68 42 00 00 6C 42 00 00 70 42 80 CB 92 3C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3F
]
[
    52 2A 00 02 02 64 00 00 00 F8 41 00 00 00 42 00 00 08 42 00 00 10 42 00 00 14 42 00 00 18 42 00 00 1C 42 00 00 20 42 80 08 E7 3C 00 00 00 00 00 00 00 00 00 00 80 3F 00 00 4C 42 00 00 50 42 00 00 58 42 00 00 60 42 00 00 64 42 00 00 68 42 00 00 6C 42 00 00 70 42 80 CB 92 3C 00 00 00 00 00 00 00 00 00 00 80 3F 00 00 00 3F
]
[
    52 2A 00 02 02 64 00 00 00 F8 41 00 00 00 42 00 00 08 42 00 00 10 42 00 00 14 42 00 00 18 42 00 00 1C 42 00 00 20 42 80 08 E7 3C 00 00 00 00 00 00 00 00 D4 26 01 3F 00 00 4C 42 00 00 50 42 00 00 58 42 00 00 60 42 00 00 64 42 00 00 68 42 00 00 6C 42 00 00 70 42 80 CB 92 3C 00 00 00 00 00 00 00 00 D4 26 01 3F 00 00 00 3F
]

Conversation Boost

dump: adj-convo-boost.pklg

  1. Off -> On
  2. On -> Off

Conversation Boost is a toggle, but the value is a single-precision float:

  • 00 00 80 3F = 1 = on
  • 00 00 00 00 = 0 = off

Values between 0 and 1 may be valid.

[
    52 2A 00 02 02 64 00 00 00 F8 41 00 00 00 42 00 00 08 42 00 00 10 42 00 00 14 42 00 00 18 42 00 00 1C 42 00 00 20 42 80 08 E7 3C 00 00 00 00 00 00 80 3F D4 26 01 3F 00 00 4C 42 00 00 50 42 00 00 58 42 00 00 60 42 00 00 64 42 00 00 68 42 00 00 6C 42 00 00 70 42 80 CB 92 3C 00 00 00 00 00 00 80 3F D4 26 01 3F 00 00 00 3F
]
[
    52 2A 00 02 02 64 00 00 00 F8 41 00 00 00 42 00 00 08 42 00 00 10 42 00 00 14 42 00 00 18 42 00 00 1C 42 00 00 20 42 80 08 E7 3C 00 00 00 00 00 00 00 00 D4 26 01 3F 00 00 4C 42 00 00 50 42 00 00 58 42 00 00 60 42 00 00 64 42 00 00 68 42 00 00 6C 42 00 00 70 42 80 CB 92 3C 00 00 00 00 00 00 00 00 D4 26 01 3F 00 00 00 3F
]

Reset all Tunings

dump: adj-reset-all-tunings.pklg

  1. Reset All Tunings

Zeroes out everything for:

  • balanced amplitude - default: mid
  • tone - default: mid
  • conversation boost - default: off
  • ambient noise reduction - default: less
[
    52 2A 00 02 02 64 00 00 00 F8 41 00 00 00 42 00 00 08 42 00 00 10 42 00 00 14 42 00 00 18 42 00 00 1C 42 00 00 20 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4C 42 00 00 50 42 00 00 58 42 00 00 60 42 00 00 64 42 00 00 68 42 00 00 6C 42 00 00 70 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3F
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment