#include #include #include #include #include /* * Compile with: * gcc -std=c11 -Wall -c foo.c -o foo.o * gcc foo.o -lgdi32 -lole32 -o foo * * Creates foo.exe */ int main() { REFERENCE_TIME hnsRequestedDuration = 10000000; IMMDeviceEnumerator *dev_enum = NULL; IMMDevice *device = NULL; IAudioClient *client = NULL; WAVEFORMATEX *format = NULL; unsigned int frames = 0; CoInitialize(NULL); CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, &IID_IMMDeviceEnumerator, (void **)&dev_enum); if (!dev_enum) { fprintf(stderr, "Failed to get device enumerator.\n"); fflush(stderr); return 1; } dev_enum->lpVtbl->GetDefaultAudioEndpoint(dev_enum, eRender, eConsole, &device); if (!device) { fprintf(stderr, "Failed to get device.\n"); fflush(stderr); dev_enum->lpVtbl->Release(dev_enum); return 1; } device->lpVtbl->Activate(device, &IID_IAudioClient, CLSCTX_ALL, NULL, (void **)&client); if (!client) { fprintf(stderr, "Failed to get client.\n"); fflush(stderr); dev_enum->lpVtbl->Release(dev_enum); device->lpVtbl->Release(device); return 1; } client->lpVtbl->GetMixFormat(client, &format); if (!format) { fprintf(stderr, "Failed to get mix format.\n"); fflush(stderr); dev_enum->lpVtbl->Release(dev_enum); device->lpVtbl->Release(device); client->lpVtbl->Release(client); return 1; } if (client->lpVtbl->Initialize(client, AUDCLNT_SHAREMODE_SHARED, 0, hnsRequestedDuration, 0, format, NULL) == S_OK) { WAVEFORMATEXTENSIBLE *ex = NULL; fprintf(stdout, "%s\n" "channels : %u\n" "samples/sec : %lu\n" "avg. bytes/sec : %lu\n" "block align : %u\n" "bits/sample : %u\n", (format->wFormatTag == WAVE_FORMAT_EXTENSIBLE ? "Wave Format Extensible" : (format->wFormatTag == WAVE_FORMAT_MPEG ? "Mpeg1 Wave Format" : (format->wFormatTag == WAVE_FORMAT_MPEGLAYER3 ? "Mpeg Layer3 Wave Format" : "Unknown format"))), format->nChannels, format->nSamplesPerSec, format->nAvgBytesPerSec, format->nBlockAlign, format->wBitsPerSample); switch(format->wFormatTag) { case WAVE_FORMAT_EXTENSIBLE: ex = (WAVEFORMATEXTENSIBLE *)format; fprintf(stdout, "valid bits/sample: %u\n" "samples/block : %u\n", ex->Samples.wValidBitsPerSample, ex->Samples.wSamplesPerBlock); break; case WAVE_FORMAT_MPEG: break; case WAVE_FORMAT_MPEGLAYER3: break; default: break; } } else { fprintf(stderr, "Failed to initialize client.\n"); fflush(stderr); dev_enum->lpVtbl->Release(dev_enum); device->lpVtbl->Release(device); client->lpVtbl->Release(client); return 1; } fprintf(stdout, "\n"); if (client->lpVtbl->GetBufferSize(client, &frames) == S_OK) fprintf(stdout, "%u frames in buffer.\n", frames); else fprintf(stderr, "Failed to get buffer size.\n"); if (client->lpVtbl->GetCurrentPadding(client, &frames) == S_OK) fprintf(stdout, "%u frames padding.\n", frames); else fprintf(stderr, "Failed to get padding.\n"); fflush(stderr); fflush(stdout); dev_enum->lpVtbl->Release(dev_enum); device->lpVtbl->Release(device); client->lpVtbl->Release(client); return 0; }