PowerDVD Ultra 18等で『DLNA TV 二か国語放送主福切り替え』がブロークンなのを対策してみる

以前に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を使う方がずっと簡単ですね。

コメント