inohilog

/var/log/inohiro.log

MonoでSystem.Media.SoundPlayerを使った音再生ができないらしい

「MonoでSystem.Media.SoundPlayerを使った音再生ができない」らしい。ある情報筋から。
という事で簡単なコードを書いてみませう。

コード1

using System;
using System.Media;

public class Program
{
	public static void Main()
	{
		Console.WriteLine( "Play start" );
		string path = @"016.wav";
		SoundPlayer player = new SoundPlayer( path );
		player.Play();
		Console.WriteLine( "Play end" );
	}
}

結果1

*ファイルパスは適当にいじってます

コード2

using System;
using System.Media;
using System.IO;

public class Program
{
	public static void Main()
	{
		Console.WriteLine( "Play start" );
		string path = @"/Users/inohiro/Projects/mono/TerminalApplications/sound_mono/016.wav";
		SoundPlayer player = new SoundPlayer( new FileStream( path, FileMode.Open, FileAccess.Read, FileShare.Read ) );
		player.Play();
		Console.WriteLine( "Play end" );
	}
}

結果2

*ファイルパスは適当にいじってます

わかったこと

  • 再生できなかった(特に例外などが発生するわけでもない)。
  • Playメソッドを呼んだ後にコンソール/ターミナルに「Play end」の文字列を出力する様にしているが、音が鳴らない状態(Mac OS X)ではすぐに表示された
    • 音が鳴らないのではなく、音が再生されようとしていないのでは(あれ、このPlayメソッドはメインスレッドをロックしちゃうよね)。
  • SoundPlayerはPlayメソッドが呼ばれてから音ファイルの読み込みを開始する
  • Monoのコードをちらっとみたが、「/mono-2.4/mcs/class/System/System.Media」に「Win32SoundPlayer.cs」なるものがあり、SoundPlayerクラスのLoadメソッドなどでWin32APIの「PlaySound関数」を使ってるとか使ってないとか(P/Invokeですね)のチェックなどをしているようだ
  • じゃあ「Win32SoundPlayerクラス」を使えば音が鳴るんじゃない?
    • まだやってない