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


表題のような問題を解決したいわけですが、最低限左chの日本語音声と右chの英語音声が混ざっているのが不快ですが、PowerDVD Ultra側では切り替えができません。サウンド->スピーカーのプロパティー->レベル->バランス

のLやRを0にしたり、100にしたりすればいいのですが、ダイアログを辿るのが面倒なので、プログラムダブルクリック一発で所望の設定をしたいわけです。で、

restore.cpp
#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;
}

build済みのバイナリの名前を変更して、
left.exeにするとダブルクリックでleft ch 100%,right ch 0%へ、
right.exeにすると同じく left ch 0%,right ch 100%へ、
それ以外の名前ではleft chも right chも100%になります。

これらのプログラムで2カ国語混線は回避できますが、音量低下とバランス悪化が気になる方は、apo equalizer等で、

japanese.txt
Copy: L=L R=L

なるスクリプトを末端に置けばいいです。普通の状態に戻すのは、このスクリプトをremoveすればいいです。(意外に面倒ですけど。)