volum_mixer_example.zip/volum_mixer_example.cpp
#include <Windows.h>
#include <MMDeviceAPI.h>
#include <Audiopolicy.h>
#pragma comment(lib, "Winmm.lib")
int main() {
::PlaySoundW(L"C:\\Windows\\Media\\ringout.wav", nullptr, SND_ASYNC | SND_FILENAME | SND_LOOP);
::Sleep(100); // 再生開始しないとセッション一覧に出ないため待機
::CoInitialize(nullptr);
IMMDeviceEnumerator *deviceEnumerator;
::CoCreateInstance(__uuidof(MMDeviceEnumerator), nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&deviceEnumerator));
IMMDevice *device;
deviceEnumerator->GetDefaultAudioEndpoint(EDataFlow::eRender, ERole::eMultimedia, &device);
IAudioSessionManager2 *sessionManager;
device->Activate(__uuidof(IAudioSessionManager2), CLSCTX_INPROC_SERVER, nullptr, reinterpret_cast<void **>(&sessionManager));
IAudioSessionEnumerator *sessionEnumerator;
sessionManager->GetSessionEnumerator(&sessionEnumerator);
unsigned int count;
sessionEnumerator->GetCount(reinterpret_cast<int *>(&count));
for (unsigned int i = 0; i < count; i++) {
IAudioSessionControl *session1;
sessionEnumerator->GetSession(i, &session1);
IAudioSessionControl2 *session;
session1->QueryInterface(&session);
DWORD processId;
session->GetProcessId(&processId);
if (processId != ::GetCurrentProcessId()) {
continue;
}
ISimpleAudioVolume *audioVolume;
session->QueryInterface(&audioVolume);
unsigned int volume = 0;
while (true) {
if (volume <= 100) {
audioVolume->SetMasterVolume(static_cast<float>(volume) / 100, nullptr);
} else if(volume < 200) {
audioVolume->SetMasterVolume(static_cast<float>(200-volume) / 100, nullptr);
} else {
volume = 0;
}
::Sleep(10);
volume++;
}
}
return 0;
}