Thursday, January 20, 2011

How to Play Audio Files in Windows Mobile?

The intension behind this post is to share the code snippet for playing Audio files programatically for Windows Mobile devices.

What you need to is 
1. Create one class ( say class name as Sound ) file.
2. Copy and paste this code 
3. Need to create the object of Sound class & call  play() & StopPlay() accordingly  :
e.g . Sound objSound = new Sound(@"fileName");
      objSound.Play();


Code Snippet is as below :

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

namespace YourNameSpace
{
    public class Sound
    {
        private byte[] m_soundBytes;
        private string m_fileName;

        public static bool isLooping = false;

        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 */
            // SND_HIGH = 0xFFFF
        }

        [DllImport("CoreDll.DLL", EntryPoint = "PlaySound", SetLastError = true)]
        private extern static int WCE_PlaySound(string szSound, IntPtr hMod, int flags);

        [DllImport("CoreDll.DLL", EntryPoint = "PlaySound", SetLastError = true)]
        private extern static int WCE_PlaySoundBytes(byte[] szSound, IntPtr hMod, int flags);

        public enum Volumes : int
        {
            OFF = 0,
            LOW = 858993459,
            NORMAL = 1717986918,
            MEDIUM = -1717986919,
            HIGH = -858993460,
            VERY_HIGH = -1
        }

        [DllImport("coredll.dll", SetLastError = true)]
        public static extern int waveOutSetVolume(IntPtr device, int volume);

        [DllImport("coredll.dll", SetLastError = true)]
        public static extern int waveOutGetVolume(IntPtr device, ref int volume);

        public static Volumes Volume
        {
            get
            {
                int v = (int)0;
                waveOutGetVolume(IntPtr.Zero, ref v);
                switch (v)
                {
                    case (int)Volumes.OFF: return Volumes.OFF;
                    case (int)Volumes.LOW: return Volumes.LOW;
                    case (int)Volumes.NORMAL: return Volumes.NORMAL;
                    case (int)Volumes.MEDIUM: return Volumes.MEDIUM;
                    case (int)Volumes.HIGH: return Volumes.HIGH;
                    case (int)Volumes.VERY_HIGH: return Volumes.VERY_HIGH;

                    default: return Volumes.OFF;
                }
            }
            set { waveOutSetVolume(IntPtr.Zero, (int)value); }
        }

        /// <summary>
        /// Construct the Sound object to play sound data from the specified file.
        /// </summary>
        public Sound(string fileName)
        {
            m_fileName = fileName;
        }

        /// <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>
        /// Play the sound
        /// </summary>
        public void Play(bool isLoop)
        {
            // if a file name has been registered, call WCE_PlaySound,
            //  otherwise call WCE_PlaySoundBytes
            try
            {
                //waveOutSetVolume(IntPtr.Zero, (int)Volumes.NORMAL);
                if (isLoop) isLooping = true;

                if (isLooping == false || isLoop == true)
                    if (m_fileName != null)
                     {
                                 if (isLoop)
                            WCE_PlaySound(m_fileName, IntPtr.Zero, (int)(Flags.SND_ASYNC |                                                  Flags.SND_LOOP | Flags.SND_FILENAME));
                                else
                            WCE_PlaySound(m_fileName, IntPtr.Zero, (int)(Flags.SND_ASYNC | Flags.SND_FILENAME));
                       }
                    else
                      {
              WCE_PlaySoundBytes(m_soundBytes, IntPtr.Zero, (int)(Flags.SND_ASYNC | Flags.SND_MEMORY));
                      }
            }
            catch
            {
                throw;
            }
        }

  public void StopPlay()
    {   // if a file name has been registered, call WCE_PlaySound,
        //  otherwise call WCE_PlaySoundBytes
         try
         {
            if (isLooping == false)
             {
               //waveOutSetVolume(IntPtr.Zero, (int)Volumes.OFF);
              if (m_fileName != null)
               WCE_PlaySound(m_fileName, IntPtr.Zero, (int)(Flags.SND_SYNC | Flags.SND_FILENAME));
             else
 WCE_PlaySoundBytes(m_soundBytes, IntPtr.Zero, (int)(Flags.SND_NODEFAULT | Flags.SND_MEMORY));
             }
         }
         catch
         {
                throw;
         }
        }
    }
}


Note : If you have any query please let me know.

Thanks

No comments:

Post a Comment