2

CodeProject CoreAudioApi (オーディオを操作するための非常に一般的なフレームワーク) を使用するプログラムを作成していますが、問題は CoreAudioApi が Vista より前の Windows のどのバージョンでも使用できないシステム コールを使用することです。CoreAudioApi でコンパイルされたプログラムを (using通常どおりステートメントを使用して) 実行すると、プログラムは Vista より前のバージョンでクラッシュします。

現在の環境のバージョン番号を取得するために、この関数を作成しました。

win_version = Environment.OSVersion.Version.Major;

これにより、必要なメジャー バージョン番号が返されます。'6' は Vista/7 で、それ以外は違います。これだけで判断する必要があります。これを利用して、OSが「6」以上の場合にCoreAudioApi名前空間を含めるかどうかを判断する必要があります。調査によると、usings はプログラムと共にコンパイルする必要がありますが、Reflection と呼ばれるものについても読みました。これが必要かもしれません。

CoreAudioApi 名前空間を取得したらusing(用語が不足していて申し訳ありません)、あとは簡単です。これどうやってするの?

TL;DR これを効果的に行う何らかの形式のコードが必要です。

using System;
using System.Text;
//etc
if(currentWindowsVersion>=6) using CoreAudioApi;

ただし、制御構造はクラスの外では機能せず、すべての名前空間はプログラムと共にコンパイルされ、個別には制御されません。

ありがとう!


編集:これまでのところ、これを使用して CoreAudioApi 名前空間をコンパイル済みアセンブリとしてロードしています:

if(win_version>=6){
    CoreAudioApi = Assembly.LoadFrom("CoreAudio.dll");
    CoreAudioApi.GetLoadedModules();
    CoreAudioApi.GetTypes();
    MessageBox.Show("Loaded CoreAudioApi");
}

ここからは、API の型とメソッドを実際に使用する必要があります。Windows Vista/7 で動作する私のコードは次のとおりです。

public static MMDeviceEnumerator devEnum;
public static MMDevice defaultDevice;
//later in a mute method:
defaultDevice.AudioEndpointVolume.Mute = true/false;

私はdevEnum AFAIKを本当に必要としないので、本当に重要なのは最後の2行だけです(コメントを除く)。

4

2 に答える 2

2

私はちょうど次のことを試しました:

  • 新しいコンソール アプリケーション プロジェクトを作成する
  • CoreAudioApiプロジェクトを CodeProject からソリューションに追加します
  • CoreAudioApiコンソール アプリにプロジェクト参照を追加する
  • 次のクラスを作成します。
interface IAudio { void SetVolume(float level); }

class XpAudio : IAudio {
    public void SetVolume(float level) {
        // I do nothing, but this is where your old-style code would go
    }
}

class VistaAudio : IAudio {
    public void SetVolume(float level) {
        MMDeviceEnumerator devEnum = new MMDeviceEnumerator();
        MMDevice defaultDevice = devEnum
            .GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia);
        defaultDevice.AudioEndpointVolume.MasterVolumeLevel = level;
    }
}

class Program {
    static void Main(string[] args) {
        IAudio setter = Environment.OSVersion.Version.Major >= 6
            ? (IAudio)new VistaAudio()
            : (IAudio)new XpAudio();
        float val = float.Parse(Console.ReadLine());
        setter.SetVolume(val);
        Console.ReadLine();
    }
}

これは、私のサーバー (~ Windows 7) とローカル (Windows XP) マシンの両方で実行されます私の XP マシンでは、喜んで値を取り込んで無視します。私のサーバーでは、例外がスローされます (おそらく、サウンド出力がないためです)。XP マシンで を実行すると、値を入力する前ではなく、入力したときにCoreAudioApi例外が発生します。

問題は、アプリケーションを壊すために何を違う方法で行っているかということです。CoreAudioApi起動時にコードを使用していますか?

EDIT:あなたの編集を見た後、これを行う場合、いじる必要はまったくありませんAssembly.LoadFrom。フレームワークは、必要な場合に (必要な場合にのみ) そのアセンブリを動的にロードする必要があります。

于 2012-11-08T13:54:32.047 に答える
-1

COREAUDIOAPI.dllMMDEVICEAPI (Device Enumeration)を処理できないため、XP 以前では動作しません。Vistaについてはわかりません。

于 2016-01-01T18:03:07.013 に答える