Walking the IDeviceTopology tree to see audio driver settings

I’ve blogged before about using the IDeviceTopology API to poke around the internal structure exposed by audio drivers. In particular, given an audio endpoint, you can map out all the knobs and widgets of all the signal paths that feed into that endpoint (for playback) or out of it (for recording.) A version of this…

2

Draining the WASAPI capture buffer fully

About six years ago I wrote a blog post about how to do WASAPI loopback capture. Since then, a few issues have come to light. One big issue is that we’re using MMCSS registration directly. Nowadays the much-preferred approach is to use a Media Foundation work queue; yes, you can use a Media Foundation work queue…

11

More on audio buffer alignment requirements

I chatted in the past about how audio device alignment requirements impact the buffer size and the WASAPI alignment dance. There are three alignment requirements on audio buffers: The buffer size must be a multiple of WAVEFORMATEX.nBlockAlign. This allows individual audio frames to be copied around without worrying about them being cut in half and…

0

Using the Speech API to convert speech to text

Some time ago I created a “listen.exe” tool which used SAPI’s ISpRecoContext to listen to the microphone and dump any recognized text to the console. Today I had to debug an issue with SAPI reading from a .wav file, so I updated it to accept a listen.exe –file foo.wav argument; this consumes the audio in the .wav file…

1

World Cup tiebreaks: how the United States can survive Group G

With World Cup Group G standings being the way they are, I decided to read up on tiebreaks. Here are the FIFA rules (PDF) The relevant sections are: 18.4.a: … with three points for a win, one point for a draw and no points for a defeat (league format) … 18.6: In the league format,…

2

Expressing a function f: GF(2⁸) → GF(2⁸) as a polynomial using a Lagrange polynomial

I talked about Rijndael in a couple of previous posts: Generating the Rijndael S-box, Efficient multiplication and division in GF(28), Sieving irreducible monic polynomials over a finite field, Addition and multiplication table for GF(22). I’m going to talk some more about it today. The Rijndael non-linear S-box S(x) is a composition of two invertible functions…

1

Generating the Rijndael S-box

I talked about Rijndael in a couple of previous posts: Efficient multiplication and division in GF(28), Sieving irreducible monic polynomials over a finite field, Addition and multiplication table for GF(22). I’m going to talk some more about it today. One of the more interesting steps used in the Rijndael transformation is the non-linear S-box. This…

0

Troubleshooting default audio device heuristics

In Windows 7 we published a white paper which shows how Windows chooses which audio device should be the default. This remains true for Windows 8 and Windows 8.1. The six factors that are considered for each device are: Jack detection capability Whether KSJACK_DESCRIPTION2.JackCapabilities has the JACKDESC2_PRESENCE_DETECT_CAPABILITY flag set USB audio devices have jack detection capability…

1

Efficient multiplication and division in GF(2⁸)

I talked about Rijndael in a couple of previous posts: Sieving irreducible monic polynomials over a finite field, Addition and multiplication table for GF(2²) I’m going to talk some more about it today. Rijndael does a lot of arithmetic operations (addition and multiplication) on elements of GF(28)4. These are represented as polynomials b0 + b1…

0

A mental model for the Windows Phone AudioRoutingManager API

The Windows Phone SDK includes a Windows.Phone.Media.Devices.AudioRoutingManager API which I had occasion to use. The API allows apps that have communication audio streams (e.g., Voice over IP calls) to control whether the audio goes out over the earpiece, over the speakerphone, or over the Bluetooth headset. This might be done automatically, or might be used…

0