Blame | Last modification | View Log | RSS feed
// dllmain.cpp : Defines the entry point for the DLL application.#include "stdafx.h"#include <stdio.h>#include <objbase.h>#include <Windows.h>#include <mmdeviceapi.h>#include <endpointvolume.h>#include <functiondiscoverykeys_devpkey.h>unsigned int devCount = 0;const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEnumerator);const IID IID_IMMDeviceEnumerator = __uuidof(IMMDeviceEnumerator);HRESULT hr = S_OK;IMMDeviceEnumerator *pEnum = NULL;IMMDeviceCollection *pColl = NULL;void initDevices();#define SAFE_RELEASE(punk) \if ((punk) != NULL) \{ (punk)->Release(); (punk) = NULL; }BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) {switch (ul_reason_for_call) {case DLL_PROCESS_ATTACH:initDevices();break;case DLL_THREAD_ATTACH:// Thread-specific initcase DLL_THREAD_DETACH:// Thread-specific cleanupcase DLL_PROCESS_DETACH://Perform any necessary cleanipbreak;}return TRUE;}extern "C" __declspec(dllexport) int _stdcall _getDevCount(unsigned int *deviceCount) {*deviceCount = devCount;return 1;}extern "C" __declspec(dllexport) LPWSTR _stdcall _getDevName(unsigned int dev) {IMMDevice *pEndpoint = NULL;IPropertyStore *pProps = NULL;LPWSTR pwszID = NULL;hr = pColl->Item(dev, &pEndpoint);hr = pEndpoint->GetId(&pwszID);hr = pEndpoint->OpenPropertyStore(STGM_READ, &pProps);PROPVARIANT varName;PropVariantInit(&varName);hr = pProps->GetValue(PKEY_Device_FriendlyName, &varName);LPWSTR name = varName.pwszVal;CoTaskMemFree(pwszID);pwszID = NULL;//PropVariantClear(&varName);SAFE_RELEASE(pEndpoint);SAFE_RELEASE(pProps);return name;}extern "C" __declspec(dllexport) unsigned int _stdcall _getDevVolume(unsigned int dev, float *deviceVolume) {IMMDevice *pEndpoint = NULL;hr = pColl->Item(dev, &pEndpoint);IAudioEndpointVolume *endpointVolume = NULL;pEndpoint->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_INPROC_SERVER, NULL, (LPVOID *)&endpointVolume);float volume = 0;endpointVolume->GetMasterVolumeLevelScalar(&volume);*deviceVolume = volume;SAFE_RELEASE(pEndpoint);SAFE_RELEASE(endpointVolume);return 1;}extern "C" __declspec(dllexport) unsigned int _stdcall _setDevVolume(unsigned int dev, float deviceVolume) {IMMDevice *pEndpoint = NULL;hr = pColl->Item(dev, &pEndpoint);IAudioEndpointVolume *endpointVolume = NULL;pEndpoint->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_INPROC_SERVER, NULL, (LPVOID *)&endpointVolume);endpointVolume->SetMasterVolumeLevelScalar(deviceVolume, NULL);SAFE_RELEASE(pEndpoint);SAFE_RELEASE(endpointVolume);return 1;}void initDevices() {hr = CoCreateInstance(CLSID_MMDeviceEnumerator, NULL,CLSCTX_ALL, IID_IMMDeviceEnumerator,(void**)&pEnum);hr = pEnum->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, &pColl);hr = pColl->GetCount(&devCount);}