SpriteOvO / AirPodsDesktop

☄️ AirPods desktop user experience enhancement program, for Windows and Linux (WIP)
GNU General Public License v3.0
1.48k stars 87 forks source link

[Bug Report] AirPods Max do not bind. #26

Closed Beamy68 closed 1 year ago

Beamy68 commented 2 years ago

:bug: Describe the bug

AirPods Max do not bind to the program.

:scroll: To Reproduce

Steps to reproduce the behavior:

  1. Have AirPods Max paired in Windows Settings.
  2. Launch the program.
  3. Click on the program in system tray.
  4. Click "Bind to AirPods"

:rocket: Expected behavior

I expected it to Bind.

:framed_picture: Screenshots

image

:gear: Environments:

SpriteOvO commented 2 years ago

@Beamy68 Thanks for the report!

Could you launch this program with --trace parameter and post the log contents here? AirPods Max is currently unsupported, as I don't have a device to test. If you could provide enough information, I would be happy to attempt to support it.

gir489returns commented 2 years ago

@SpriteOvO here are the logs:

[2022-04-04 01:21:25.610] [Main] [info] [Application.cpp:123] Build git hash: '0b64ad3ed9dff1b09e6d3bef9cd3bcece49b8613'[2022-04-04 01:21:25.611] [Main] [info] [Application.cpp:128] Build configuration: Not Debug [2022-04-04 01:21:25.611] [Main] [info] [Application.cpp:131] Opts: { trace: true } [2022-04-04 01:21:25.611] [Main] [info] [Logger.cpp:93] Clean up old log file: 'AirPodsDesktop.1.log' doesn't exist, break the loop [2022-04-04 01:21:25.612] [Main] [warning] [Windows.h:170] Winrt initialize failed. Code: -0x7ffefefa, Message: Cannot change thread mode after it is set. [2022-04-04 01:21:25.613] [Main] [info] [Settings.cpp:163] Load key succeeded. Key: 'abi_version', Value: '1' [2022-04-04 01:21:25.613] [Main] [info] [Settings.cpp:163] Load key succeeded. Key: 'language_locale', Value: '' [2022-04-04 01:21:25.613] [Main] [info] [Settings.cpp:163] Load key succeeded. Key: 'auto_run', Value: 'true' [2022-04-04 01:21:25.613] [Main] [info] [Settings.cpp:163] Load key succeeded. Key: 'low_audio_latency', Value: 'false' [2022-04-04 01:21:25.613] [Main] [info] [Settings.cpp:163] Load key succeeded. Key: 'automatic_ear_detection', Value: 'true' [2022-04-04 01:21:25.613] [Main] [info] [Settings.cpp:163] Load key succeeded. Key: 'skipped_version', Value: '' [2022-04-04 01:21:25.613] [Main] [info] [Settings.cpp:163] Load key succeeded. Key: 'rssi_min', Value: '-80' [2022-04-04 01:21:25.614] [Main] [warning] [Settings.cpp:133] The setting key 'reduce_loud_sounds' not found. Current value 'false'. [2022-04-04 01:21:25.614] [Main] [warning] [Settings.cpp:133] The setting key 'loud_volume_level' not found. Current value '40'. [2022-04-04 01:21:25.614] [Main] [info] [Settings.cpp:167] Load key succeeded. Key: 'device_address', Value: ' MAYBE NO VALUE ' [2022-04-04 01:21:25.614] [Main] [info] [Settings.cpp:163] Load key succeeded. Key: 'tray_icon_battery', Value: '2' [2022-04-04 01:21:25.614] [Main] [info] [Application.cpp:236] currentLocale: en_US [2022-04-04 01:21:25.615] [Main] [info] [Application.cpp:240] Locale from settings: '' [2022-04-04 01:21:25.615] [Main] [info] [Application.cpp:198] SetTranslator() locale: en_US [2022-04-04 01:21:25.615] [Main] [warning] [Application.cpp:221] Try to set a same locale name 'en_US', ignore [2022-04-04 01:21:26.018] [Main] [info] [MainWindow.cpp:270] MainWindow::Unavailable [2022-04-04 01:21:26.023] [Main] [info] [Update.cpp:392] Checking update... [2022-04-04 01:21:26.081] [Main] [info] [LowAudioLatency.cpp:68] LowAudioLatency: Init successful. _enabled: false [2022-04-04 01:21:26.082] [Main] [info] [Settings.cpp:275] ApplyWithoutLock [2022-04-04 01:21:26.082] [Main] [info] [Settings.cpp:44] OnApply_language_locale: [2022-04-04 01:21:26.082] [Main] [info] [Application.cpp:198] SetTranslator() locale: en_US [2022-04-04 01:21:26.082] [Main] [warning] [Application.cpp:221] Try to set a same locale name 'en_US', ignore [2022-04-04 01:21:26.083] [Main] [info] [Settings.cpp:52] OnApply_auto_run: true [2022-04-04 01:21:26.083] [Main] [info] [Settings.cpp:73] OnApply_low_audio_latency: false [2022-04-04 01:21:26.083] [Main] [info] [LowAudioLatency.cpp:79] LowAudioLatency::Controller Control: false, _inited: true [2022-04-04 01:21:26.083] [Main] [info] [Settings.cpp:80] OnApply_automatic_ear_detection: true [2022-04-04 01:21:26.083] [Main] [info] [Settings.cpp:88] OnApply_rssi_min: -80 [2022-04-04 01:21:26.083] [Main] [info] [Settings.cpp:95] OnApply_device_address: MAYBE NO VALUE [2022-04-04 01:21:26.084] [Main] [info] [MainWindow.cpp:301] MainWindow::Unbind [2022-04-04 01:21:26.085] [Main] [info] [AirPods.cpp:182] StateManager: Disconnect. [2022-04-04 01:21:26.085] [Main] [info] [AirPods.cpp:424] Unbind device. [2022-04-04 01:21:26.085] [Main] [info] [Settings.cpp:109] OnApply_tray_icon_battery: 2 [2022-04-04 01:21:26.092] [Main] [info] [Bluetooth_win.cpp:300] Bluetooth AdvWatcher start succeeded. [2022-04-04 01:21:26.093] [Main] [info] [MainWindow.cpp:259] MainWindow::Available [2022-04-04 01:21:26.093] [Main] [info] [AirPods.cpp:558] Bluetooth AdvWatcher started. [2022-04-04 01:21:26.095] [Main] [info] [AirPods.cpp:387] Bluetooth AdvWatcher start succeeded. [2022-04-04 01:21:26.147] [Main] [info] [Update.cpp:123] ParseSRResponse: Asset name: 'AirPodsDesktop-0.3.2-win32.exe', size: 24903377, downloadUrl: 'https://github.com/SpriteOvO/AirPodsDesktop/releases/download/0.3.2/AirPodsDesktop-0.3.2-win32.exe'. [2022-04-04 01:21:26.148] [Main] [info] [Update.cpp:144] ParseSRResponse: Found matching file. [2022-04-04 01:21:26.149] [Main] [info] [Update.cpp:241] IsCurrentPreRelease: returns true. [2022-04-04 01:21:26.149] [Main] [info] [Update.cpp:276] Update: isCurrentPreRelease: 'true' [2022-04-04 01:21:26.343] [Main] [info] [Update.cpp:123] ParseSRResponse: Asset name: 'AirPodsDesktop-0.3.2-win32.exe', size: 24903377, downloadUrl: 'https://github.com/SpriteOvO/AirPodsDesktop/releases/download/0.3.2/AirPodsDesktop-0.3.2-win32.exe'. [2022-04-04 01:21:26.344] [Main] [info] [Update.cpp:144] ParseSRResponse: Found matching file. [2022-04-04 01:21:26.346] [Main] [info] [Update.cpp:287] Update: Latest version: '0.3.2' [2022-04-04 01:21:26.346] [Main] [info] [Update.cpp:289] Update: No need to update. [2022-04-04 01:21:30.138] [Main] [info] [AirPods.cpp:536] AirPods advertisement received, but device disconnected. [2022-04-04 01:21:31.438] [Main] [info] [AirPods.cpp:536] AirPods advertisement received, but device disconnected. [2022-04-04 01:21:32.379] [Main] [info] [AirPods.cpp:536] AirPods advertisement received, but device disconnected. [2022-04-04 01:21:33.678] [Main] [info] [AirPods.cpp:536] AirPods advertisement received, but device disconnected. [2022-04-04 01:21:34.618] [Main] [info] [AirPods.cpp:536] AirPods advertisement received, but device disconnected.

SpriteOvO commented 2 years ago

@gir489returns The logs provided are missing some necessary information, could you launch the AirPodsDesktop downloaded from commit c9db0ad's CI artifact with --trace parameter and post the new logs here? Thanks for the help!

gir489returns commented 2 years ago

@SpriteOvO I tried getting the project to build to work in VS2019 but the instructions suck ass and gave up around trying to get QT installed. I set C:\Qt to an additional PATH variable restarted, but CMAKE was still complaining.

Here's the pertinent logs.

PS C:\Users\Robert\Desktop\Test> .\AirPodsDesktop.exe --trace

PS C:\Users\Robert\Desktop\Test> .\AirPodsDesktop.exe --trace [2022-04-04 01:55:49.102] [Main] [info] [Application.cpp:121] Launched. Version: '0.3.2' [2022-04-04 01:55:49.103] [Main] [info] [Application.cpp:123] Build git hash: 'c9db0ad293d223a291e931be956a44e518be8f05'[2022-04-04 01:55:49.103] [Main] [info] [Application.cpp:128] Build configuration: Not Debug [2022-04-04 01:55:49.103] [Main] [info] [Application.cpp:131] Opts: { trace: true } [2022-04-04 01:55:49.103] [Main] [info] [Logger.cpp:93] Clean up old log file: 'AirPodsDesktop.1.log' doesn't exist, break the loop [2022-04-04 01:55:49.117] [Main] [warning] [Windows.h:181] Winrt initialize failed. Code: -0x7ffefefa, Message: Cannot change thread mode after it is set. [2022-04-04 01:55:49.118] [Main] [info] [Settings.cpp:170] Load key succeeded. Key: 'abi_version', Value: '1' [2022-04-04 01:55:49.119] [Main] [info] [Settings.cpp:170] Load key succeeded. Key: 'language_locale', Value: '' [2022-04-04 01:55:49.119] [Main] [info] [Settings.cpp:170] Load key succeeded. Key: 'auto_run', Value: 'true' [2022-04-04 01:55:49.119] [Main] [info] [Settings.cpp:170] Load key succeeded. Key: 'low_audio_latency', Value: 'false' [2022-04-04 01:55:49.119] [Main] [info] [Settings.cpp:170] Load key succeeded. Key: 'automatic_ear_detection', Value: 'true' [2022-04-04 01:55:49.120] [Main] [info] [Settings.cpp:170] Load key succeeded. Key: 'skipped_version', Value: '' [2022-04-04 01:55:49.120] [Main] [info] [Settings.cpp:170] Load key succeeded. Key: 'rssi_min', Value: '-80' [2022-04-04 01:55:49.120] [Main] [warning] [Settings.cpp:140] The setting key 'reduce_loud_sounds' not found. Current value 'false'. [2022-04-04 01:55:49.120] [Main] [warning] [Settings.cpp:140] The setting key 'loud_volume_level' not found. Current value '40'. [2022-04-04 01:55:49.121] [Main] [info] [Settings.cpp:174] Load key succeeded. Key: 'device_address', Value: ' MAYBE NO VALUE ' [2022-04-04 01:55:49.121] [Main] [info] [Settings.cpp:170] Load key succeeded. Key: 'tray_icon_battery', Value: '2' [2022-04-04 01:55:49.121] [Main] [warning] [Settings.cpp:140] The setting key 'battery_on_taskbar' not found. Current value '0'. [2022-04-04 01:55:49.121] [Main] [info] [Application.cpp:237] currentLocale: en_US [2022-04-04 01:55:49.121] [Main] [info] [Application.cpp:241] Locale from settings: '' [2022-04-04 01:55:49.121] [Main] [info] [Application.cpp:199] SetTranslator() locale: en_US [2022-04-04 01:55:49.121] [Main] [warning] [Application.cpp:222] Try to set a same locale name 'en_US', ignore [2022-04-04 01:55:49.350] [Main] [info] [TaskbarStatus.cpp:133] Is Windows 11 or greater: 'false' [2022-04-04 01:55:49.577] [Main] [info] [MainWindow.cpp:271] MainWindow::Unavailable [2022-04-04 01:55:49.580] [Main] [info] [Update.cpp:392] Checking update... [2022-04-04 01:55:49.699] [Main] [info] [LowAudioLatency.cpp:68] LowAudioLatency: Init successful. _enabled: false [2022-04-04 01:55:49.700] [Main] [info] [Settings.cpp:282] ApplyWithoutLock [2022-04-04 01:55:49.700] [Main] [info] [Settings.cpp:44] OnApply_language_locale: [2022-04-04 01:55:49.700] [Main] [info] [Application.cpp:199] SetTranslator() locale: en_US [2022-04-04 01:55:49.700] [Main] [warning] [Application.cpp:222] Try to set a same locale name 'en_US', ignore [2022-04-04 01:55:49.700] [Main] [info] [Settings.cpp:52] OnApply_auto_run: true [2022-04-04 01:55:49.700] [Main] [info] [Settings.cpp:73] OnApply_low_audio_latency: false [2022-04-04 01:55:49.701] [Main] [info] [LowAudioLatency.cpp:79] LowAudioLatency::Controller Control: false, _inited: true [2022-04-04 01:55:49.701] [Main] [info] [Settings.cpp:80] OnApply_automatic_ear_detection: true [2022-04-04 01:55:49.701] [Main] [info] [Settings.cpp:88] OnApply_rssi_min: -80 [2022-04-04 01:55:49.701] [Main] [info] [Settings.cpp:95] OnApply_device_address: MAYBE NO VALUE [2022-04-04 01:55:49.701] [Main] [info] [MainWindow.cpp:304] MainWindow::Unbind [2022-04-04 01:55:49.703] [Main] [info] [AirPods.cpp:182] StateManager: Disconnect. [2022-04-04 01:55:49.703] [Main] [info] [AirPods.cpp:424] Unbind device. [2022-04-04 01:55:49.703] [Main] [info] [Settings.cpp:109] OnApply_tray_icon_battery: 2 [2022-04-04 01:55:49.705] [Main] [info] [Settings.cpp:116] OnApply_battery_on_taskbar: 0 [2022-04-04 01:55:49.715] [Main] [info] [Bluetooth_win.cpp:300] Bluetooth AdvWatcher start succeeded. [2022-04-04 01:55:49.715] [Main] [info] [MainWindow.cpp:260] MainWindow::Available [2022-04-04 01:55:49.716] [Main] [info] [AirPods.cpp:558] Bluetooth AdvWatcher started. [2022-04-04 01:55:49.716] [Main] [info] [AirPods.cpp:387] Bluetooth AdvWatcher start succeeded. [2022-04-04 01:55:49.717] [Main] [info] [Update.cpp:123] ParseSRResponse: Asset name: 'AirPodsDesktop-0.3.2-win32.exe', size: 24903377, downloadUrl: 'https://github.com/SpriteOvO/AirPodsDesktop/releases/download/0.3.2/AirPodsDesktop-0.3.2-win32.exe'. [2022-04-04 01:55:49.718] [Main] [info] [Update.cpp:144] ParseSRResponse: Found matching file. [2022-04-04 01:55:49.718] [Main] [info] [Update.cpp:241] IsCurrentPreRelease: returns true. [2022-04-04 01:55:49.719] [Main] [info] [Update.cpp:276] Update: isCurrentPreRelease: 'true' [2022-04-04 01:55:49.861] [Main] [trace] [AirPods.cpp:538] AirPods advertisement received. Data: 07 19 01 0a 20 24 08 80 05 11 85 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00, Address Hash: 2702559164, RSSI: -52 [2022-04-04 01:55:49.861] [Main] [info] [AirPods.cpp:541] AirPods advertisement received, but device disconnected. [2022-04-04 01:55:49.877] [Main] [info] [Update.cpp:123] ParseSRResponse: Asset name: 'AirPodsDesktop-0.3.2-win32.exe', size: 24903377, downloadUrl: 'https://github.com/SpriteOvO/AirPodsDesktop/releases/download/0.3.2/AirPodsDesktop-0.3.2-win32.exe'. [2022-04-04 01:55:49.877] [Main] [info] [Update.cpp:144] ParseSRResponse: Found matching file. [2022-04-04 01:55:49.878] [Main] [info] [Update.cpp:287] Update: Latest version: '0.3.2' [2022-04-04 01:55:49.878] [Main] [info] [Update.cpp:289] Update: No need to update. [2022-04-04 01:55:51.738] [Main] [trace] [AirPods.cpp:538] AirPods advertisement received. Data: 07 19 01 0a 20 24 08 80 05 11 85 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00, Address Hash: 2702559164, RSSI: -58 [2022-04-04 01:55:51.738] [Main] [info] [AirPods.cpp:541] AirPods advertisement received, but device disconnected. [2022-04-04 01:55:53.038] [Main] [trace] [AirPods.cpp:538] AirPods advertisement received. Data: 07 19 01 0a 20 24 08 80 05 11 85 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00, Address Hash: 2702559164, RSSI: -54 [2022-04-04 01:55:53.039] [Main] [info] [AirPods.cpp:541] AirPods advertisement received, but device disconnected

SpriteOvO commented 2 years ago

@gir489returns Thanks, I'll attempt to support AirPods Max later and update the progress in this issue.

@SpriteOvO I tried getting the project to build to work in VS2019 but the instructions suck ass and gave up around trying to get QT installed. I set C:\Qt to an additional PATH variable restarted, but CMAKE was still complaining.

If you encounter build problems, please open a new issue and post error messages there, I'll be happy to help :)

gir489returns commented 2 years ago

Do you think you know how to fix it? I found an Open source API for the AirPods that already had AirPod Max support if that helps: https://github.com/adolfintel/OpenPods

SpriteOvO commented 2 years ago

Do you think you know how to fix it? I found an Open source API for the AirPods that already had AirPod Max support if that helps: adolfintel/OpenPods

@gir489returns Of course, the logs you provided are a great help.

gir489returns commented 2 years ago

For now I'm just using my phone to monitor them. Another user story would be to fix the mic not working in Windows. For some reason, the headset shows up as two Bluetooth devices. image

The headset, which is what is supposed to be polling the audio data and doesn't work, and the headphones which is what plays the audio. Maybe you could emulate something like virtual audio cable and work out why the mic data isn't agreeing with the Windows driver? I looked into it already and couldn't figure out where the audio stream data is coming from the Bluetooth connection. It's just all 00s coming back.

SpriteOvO commented 2 years ago

@gir489returns I have attempted to support AirPods Max in commit 2c54e9c7b7a197a596124ab0ff98ad7bdb809a09 and it should work now (except the animation, I will update it later). Could you help to test it? CI artifact


The headset, which is what is supposed to be polling the audio data and doesn't work, and the headphones which is what plays the audio.

AFAIK, devices with the "Hands-Free" name usually work with AirPods' audio inputs. When these devices are working, they can really affect the quality of the audio output, so I always disable them and only use devices with the "Stereo" name. In other words, you should probably not use AirPods as an audio input device. Try disabling all AirPods audio input devices to see if it works. If it still doesn't work, try removing your device from the Bluetooth settings and pairing it again.

gir489returns commented 2 years ago

I tried the latest build but it still says advertisement received but device disconnected.

SpriteOvO commented 2 years ago

I tried the latest build but it still says advertisement received but device disconnected.

@gir489returns Have you paired and connected to your AirPods from the Bluetooth settings? Then click the tray icon and click "Bind to AirPods" button.

image

gir489returns commented 2 years ago

I tried that before but it gave an error, it seems to be working now.

image

It just needs to only show one battery, remove the case and show the headsets. You could also probably determine the color too based on the UID of the device. If you want, I could get other colors to determine the color ID.

gir489returns commented 2 years ago

image The taskbar UI also needs to be updated too.

gir489returns commented 2 years ago

I am happy to report that after a solid day of testing, the only issues that remain are UX issues.

SpriteOvO commented 2 years ago

@gir489returns Thanks for the report, I'll probably start fixing these issues the day after tomorrow, just a bit busy.

gir489returns commented 2 years ago

@gir489returns Thanks for the report, I'll probably start fixing these issues the day after tomorrow, just a bit busy.

Hahahahah! Fucking tell me about it! I'm in the middle of a critical deployment to production at work. I'm working with Apple to secure some more color IDs if you want to add those. They're probably not going to let me show up to the store, buy all 6 colors, open the boxes, then return them after dumping the IDs. But who the fuck knows. I think we should just maybe have a user dialog box to select the color if that's something we want? Would save us the trouble of harassing some poor Apple store worker and charging like 6 grand to my card only to have it come back and then have to rewrap them. Or, we could just say fuck that to all that nonsense and just show the generic grey model. Let me know what you want to do.

SpriteOvO commented 2 years ago

Hahahahah! Fucking tell me about it! I'm in the middle of a critical deployment to production at work. I'm working with Apple to secure some more color IDs if you want to add those. They're probably not going to let me show up to the store, buy all 6 colors, open the boxes, then return them after dumping the IDs. But who the fuck knows. I think we should just maybe have a user dialog box to select the color if that's something we want? Would save us the trouble of harassing some poor Apple store worker and charging like 6 grand to my card only to have it come back and then have to rewrap them. Or, we could just say fuck that to all that nonsense and just show the generic grey model. Let me know what you want to do.

@gir489returns It's not that complicated, the color IDs are here and they should work directly. If not, a new bug report will be reported by a user.

https://github.com/SpriteOvO/AirPodsDesktop/blob/c9db0ad293d223a291e931be956a44e518be8f05/Source/Core/AppleCP.h#L46-L60

gir489returns commented 2 years ago

https://github.com/SpriteOvO/AirPodsDesktop/blob/c9db0ad293d223a291e931be956a44e518be8f05/Source/Core/AppleCP.h#L46-L60

Those don't look like the Max colors. Mine are green....

gir489returns commented 2 years ago

According to Apple's website here are the following colors the AirPods Max comes in:

Sky Blue Green Pink (Looks red?) Silver (White) Space Grey (Black)

gir489returns commented 2 years ago

Can you give me a dev build that will dump what you think is the color ID from mine? I am guestimating that mine will be either 0x1 or 0x2. If that's the case, we can guess that skyblue is 0x00 or 0x1, and we can iterate from there based on Apple's advertising. If that's wrong we can fix that later when a user complains.

SpriteOvO commented 2 years ago

Can you give me a dev build that will dump what you think is the color ID from mine? I am guestimating that mine will be either 0x1 or 0x2. If that's the case, we can guess that skyblue is 0x00 or 0x1, and we can iterate from there based on Apple's advertising. If that's wrong we can fix that later when a user complains.

                        vv: this is the color ID from adv data
07 19 01 0a 20 24 08 80 05 11 85 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
gir489returns commented 2 years ago

That entire thing?! That whole blob?! Or the 01? I think it's the 01. That would make sense since green is the 2nd in line, and hex starts at 0.

gir489returns commented 2 years ago

I'm working on acquiring a MacBook Pro 2020 that's currently damaged but works for 700 USD from a local seller. I'm going to either leave it damaged or fix it then give it to my father when I'm done with it. But I will see if I can dump the spinning AirPod Max logos from it so you don't have to craft them by hand.

Beamy68 commented 2 years ago

Well then, Glad that this thread actually had activity, I don't check GitHub a lot and probably should have, but I'm glad someone else was able to provide those logs as well!

Beamy68 commented 2 years ago

The Animation is a little bit off, but still great work!

image

The AirPods Max only need a single battery icon as a side note, and I think this program is identifying it as the case.

SpriteOvO commented 2 years ago

@Beamy68 Yes, AirPods Max support is still WIP and I will fix the animation and battery issues later, just a little busy recently, sorry.

Beamy68 commented 2 years ago

@SpriteOvO It's alright, I don't mean to rush you. Great job on this program!

akash329d commented 2 years ago

Just found out about this and am testing it out with Airpods Max. Thanks for putting this together!

Some comments: the auto play/pause doesn't currently work with Airpods Max (no big deal, just wanted to mention it). And also the battery indicator switches from the left battery icon to the middle battery icon when I take them off my head. It switches back when I put them back on. Just wanted to mention it since it was a little odd.

wangyoucao577 commented 1 year ago

Hi,
I encountered the same problem. It seems that the latest release still doesn't have the AirPodPro Max support, and the latest CI build was 4 months ago which was expired already. Would you please make an new release so that we can try it out? Thanks very much!

SpriteOvO commented 1 year ago

Sorry for the long wait. I've just finished my work on other projects, and I'll be working on the issues under this project in the next few days, and then releasing a new version.

wangyoucao577 commented 1 year ago

@SpriteOvO Thanks very much! If a workable version is on branch, trigger a new CI to generate artifacts also works. I can tested it if you need.

SpriteOvO commented 1 year ago

@wangyoucao577 I have manually triggered a CI build on main branch (link), you should be able to download the installer when it finishes.

wangyoucao577 commented 1 year ago

image @SpriteOvO I have tried but it shows Disconnected even it's connected to windows already and able to listen from it. Let me know if any update. Thanks very much!

SpriteOvO commented 1 year ago

@wangyoucao577 AirPods Pro 2 is still unsupported. Is your device AirPods Max, right?

Please try to rebind your device from the settings, if it doesn't work, please launch the program with --trace argument and send its log here.

SpriteOvO commented 1 year ago

The current code did not consider this special case of AirPods Max, so it needs to be redesigned. Since I don't have an AirPods Max device, I have some questions:

wangyoucao577 commented 1 year ago

@SpriteOvO Rebind but still not work. Here's the traces, please take a look. Thanks!

[2022-12-01 10:21:30.150] [Main] [info] [Application.cpp:121] Launched. Version: '0.3.2'
[2022-12-01 10:21:30.151] [Main] [info] [Application.cpp:123] Build git hash: 'e6b4bc20596bbf996c142204249e5e1019c4feed'[2022-12-01 10:21:30.151] [Main] [info] [Application.cpp:128] Build configuration: Not Debug
[2022-12-01 10:21:30.151] [Main] [info] [Application.cpp:131] Opts: { trace: true }
[2022-12-01 10:21:30.151] [Main] [info] [Logger.cpp:93] Clean up old log file: 'AirPodsDesktop.1.log' doesn't exist, break the loop
[2022-12-01 10:21:30.153] [Main] [warning] [Windows.h:181] Winrt initialize failed. Code: -0x7ffefefa, Message: Cannot change thread mode after it is set.
[2022-12-01 10:21:30.153] [Main] [info] [Settings.cpp:170] Load key succeeded. Key: 'abi_version', Value: '1'
[2022-12-01 10:21:30.153] [Main] [info] [Settings.cpp:170] Load key succeeded. Key: 'language_locale', Value: ''
[2022-12-01 10:21:30.154] [Main] [info] [Settings.cpp:170] Load key succeeded. Key: 'auto_run', Value: 'true'
[2022-12-01 10:21:30.154] [Main] [info] [Settings.cpp:170] Load key succeeded. Key: 'low_audio_latency', Value: 'false'
[2022-12-01 10:21:30.154] [Main] [info] [Settings.cpp:170] Load key succeeded. Key: 'automatic_ear_detection', Value: 'true'
[2022-12-01 10:21:30.154] [Main] [info] [Settings.cpp:170] Load key succeeded. Key: 'skipped_version', Value: ''
[2022-12-01 10:21:30.154] [Main] [info] [Settings.cpp:170] Load key succeeded. Key: 'rssi_min', Value: '-80'
[2022-12-01 10:21:30.154] [Main] [warning] [Settings.cpp:140] The setting key 'reduce_loud_sounds' not found. Current value 'false'.
[2022-12-01 10:21:30.154] [Main] [warning] [Settings.cpp:140] The setting key 'loud_volume_level' not found. Current value '40'.
[2022-12-01 10:21:30.154] [Main] [info] [Settings.cpp:174] Load key succeeded. Key: 'device_address', Value: '** MAYBE HAVE VALUE **'
[2022-12-01 10:21:30.154] [Main] [info] [Settings.cpp:170] Load key succeeded. Key: 'tray_icon_battery', Value: '0'
[2022-12-01 10:21:30.154] [Main] [info] [Settings.cpp:170] Load key succeeded. Key: 'battery_on_taskbar', Value: '0'
[2022-12-01 10:21:30.154] [Main] [info] [Application.cpp:237] currentLocale: en_US
[2022-12-01 10:21:30.154] [Main] [info] [Application.cpp:241] Locale from settings: ''
[2022-12-01 10:21:30.154] [Main] [info] [Application.cpp:199] SetTranslator() locale: en_US
[2022-12-01 10:21:30.154] [Main] [warning] [Application.cpp:222] Try to set a same locale name 'en_US', ignore
[2022-12-01 10:21:30.420] [Main] [info] [TaskbarStatus.cpp:133] Is Windows 11 or greater: 'false'
[2022-12-01 10:21:32.027] [Main] [info] [MainWindow.cpp:271] MainWindow::Unavailable
[2022-12-01 10:21:32.030] [Main] [info] [Update.cpp:392] Checking update...
[2022-12-01 10:21:32.312] [Main] [info] [LowAudioLatency.cpp:68] LowAudioLatency: Init successful. _enabled: false
[2022-12-01 10:21:32.312] [Main] [info] [Settings.cpp:282] ApplyWithoutLock
[2022-12-01 10:21:32.312] [Main] [info] [Settings.cpp:44] OnApply_language_locale:
[2022-12-01 10:21:32.312] [Main] [info] [Application.cpp:199] SetTranslator() locale: en_US
[2022-12-01 10:21:32.312] [Main] [warning] [Application.cpp:222] Try to set a same locale name 'en_US', ignore
[2022-12-01 10:21:32.312] [Main] [info] [Settings.cpp:52] OnApply_auto_run: true
[2022-12-01 10:21:32.313] [Main] [info] [Settings.cpp:73] OnApply_low_audio_latency: false
[2022-12-01 10:21:32.313] [Main] [info] [LowAudioLatency.cpp:79] LowAudioLatency::Controller Control: false, _inited: true
[2022-12-01 10:21:32.313] [Main] [info] [Settings.cpp:80] OnApply_automatic_ear_detection: true
[2022-12-01 10:21:32.313] [Main] [info] [Settings.cpp:88] OnApply_rssi_min: -80
[2022-12-01 10:21:32.313] [Main] [info] [Settings.cpp:95] OnApply_device_address: ** MAYBE HAVE VALUE **
[2022-12-01 10:21:32.313] [Main] [info] [MainWindow.cpp:296] MainWindow::Bind
[2022-12-01 10:21:32.313] [Main] [info] [MainWindow.cpp:282] MainWindow::Disconnect
[2022-12-01 10:21:32.314] [Main] [info] [AirPods.cpp:182] StateManager: Disconnect.
[2022-12-01 10:21:32.314] [Main] [info] [AirPods.cpp:430] Bind a new device.
[2022-12-01 10:21:32.351] [Main] [info] [AirPods.cpp:465] The device we bound is updated. current: true, new: true
[2022-12-01 10:21:32.351] [Main] [info] [Settings.cpp:109] OnApply_tray_icon_battery: 0
[2022-12-01 10:21:32.352] [Main] [info] [Settings.cpp:116] OnApply_battery_on_taskbar: 0
[2022-12-01 10:21:32.370] [Main] [info] [Bluetooth_win.cpp:303] Bluetooth AdvWatcher start succeeded.
[2022-12-01 10:21:32.370] [Main] [info] [MainWindow.cpp:260] MainWindow::Available
[2022-12-01 10:21:32.370] [Main] [info] [AirPods.cpp:558] Bluetooth AdvWatcher started.
[2022-12-01 10:21:32.370] [Main] [info] [AirPods.cpp:387] Bluetooth AdvWatcher start succeeded.
[2022-12-01 10:21:32.501] [Main] [trace] [AirPods.cpp:538] AirPods advertisement received. Data: 07 19 01 0a 20 02 0a 80 00 0f 44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00, Address Hash: 2908558587, RSSI: -93
[2022-12-01 10:21:32.501] [Main] [warning] [AirPods.cpp:199] IsPossibleDesiredAdv returns false. Reason: RSSI is less than the limit. curr: '-93' min: '-80'
[2022-12-01 10:21:32.501] [Main] [warning] [AirPods.cpp:170] This adv may not be broadcast from the device we desire.
[2022-12-01 10:21:32.626] [Main] [info] [Update.cpp:123] ParseSRResponse: Asset name: 'AirPodsDesktop-0.3.2-win32.exe', size: 24903377, downloadUrl: 'https://github.com/SpriteOvO/AirPodsDesktop/releases/download/0.3.2/AirPodsDesktop-0.3.2-win32.exe'.
[2022-12-01 10:21:32.626] [Main] [info] [Update.cpp:144] ParseSRResponse: Found matching file.
[2022-12-01 10:21:32.626] [Main] [info] [Update.cpp:241] IsCurrentPreRelease: returns true.
[2022-12-01 10:21:32.627] [Main] [info] [Update.cpp:276] Update: isCurrentPreRelease: 'true'
[2022-12-01 10:21:32.878] [Main] [trace] [AirPods.cpp:538] AirPods advertisement received. Data: 07 19 01 0a 20 02 0a 80 00 0f 44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00, Address Hash: 2908558587, RSSI: -94
[2022-12-01 10:21:32.878] [Main] [warning] [AirPods.cpp:199] IsPossibleDesiredAdv returns false. Reason: RSSI is less than the limit. curr: '-94' min: '-80'
[2022-12-01 10:21:32.878] [Main] [warning] [AirPods.cpp:170] This adv may not be broadcast from the device we desire.
[2022-12-01 10:21:33.203] [Main] [info] [Update.cpp:123] ParseSRResponse: Asset name: 'AirPodsDesktop-0.3.2-win32.exe', size: 24903377, downloadUrl: 'https://github.com/SpriteOvO/AirPodsDesktop/releases/download/0.3.2/AirPodsDesktop-0.3.2-win32.exe'.
[2022-12-01 10:21:33.203] [Main] [info] [Update.cpp:144] ParseSRResponse: Found matching file.
[2022-12-01 10:21:33.203] [Main] [info] [Update.cpp:287] Update: Latest version: '0.3.2'
[2022-12-01 10:21:33.204] [Main] [info] [Update.cpp:289] Update: No need to update.
[2022-12-01 10:21:35.252] [Main] [trace] [AirPods.cpp:538] AirPods advertisement received. Data: 07 19 01 13 20 2b 99 8f 01 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00, Address Hash: 905188177, RSSI: -96
[2022-12-01 10:21:35.252] [Main] [warning] [AirPods.cpp:199] IsPossibleDesiredAdv returns false. Reason: RSSI is less than the limit. curr: '-96' min: '-80'
[2022-12-01 10:21:35.252] [Main] [warning] [AirPods.cpp:170] This adv may not be broadcast from the device we desire.
[2022-12-01 10:21:35.502] [Main] [trace] [AirPods.cpp:538] AirPods advertisement received. Data: 07 19 01 0a 20 02 0a 80 00 0f 44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00, Address Hash: 2908558587, RSSI: -93
[2022-12-01 10:21:35.502] [Main] [warning] [AirPods.cpp:199] IsPossibleDesiredAdv returns false. Reason: RSSI is less than the limit. curr: '-93' min: '-80'
[2022-12-01 10:21:35.502] [Main] [warning] [AirPods.cpp:170] This adv may not be broadcast from the device we desire.
[2022-12-01 10:21:36.887] [Main] [trace] [MainWindow.cpp:668] MainWindow: Show
[2022-12-01 10:21:36.887] [Main] [trace] [MainWindow.cpp:499] ControlAutoHideTimer: start == 'true', _isVisible == 'true'
[2022-12-01 10:21:37.289] [Main] [trace] [AirPods.cpp:538] AirPods advertisement received. Data: 07 19 01 0e 20 2b 99 8f 01 00 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00, Address Hash: 1003229553, RSSI: -94
[2022-12-01 10:21:37.289] [Main] [warning] [AirPods.cpp:199] IsPossibleDesiredAdv returns false. Reason: RSSI is less than the limit. curr: '-94' min: '-80'
[2022-12-01 10:21:37.289] [Main] [warning] [AirPods.cpp:170] This adv may not be broadcast from the device we desire.
[2022-12-01 10:21:37.661] [Main] [trace] [MainWindow.cpp:595] OnAppStateChanged: 'Qt::ApplicationState::ApplicationActive'
[2022-12-01 10:21:37.662] [Main] [trace] [MainWindow.cpp:499] ControlAutoHideTimer: start == 'false', _isVisible == 'true'
[2022-12-01 10:21:37.741] [Main] [trace] [MainWindow.cpp:648] MainWindow: Hide
[2022-12-01 10:21:37.741] [Main] [trace] [MainWindow.cpp:499] ControlAutoHideTimer: start == 'false', _isVisible == 'false'
[2022-12-01 10:21:37.752] [Main] [trace] [AirPods.cpp:538] AirPods advertisement received. Data: 07 19 01 0a 20 02 0a 80 00 0f 44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00, Address Hash: 2908558587, RSSI: -94
[2022-12-01 10:21:37.752] [Main] [warning] [AirPods.cpp:199] IsPossibleDesiredAdv returns false. Reason: RSSI is less than the limit. curr: '-94' min: '-80'
[2022-12-01 10:21:37.752] [Main] [warning] [AirPods.cpp:170] This adv may not be broadcast from the device we desire.
[2022-12-01 10:21:37.869] [Main] [trace] [AirPods.cpp:538] AirPods advertisement received. Data: 07 19 01 13 20 2b 99 8f 01 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00, Address Hash: 905188177, RSSI: -94
[2022-12-01 10:21:37.869] [Main] [warning] [AirPods.cpp:199] IsPossibleDesiredAdv returns false. Reason: RSSI is less than the limit. curr: '-94' min: '-80'
[2022-12-01 10:21:37.869] [Main] [warning] [AirPods.cpp:170] This adv may not be broadcast from the device we desire.
[2022-12-01 10:21:38.258] [Main] [trace] [MainWindow.cpp:595] OnAppStateChanged: 'Qt::ApplicationState::ApplicationInactive'
[2022-12-01 10:21:38.258] [Main] [trace] [MainWindow.cpp:499] ControlAutoHideTimer: start == 'true', _isVisible == 'false'
[2022-12-01 10:21:40.128] [Main] [trace] [AirPods.cpp:538] AirPods advertisement received. Data: 07 19 01 13 20 2b 99 8f 01 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00, Address Hash: 905188177, RSSI: -96
[2022-12-01 10:21:40.128] [Main] [warning] [AirPods.cpp:199] IsPossibleDesiredAdv returns false. Reason: RSSI is less than the limit. curr: '-96' min: '-80'
[2022-12-01 10:21:40.128] [Main] [warning] [AirPods.cpp:170] This adv may not be broadcast from the device we desire.
[2022-12-01 10:21:40.370] [Main] [trace] [AirPods.cpp:538] AirPods advertisement received. Data: 07 19 01 0a 20 02 0a 80 00 0f 44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00, Address Hash: 2908558587, RSSI: -94
[2022-12-01 10:21:40.371] [Main] [warning] [AirPods.cpp:199] IsPossibleDesiredAdv returns false. Reason: RSSI is less than the limit. curr: '-94' min: '-80'
[2022-12-01 10:21:40.371] [Main] [warning] [AirPods.cpp:170] This adv may not be broadcast from the device we desire.
[2022-12-01 10:21:41.692] [Main] [trace] [AirPods.cpp:538] AirPods advertisement received. Data: 07 19 01 0a 20 02 0a 80 00 0f 44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00, Address Hash: 2908558587, RSSI: -94
[2022-12-01 10:21:41.693] [Main] [warning] [AirPods.cpp:199] IsPossibleDesiredAdv returns false. Reason: RSSI is less than the limit. curr: '-94' min: '-80'
[2022-12-01 10:21:41.693] [Main] [warning] [AirPods.cpp:170] This adv may not be broadcast from the device we desire.
[2022-12-01 10:21:42.380] [Main] [trace] [AirPods.cpp:538] AirPods advertisement received. Data: 07 19 01 13 20 2b 99 8f 01 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00, Address Hash: 905188177, RSSI: -94
[2022-12-01 10:21:42.380] [Main] [warning] [AirPods.cpp:199] IsPossibleDesiredAdv returns false. Reason: RSSI is less than the limit. curr: '-94' min: '-80'
[2022-12-01 10:21:42.380] [Main] [warning] [AirPods.cpp:170] This adv may not be broadcast from the device we desire.
[2022-12-01 10:21:42.991] [Main] [trace] [AirPods.cpp:538] AirPods advertisement received. Data: 07 19 01 0a 20 02 0a 80 00 0f 44 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00, Address Hash: 2908558587, RSSI: -93
[2022-12-01 10:21:42.991] [Main] [warning] [AirPods.cpp:199] IsPossibleDesiredAdv returns false. Reason: RSSI is less than the limit. curr: '-93' min: '-80'
[2022-12-01 10:21:42.991] [Main] [warning] [AirPods.cpp:170] This adv may not be broadcast from the device we desire.
[2022-12-01 10:21:43.702] [Main] [trace] [AirPods.cpp:538] AirPods advertisement received. Data: 07 19 01 13 20 2b 99 8f 01 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00, Address Hash: 905188177, RSSI: -94
[2022-12-01 10:21:43.703] [Main] [warning] [AirPods.cpp:199] IsPossibleDesiredAdv returns false. Reason: RSSI is less than the limit. curr: '-94' min: '-80'
[2022-12-01 10:21:43.703] [Main] [warning] [AirPods.cpp:170] This adv may not be broadcast from the device we desire.
SpriteOvO commented 1 year ago

@wangyoucao577 Oh, that's because your device may be too far away from your Bluetooth receiver, you can increase the allowed range in the settings.

wangyoucao577 commented 1 year ago

I increased the range and it works well now, thanks! But acutally it's very close to my Bluetooth receiver(less than 1 meter).
And there're two more issues(refer to below pictures):

  1. sometimes it shows AirPods 3 rather than AirPods Max;
  2. sometimes the battery value changes between 0 ~ 90;

image image

SpriteOvO commented 1 year ago

@wangyoucao577

  1. sometimes it shows AirPods 3 rather than AirPods Max;

This may be because there is someone else's AirPods 3 device around you, which is why we need to limit the distance.

  1. sometimes the battery value changes between 0 ~ 90;

I need your help to fix the battery problem.

[2022-12-01 10:21:40.128] [Main] [trace] [AirPods.cpp:538] AirPods advertisement received. Data: 07 19 01 13 20 2b 99 8f 01 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00, Address Hash: 905188177, RSSI: -96

^ this in the log you just posted, it's advertisement data broadcast by the AirPods device in real time.

It should contain a byte to represent the battery value, which is in steps of 10.

So I need you to use your device for a while and after every 10% battery change (observed from your iPhone), report this line of log for the current time.

For example, if you now see the battery of AirPods Max at 83% on your iPhone, open the log file to record the latest advertisement data and continue repeating this action at 77%, 65% (as long as its tenths have changed), 3 times should be enough. Then post the 3 lines of log you recorded here.

wangyoucao577 commented 1 year ago

@SpriteOvO Sorry for the late, I'm quite busy recently. Do you mean that I firstly connect the AirPods Max to iPhone to see the battery value, then connect it to Windows to catch and post this line? Unfortuntely I currently don't have an proper iPhone/Mac to connect.

One more issue, I found that my AirPods Max becomes very easy to pause play once I opened the AirPodsDesktop, often happens before one song finish. The Bluetooth maximum receiving range has been adjusted to maxium, and I'm quite sure my AirPods Max is very close to my bluetooth receiver.

image

@wangyoucao577

  1. sometimes it shows AirPods 3 rather than AirPods Max;

This may be because there is someone else's AirPods 3 device around you, which is why we need to limit the distance.

  1. sometimes the battery value changes between 0 ~ 90;

I need your help to fix the battery problem.

[2022-12-01 10:21:40.128] [Main] [trace] [AirPods.cpp:538] AirPods advertisement received. Data: 07 19 01 13 20 2b 99 8f 01 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00, Address Hash: 905188177, RSSI: -96

^ this in the log you just posted, it's advertisement data broadcast by the AirPods device in real time.

It should contain a byte to represent the battery value, which is in steps of 10.

So I need you to use your device for a while and after every 10% battery change (observed from your iPhone), report this line of log for the current time.

For example, if you now see the battery of AirPods Max at 83% on your iPhone, open the log file to record the latest advertisement data and continue repeating this action at 77%, 65% (as long as its tenths have changed), 3 times should be enough. Then post the 3 lines of log you recorded here.

SpriteOvO commented 1 year ago

One more issue, I found that my AirPods Max becomes very easy to pause play once I opened the AirPodsDesktop, often happens before one song finish. The Bluetooth maximum receiving range has been adjusted to maxium, and I'm quite sure my AirPods Max is very close to my bluetooth receiver.

This should be caused by the AirPods Max advertisement data not being parsed correctly.

Anyway thank you, hopefully someone else can help by following the instructions above.

alirz1 commented 1 year ago

is there a built/compiled installer for this for windows or does everyone need to go build it themselves?

SpriteOvO commented 1 year ago

Initial support for AirPods Max (proper device detection only) has been released in v0.4.0, but since it works with a different logic than the other AirPods (AirPods Max is all-in-one), this version may not display its information correctly.

I would appreciate it if someone opens a new issue after trying it to report the problems encountered for tracking purposes. I'll try to get a device for testing or use the debugging info you guys provided to fully support AirPods Max later.

I apologize for the long delay for the support.