以前にQiitaに投稿したものを再掲
即コード。
# include <windows.h>
# include <mmdeviceapi.h>
# include <endpointvolume.h>
# include <stdio.h>
int main(int argc, char** argv) {
HRESULT hr;
IMMDeviceEnumerator* pEnum = NULL;
IMMDevice* pEndpoint = NULL;
IAudioEndpointVolume* pAudioEndVol = NULL;
hr = CoInitializeEx(0, COINIT_MULTITHREADED);// Coおまじない
// MMDevice インターフェースを取得
hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, IID_PPV_ARGS(&pEnum));
if (FAILED(hr)) {
CoUninitialize();
return 1;
}
// defaultのオーディオエンドポイントを取得
hr = pEnum->GetDefaultAudioEndpoint(eRender, eConsole, &pEndpoint);
if (FAILED(hr)) {
if (pEnum)
pEnum->Release();
CoUninitialize();
return 2;
}
// ボリュームオブジェクトを作成
hr = pEndpoint->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, NULL, (void**)&pAudioEndVol);
if (FAILED(hr)) {
if (pEndpoint)
pEndpoint->Release();
if (pEnum)
pEnum->Release();
CoUninitialize();
return 3;
}
// 左右のチャンネルの音量をセット
char* pfile;
pfile = argv[0] + strlen(argv[0]);
for (; pfile > argv[0]; pfile--)
{
if ((*pfile == '\\') || (*pfile == '/'))
{
pfile++;
break;
}
}
if (!_stricmp(pfile, "left.exe")) {
pAudioEndVol->SetChannelVolumeLevelScalar(0, 1.0, &GUID_NULL); // Left
pAudioEndVol->SetChannelVolumeLevelScalar(1, 0.0, &GUID_NULL); // right
}
else if (!_stricmp(pfile, "right.exe")) {
pAudioEndVol->SetChannelVolumeLevelScalar(0, 0.0, &GUID_NULL); // Left
pAudioEndVol->SetChannelVolumeLevelScalar(1, 1.0, &GUID_NULL); // right
}
else {
pAudioEndVol->SetChannelVolumeLevelScalar(0, 1.0, &GUID_NULL); // Left
pAudioEndVol->SetChannelVolumeLevelScalar(1, 1.0, &GUID_NULL); // right
}
if (pAudioEndVol)
pAudioEndVol->Release();
if (pEndpoint)
pEndpoint->Release();
if (pEnum)
pEnum->Release();
CoUninitialize();
return 0;
}
bcc32でもbuild出来ると思います。できたバイナリの名前をargv[0]から拾って、その名前によって動作が分岐します。Linuxより前のUnixの時代からよく使われた手ですね。grep,egrep,fgrepとか並べると懐かしい方もおられるでしょうかね?
Visual C++の開発環境でもコンパイルできるはずですが、一応やってみておきますかね。検索にdevelopとか入れて、

ここで選択。

cl.exeが起動すればおけ。上のコードをaudio.cppとかでセーブして、そのファイルがあるディレクトリまでcdします。楽なやり方は、ディレクトリを右クリックして

”パスのコピー”を選択、

“CD”まで入力した後、ペースト(右クリック)すると、

これでおけ。

link errorでちゃいました。
audio.obj : error LNK2019: 未解決の外部シンボル __imp__CoUninitialize@0 が関数 _main で参照されました
libraryの指定をすればなんとかなりそうですが、libraryの名前が分かりません。そういう時は、ダメ元でBing君にお伺いを立ててみましょうかね。
ole32.libをlibraryとして加えるとの示唆がありました。

できましたね。このあたりが面倒ならば、Visual Studio 2022のIDEからbuildしても良いですね。

新しいプロジェクトの作成、

コンソールアプリを選択す、

ソースを流し込んで、build。

left.exeをダブルクリックすると、

よさそうですね。元に戻すのは、restore.exeで、

いずれにしても、bcc32ないしbcc32cを使う方がずっと簡単ですね。
コメント