by: Helge, published: Sep 9, 2020, updated: Sep 16, 2020, in

How to Check Which Bluetooth A2DP Audio Codec Is Used on Windows

This is a follow-up to my earlier article Bluetooth Audio Quality & aptX on Windows 10, based on a comment by reader eluxe.

Windows makes it unnecessarily hard to identify the audio codec used by the Bluetooth A2DP profile, but there is a way. This post shows how to check if your connection makes use of aptX, LDAC, or some other more advanced codec, or if it falls back to SBC.

The Procedure

The process only involves two steps:

  1. Collecting ETL logs with Windows Performance Recorder (WPR)
  2. Processing the logs with Windows Performance Analyzer (WPA)

Collecting Bluetooth ETL Logs With WPR

  1. Open an elevated PowerShell prompt (i.e., with admin rights)
  2. Navigate to a temporary directory
  3. Download Microsoft’s custom Bluetooth tracing recording profile for WPR:
    wget https://github.com/Microsoft/busiotools/raw/master/bluetooth/tracing/BluetoothStack.wprp -outfile .\BluetoothStack.wprp
  4. Start the trace:
    wpr.exe -start BluetoothStack.wprp!BluetoothStack -filemode
  5. Start playing audio via your Bluetooth device
  6. Stop the trace:
    wpr.exe -stop BthTracing.etl
  7. You should now have a file called BthTracing.etl

Source and more information: Microsoft’s busiotools GitHub repository

Processing Bluetooth ETL Logs With WPA

Double-click the trace file BthTracing.etl to open it in Windows Performance Analyzer (WPA). You should see a window that looks similar to this:

Close all the default charts and tables in the main area by clicking the x in the upper right corner. Then double click the preview chart below System Activity in the upper left corner. The window should now look like this:

Click the loupe symbol and enter a2dpstreaming:

After clicking Find all you should see two events highlighted in the table:

We are only interested in the second event with the task name A2dpStreaming. Unfortunately, the default columns do not have any meaningful information for us, and WPA makes it really quite hard to get to the interesting fields.

Right-click the column header and select Open View Editor:

De-select the fields Id, Process, Cpu, and ThreadId. From the left column drag and drop the fields 4 through 6 (Field 4, Field 5, Field 6) to the main area below the golden bar. It should look like this:

Rearranging the columns a bit for readability we finally see the information we need:

Interpreting the Result

All the fiddling around with WPA had the sole purpose of revealing the data of three fields:

  • A2dpStandardCodecId (field 4)
  • A2dpVendorId (field 5)
  • A2dpVendorCodecId (field 6)

The following table shows the values from my Bluetooth connection, both in decimal (as displayed by WPA) and in hexadecimal:

Field Value (dec) Value (hex)
A2dpStandardCodecId 255 0xFF
A2dpVendorId 79 0x004F
A2dpVendorCodecId 1 0x01

A complete list of Bluetooth vendor IDs can be found on the website of the Bluetooth SIG. We should not need it, though, because, luckily, an author called ValdikSS already compiled the relevant information in their excellent article Audio over Bluetooth: most detailed information about profiles, codecs, and devices. I’ll copy just the information required to interpret the data we collected.

A2DP has three types of codecs: mandatory, optional, and vendor-specific.

Mandatory A2DP Codecs

Standard codec ID Vendor ID Vendor codec ID Codec name
0x00 [empty] [empty] SBC

Optional A2DP Codecs

Standard codec ID Vendor ID Vendor codec ID Codec name
0x01 [empty] [empty] MPEG-1,2 (aka MP3)
0x02 [empty] [empty] MPEG-2,4 (aka AAC)
0x04 [empty] [empty] ATRAC

Vendor-Specific A2DP Codecs

Standard codec ID Vendor ID Vendor codec ID Codec name
0xFF 0x004F 0x01 aptX
0xFF 0x00D7 0x24 aptX HD
0xFF 0x000A 0x02 aptX Low Latency
0xFF 0x00D7 0x02 aptX Low Latency
0xFF 0x000A 0x01 FastStream
0xFF 0x012D 0xAA LDAC
0xFF 0x0075 0x0102 Samsung HD
0xFF 0x0075 0x0103 Samsung Scalable Codec
0xFF 0x053A 0x484C Savitech LHDC
0xFF 0x000A 0x0104 The CSR True Wireless Stereo v3 Codec ID for AAC
0xFF 0x000A 0x0105 The CSR True Wireless Stereo v3 Codec ID for MP3
0xFF 0x000A 0x0106 The CSR True Wireless Stereo v3 Codec ID for aptX

Conclusion

Looking once again at my values, we see in the tables above that a standard codec ID of 0xFF indicates a vendor-specific code. We can learn from the corresponding table that the vendor ID 0x004F and the vendor codec ID 0x01 stand for the aptX codec. This proves what I had suspected in my original article: Windows 10 supports aptX.

Previous Article Regex Search & Replace in WordPress Posts With WP-CLI
Next Article JavaScript Development with Type Checking in VS Code