在Windows通过程序调用API来控制硬件(如扬声器)很有意思。

控制音量

下面是通过调用Windows API控制音量递增的例子:

/**
	@breif 修改Windows系统声音
*/
#include <windows.h>
#include <mmdeviceapi.h>
#include <endpointvolume.h>
#include <audioclient.h>
#include <iostream>

bool SetVolum(int volume)
{
	HRESULT hr;
	IMMDeviceEnumerator* pDeviceEnumerator = 0;
	IMMDevice* pDevice = 0;
	IAudioEndpointVolume* pAudioEndpointVolume = 0;
	IAudioClient* pAudioClient = 0;

	try {
		hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pDeviceEnumerator);
		if (FAILED(hr)) throw "CoCreateInstance";
		hr = pDeviceEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &pDevice);
		if (FAILED(hr)) throw "GetDefaultAudioEndpoint";
		hr = pDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, NULL, (void**)&pAudioEndpointVolume);
		if (FAILED(hr)) throw "pDevice->Active";
		hr = pDevice->Activate(__uuidof(IAudioClient), CLSCTX_ALL, NULL, (void**)&pAudioClient);
		if (FAILED(hr)) throw "pDevice->Active";

		float fVolume;
		fVolume = volume / 100.0f;
		hr = pAudioEndpointVolume->SetMasterVolumeLevelScalar(fVolume, &GUID_NULL);
		if (FAILED(hr)) throw "SetMasterVolumeLevelScalar";

		pAudioClient->Release();
		pAudioEndpointVolume->Release();
		pDevice->Release();
		pDeviceEnumerator->Release();
		return true;
	}

	catch (...) {
		if (pAudioClient) pAudioClient->Release();
		if (pAudioEndpointVolume) pAudioEndpointVolume->Release();
		if (pDevice) pDevice->Release();
		if (pDeviceEnumerator) pDeviceEnumerator->Release();
		throw;
	}
	return false;
}

int main(int argc, char **argv)
{
	CoInitialize(0);
	int vol;
	for (vol = 0; vol < 11; vol++)
	{
		Sleep(1 * 1000);
		SetVolum(vol);
		std::cout << "已将音量调整至:" << vol << std::endl;
	}
	CoUninitialize();
	return 0;
}

实际效果如下:

电脑音量从0到10递增,这里写的延时是1s。

在这里插入图片描述

播放音频

下面是通过Windows API播放音频的例子:

/*
	C++播放音频(VS2017)
*/
#include <Windows.h>
#include <iostream>
#include <mmsystem.h>  // 用于播放音频

#pragma comment(lib, "winmm.lib")  // 导入声音头文件库

int main() {
	std::cout << "开始播放音频……\n";

	mciSendString(TEXT("open ./sound/hello.mp3 alias mysong"), NULL, 0, NULL);
	mciSendString(TEXT("play mysong"), NULL, 0, NULL);
	Sleep(8000);
	mciSendString(TEXT("close mysong"), NULL, 0, NULL);

	system("pause");
	return 0;
}

// 文字转语音 https://ttsmaker.com/zh-cn

实际效果如下:

电脑开始播放hello.mp3的声音。

在这里插入图片描述

以上。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐