【问题标题】:Windows Mobile 6.5 SndPlayAsync - C# wrapper?Windows Mobile 6.5 SndPlayAsync - C# 包装器?
【发布时间】:2010-12-27 14:14:40
【问题描述】:

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

问候

【问题讨论】:

    标签: c# .net windows-mobile compact-framework mp3


    【解决方案1】:

    您必须先致电SndOpen 才能获得句柄。查看文档,声明将大致如下:

    [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);
    

    【讨论】:

    • 是的,这对我来说也很明显。关键是何时调用 SndClose?我如何知道播放何时结束?
    • 查看 SndGetWaitHandle (msdn.microsoft.com/en-us/library/bb416690.aspx),它“返回一个在声音播放完毕时设置的事件的句柄。”
    【解决方案2】:

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

    例如:

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

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

    【讨论】:

    • 这个类不能播放 mp3 文件,我说这是我的应用程序中必须的。
    【解决方案3】:

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

    【讨论】:

    • 正确,但我决定每次播放 mp3 时都生成一个单独的线程,并在该线程中调用 SndPlaySync 函数。
    猜你喜欢
    • 2012-07-29
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 2017-01-28
    • 2012-05-20
    相关资源
    最近更新 更多