WindowsMobile6.5SNDPlayAsync-C#包装器?

WindowsMobile6.5SNDPlayAsync-C#包装器?,c#,.net,windows-mobile,compact-framework,mp3,C#,.net,Windows Mobile,Compact Framework,Mp3,我正在Windows Mobile 6.5上实现mp3播放。我需要使用SndPlaySync API函数,因为我不想在播放文件之前阻止调用线程(SndPlaySync会在播放音频文件之前阻止调用线程)。不幸的是,sndplaysync方法将声音句柄而不是声音文件路径作为参数,因此需要在播放之前打开句柄,并在播放之后释放它。问题是,我没有关于此API中播放完成的任何信息。有人在这个API中使用了C#包装器吗?在哪里可以买到?我查阅了OPENNETCF,但它们似乎不支持此API 关于你必须先打电话才

我正在Windows Mobile 6.5上实现mp3播放。我需要使用SndPlaySync API函数,因为我不想在播放文件之前阻止调用线程(SndPlaySync会在播放音频文件之前阻止调用线程)。不幸的是,sndplaysync方法将声音句柄而不是声音文件路径作为参数,因此需要在播放之前打开句柄,并在播放之后释放它。问题是,我没有关于此API中播放完成的任何信息。有人在这个API中使用了C#包装器吗?在哪里可以买到?我查阅了OPENNETCF,但它们似乎不支持此API

关于

你必须先打电话才能拿到手柄。看看这些文件,声明应该是这样的:

[DllImport("coredll", SetLastError=true)]
public static extern int SndOpen(string fileName, out IntPtr handle);

[DllImport("coredll", SetLastError=true)]
public static extern int SndPlayAsync (IntPtr handle, int flags);

[DllImport("coredll", SetLastError=true)]
public static extern int SndClose(IntPtr handle);
所以你可以用这样的方式来称呼它:

IntPtr handle;
var result = SndOpen("myfile.mp3", out handle);
if(result == 0) SndPlayAsync(handle, 0);

...

SndClose(handle);

您可以使用获取事件的句柄,该事件将在声音播放结束时发出信号。您可以使用WaitForSingleObject API等待或测试事件是否已设置。

如果您使用的是.NET CF,则没有理由创建包装器,您可以使用该类来处理它。有几个选项,包括PlaySync,可以同步播放声音

例如:

string path = "\\Program Files\\SNAP.App.CE\\Content\\5LongLow.wav";
System.Media.SoundPlayer player = new System.Media.SoundPlayer(path);
player.PlaySync();

如果不想阻止UI线程,也可以将其放在单独的线程中。

是的,这对我来说也是显而易见的。关键是何时调用SndClose?我如何知道播放何时结束?请看SndGetWaitHandle(),它“返回播放完声音后设置的事件的句柄”。这个类不能播放我在应用程序中声明必须播放的mp3文件。正确,但我决定在每次播放mp3时生成一个单独的线程,在这个线程中我调用SndPlaySync函数。