『原創』+『參考』親手實驗:使用C#在PPC中播放聲音

來源:互聯網
上載者:User

  今天,項目中要求用聲音來提示使用者程式的某個狀態被啟用了,發現,.Net CF下沒有System.Media這種好東東鳥~,於是乎,股溝、百毒最後再來個ZZK,發現MSDN和小鎮的文章都有提及在PPC下如何播放聲音(還有很多文章提到的方法差不多,但是都有網友反映不能成功播放,所以我在這裡就過濾掉了),msdn中說道的文章,好多朋友反映是播放不出來,在此我沒有去考證,我直接使用了小鎮的代碼,並且成功的播放了聲音,所以,寫下此篇隨筆,一來做個備份,二來和大家分享一下~

首先,我們建立一個.net cf 2.0下,名稱為SoundPlay的WM5 ppc項目,當然語言我選擇的是C#。

然後介面設計如下:其中:

lblFileName——Text屬性:檔案地址

btnOpen——Text屬性:瀏覽檔案

btnPlay——Text屬性:播放聲音

建立一個類:Sound,代碼和小鎮的差不多,不過我做過一小點修改,所以也貼出來,方便大家查閱:

 

Sound
using System;
using System.Runtime.InteropServices;
using System.IO;
using System.Collections.Generic;
using System.Text;

namespace SoundPlay
{
    public class Sound
    {
        private byte[] m_soundBytes;
        private enum Flags
        {
            SND_SYNC = 0x0000,  /* play synchronously (default) */
            SND_ASYNC = 0x0001,  /* play asynchronously */
            SND_NODEFAULT = 0x0002,  /* silence (!default) if sound not found */
            SND_MEMORY = 0x0004,  /* pszSound points to a memory file */
            SND_LOOP = 0x0008,  /* loop the sound until next sndPlaySound */
            SND_NOSTOP = 0x0010,  /* don't stop any currently playing sound */
            SND_NOWAIT = 0x00002000, /* don't wait if the driver is busy */
            SND_ALIAS = 0x00010000, /* name is a registry alias */
            SND_ALIAS_ID = 0x00110000, /* alias is a predefined ID */
            SND_FILENAME = 0x00020000, /* name is file name */
            SND_RESOURCE = 0x00040004  /* name is resource name or atom */
        }
        [DllImport("CoreDll.DLL", EntryPoint = "PlaySound", SetLastError = true)]
        private extern static int MobilePlaySound(string szSound, IntPtr hMod, int flags);//播放外部音效檔

        [DllImport("CoreDll.DLL", EntryPoint = "PlaySound", SetLastError = true)]
        private extern static int MoiblePlaySoundBytes(byte[] szSound, IntPtr hMod, int flags);//播放嵌入聲音資源

        /// <summary>
        /// Construct the Sound object to play sound data from the specified stream.
        /// </summary>
        public Sound(Stream stream)
        {
            // read the data from the stream
            m_soundBytes = new byte[stream.Length];
            stream.Read(m_soundBytes, 0, (int)stream.Length);
        }
        /// <summary>
        /// 從一個聲音byte流建構函式Sound
        /// </summary>
        /// <param name="snd"></param>
        public Sound(byte[] snd)
        {
            m_soundBytes = snd;
        }
        /// <summary>
        /// 構造一個空Sound函數,此函數用於播放外部檔案
        /// </summary>
        public Sound()
        {
        }

        /// <summary>
        /// Play the sound File播放外部檔案的Play方法
        /// </summary>
        public void Play(string filename)
        {
            MobilePlaySound(filename, IntPtr.Zero, (int)(Flags.SND_ASYNC | Flags.SND_FILENAME));

        }
        /// <summary>
        /// Play The Stream Sound,此方法應該對應從Byte和Stream構造的Sound
        /// 注意,它的Flags設定為SND_MEMORY,因為我們的音效檔已經轉換到記憶體中了
        /// </summary>
        public void Play()
        {
            MoiblePlaySoundBytes(m_soundBytes, IntPtr.Zero, (int)(Flags.SND_ASYNC | Flags.SND_MEMORY));
        }
    }
}

 

然後,主介面上的按鈕事件代碼如下:

 

按鈕代碼
 private void btnOpen_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog ofd = new OpenFileDialog())
            {
                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    lblFileName.Text = ofd.FileName;
                }
            }
        }

        private void btnPlay_Click(object sender, EventArgs e)
        {
            Sound sound = new Sound();
            sound.Play(lblFileName.Text);
        }

 

夠清楚了吧,經過測試,兩種方式(通過流或者指定檔案路徑)均能播放出選中的.wav音效檔。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.