SoundPlayerを使用して埋め込みwavファイルを再生する
-
10-07-2019 - |
質問
バーコードのスキャンを担当するCompact Framework 3.5アプリケーションがあります。状況に応じて再生する必要がある3つの異なるサウンドがあるため、SoundPlayerオブジェクトのラッパークラスを作成し、その上でPlayメソッドを呼び出します。
public static class SoundEffectsPlayer
{
private static readonly SoundEffect _alert;
static SoundEffectsPlayer()
{
// This will cause the SoundEffect class to throw an error that the Uri
// Format is not supported, when new SoundPlayer(location) is called.
_alert = new SoundEffect("SoundEffects/alert.wav");
}
public static SoundEffect Alert
{
get { return _alert; }
}
}
public class SoundEffect
{
private readonly SoundPlayer _sound;
public SoundEffect(string location)
{
_sound = new SoundPlayer(location);
_sound.Load();
}
public bool IsLoaded
{
get { return _sound.IsLoadCompleted; }
}
public void Play()
{
_sound.Play();
}
}
アイデアは、バーコードをスキャンする必要があるたびにSoundPlayerを作成しないことです(1時間に数百回)。したがって、既にロードされているファイルに対してPlayを呼び出すだけです。
alert.wavファイルは、アプリケーションが参照するライブラリプロジェクトのルートにあるSoundEffectsフォルダーにあり、埋め込みリソースとして設定されています。 wavファイルをロードするには、SoundEffectsクラスに何を渡す必要がありますか? wavファイルもライブラリプロジェクトに埋め込む必要がありますか?
また、wavファイルの再生を処理している方法に問題があることに気づいていますか?これは私がこのようなことをする最初の試みなので、改善のための提案を受け入れています。
解決
うーん。 SoundPlayerを使用したことがないので、coredll関数PlaySoundの単なるラッパーであると推測しています。しかし、とにかく、引数としてファイルパスを要求することを期待します。
したがって、埋め込みリソースで動作させるには、おそらくファイルをディスクに保存してから再生する必要があります。おそらく、埋め込まれたリソースのアイデアを廃棄し、別のアイテムとして展開する方が簡単でしょう。メインプロジェクトに.wavを含めて、「コンテンツ」に設定します。および「新しい場合はコピー」サウンドプレーヤー呼び出しでファイルとして参照します。
WindowsCEでは、常にフルパスも必要であることを忘れないでください。現在実行中の.exeからの相対パスはCEでは機能しません。
「現在地」を見つける必要がある場合リソースへのパスを作成するには、への回答を参照してくださいこの質問。