PlaySound (winmm)
Last changed: -71.188.245.175

.
Summary
Plays a PCM sound file from a filename, resource name or registry alias

C# Signature:

[DllImport("winmm.dll", SetLastError=true)]
static extern bool PlaySound(string pszSound, UIntPtr hmod, uint fdwSound);

[DllImport("winmm.dll", SetLastError=true)]
static extern bool PlaySound(byte[] pszSound, IntPtr hmod, SoundFlags fdwSound);

VB Signature:

<DllImport("winmm.dll")> _
Shared Function PlaySound( _
   ByVal szSound As String, _
   ByVal hModule As UIntPtr, _
   ByVal fdwSound As Integer) As Integer
End Function

Or

Public Declare Auto Function PlaySound Lib "winmm.dll" (ByVal pszSound As String, ByVal hmod As IntPtr, ByVal fdwSound As Integer) As Boolean
Public Declare Auto Function PlaySound Lib "winmm.dll" (ByVal pszSound As Byte(), ByVal hmod As IntPtr, ByVal fdwSound As SoundFlags) As Boolean

Notes:

You will need these flags for the fdwSound parameter

C#:

[Flags]
public enum SoundFlags
{
    /// <summary>play synchronously (default)</summary>
    SND_SYNC = 0x0000,    
    /// <summary>play asynchronously</summary>
    SND_ASYNC = 0x0001,
    /// <summary>silence (!default) if sound not found</summary>
    SND_NODEFAULT = 0x0002,
    /// <summary>pszSound points to a memory file</summary>
    SND_MEMORY = 0x0004,
    /// <summary>loop the sound until next sndPlaySound</summary>
    SND_LOOP = 0x0008,    
    /// <summary>don't stop any currently playing sound</summary>
    SND_NOSTOP = 0x0010,
    /// <summary>Stop Playing Wave</summary>
    SND_PURGE = 0x40,
    /// <summary>The pszSound parameter is an application-specific alias in the registry. You can combine this flag with the SND_ALIAS or SND_ALIAS_ID flag to specify an application-defined sound alias.</summary>
    SND_APPLICATION = 0x80,
    /// <summary>don't wait if the driver is busy</summary>
    SND_NOWAIT = 0x00002000,
    /// <summary>name is a registry alias</summary>
    SND_ALIAS = 0x00010000,
    /// <summary>alias is a predefined id</summary>
    SND_ALIAS_ID = 0x00110000,
    /// <summary>name is file name</summary>
    SND_FILENAME = 0x00020000,
    /// <summary>name is resource name or atom</summary>
    SND_RESOURCE = 0x00040004
}

VB.NET:

<Flags()> _
    Public Enum SoundFlags As Integer
    ''' <summary>
    ''' The sound is played synchronously, and PlaySound returns after
    ''' the sound event completes. This is the default behavior.
    ''' </summary>
    SND_SYNC = &H0

    ''' <summary>
    ''' The sound is played asynchronously and PlaySound returns
    ''' immediately after beginning the sound. To terminate an
    ''' asynchronously played waveform sound, call PlaySound with
    ''' pszSound set to NULL.
    ''' </summary>
    SND_ASYNC = &H1

    ''' <summary>
    ''' No default sound event is used. If the sound cannot be found,
    ''' PlaySound returns silently without playing the default sound.
    ''' </summary>
    SND_NODEFAULT = &H2

    ''' <summary>
    ''' The pszSound parameter points to a sound loaded in memory.
    ''' </summary>
    SND_MEMORY = &H4

    ''' <summary>
    ''' The sound plays repeatedly until PlaySound is called again
    ''' with the pszSound parameter set to NULL. If this flag is
    ''' set, you must also set the SND_ASYNC flag.
    ''' </summary>
    SND_LOOP = &H8

    ''' <summary>
    ''' The specified sound event will yield to another sound event
    ''' that is already playing. If a sound cannot be played because
    ''' the resource needed to generate that sound is busy playing
    ''' another sound, the function immediately returns False without
    ''' playing the requested sound.
    ''' </summary>
    ''' <remarks>If this flag is not specified, PlaySound attempts
    ''' to stop the currently playing sound so that the device can
    ''' be used to play the new sound.
    ''' </remarks>
    SND_NOSTOP = &H10

    ''' <summary>
    ''' Stop playing wave
    ''' </summary>
    SND_PURGE = &H40

    ''' <summary>
    ''' The pszSound parameter is an application-specific alias in
    ''' the registry. You can combine this flag with the SND_ALIAS
    ''' or SND_ALIAS_ID flag to specify an application-defined sound
    ''' alias.
    ''' </summary>
    SND_APPLICATION = &H80

    ''' <summary>
    ''' If the driver is busy, return immediately without playing
    ''' the sound.
    ''' </summary>
    SND_NOWAIT = &H2000

    ''' <summary>
    ''' The pszSound parameter is a system-event alias in the
    ''' registry or the WIN.INI file. Do not use with either
    ''' SND_FILENAME or SND_RESOURCE.
    ''' </summary>
    SND_ALIAS = &H10000

    ''' <summary>
    ''' The pszSound parameter is a file name. If the file cannot be
    ''' found, the function plays the default sound unless the
    ''' SND_NODEFAULT flag is set.
    ''' </summary>
    SND_FILENAME = &H20000

    ''' <summary>
    ''' The pszSound parameter is a resource identifier; hmod must
    ''' identify the instance that contains the resource.
    ''' </summary>
    SND_RESOURCE = &H40004
    End Enum

Tips & Tricks:

To play a sound looping both SND_LOOP and SND_ASYNC flags have to be specified. Looped sounds only stop when PlaySound is called with pszSound set to NULL.

Sample Code:

C#:

public static void Play (string strFileName)
{
    PlaySound (strFileName, UIntPtr.Zero, (uint)(SoundFlags.SND_FILENAME | SoundFlags.SND_ASYNC));
}

public static void Play (byte[] waveData) //bad idea, see http://blogs.msdn.com/larryosterman/archive/2009/02/19/playsound-xxx-snd-memory-snd-async-is-almost-always-a-bad-idea.aspx
{
    PlaySound (waveData, IntPtr.Zero, PlayFlags.SND_ASYNC | PlayFlags.SND_MEMORY);
}
private void button2_Click(object sender, System.EventArgs e)
{
     UIntPtr ip = UIntPtr.Zero;
     bool result = PlaySound(@"C:\path\to\wav\file.wav" ,ip ,0);
}

VB.NET:

Public Shared Sub Play(ByVal strFileName As String)
     PlaySound(strFileName, IntPtr.Zero, SoundFlags.SND_FILENAME Or SoundFlags.SND_ASYNC)
End Sub

Public Shared Sub Play(ByVal waveData As Byte()) //bad idea, see http://blogs.msdn.com/larryosterman/archive/2009/02/19/playsound-xxx-snd-memory-snd-async-is-almost-always-a-bad-idea.aspx
     PlaySound(waveData, IntPtr.Zero, SoundFlags.SND_ASYNC Or SoundFlags.SND_MEMORY)
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     Dim ip As UIntPtr = UIntPtr.Zero
     Dim result As Boolean = PlaySound("C:\path\to\wav\file.wav", IntPtr.Zero, ip)
End Sub

Alternative Managed API:

In .Net 2.0 you can use the System.Media.SoundPlayer class instead:

SoundPlayer sound = new SoundPlayer(@"C:\Windows\Media\tada.wav");
sound.Load(); // can also be called asychronously i.e. LoadAsync()
sound.Play(); // default is to play asyncronously

In .Net Framework 2.0 and up you can use the My keyword instead of this P/Invoke method:

My.Computer.Audio.Play("C:\path\to\wav\file.wav")

Or you can play a system specific sound:

My.Computer.Audio.PlaySystemSound(Media.SystemSounds.Asterisk)

Documentation
PlaySound on MSDN

http://msdn2.microsoft.com/en-us/library/ms712879.aspx