Click here to Skip to main content
15,886,830 members
Articles / Multimedia / DirectX

Sound Experiments in Managed DirectX

Rate me:
Please Sign up or sign in to vote.
4.85/5 (46 votes)
16 Feb 200726 min read 267.8K   4K   118  
Using static and streaming sound buffers in Managed DirectX.
///+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//  THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
//  KIND, EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, WARRANTIES
//  OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//  � 2007 Gary W. Schwede and Stream Computers, Inc. All rights reserved.
//  Contact: gary at streamcomputers dot com. Permission to incorporate
//  all or part of this code in your application is given on the condition
//  that this notice accompanies it in your code and documentation.
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
using System;
using Microsoft.DirectX.DirectSound;

namespace StreamComputers.MdxDirectSound
{
	#region IPlayable declarations

	public enum BufferPlayState
	{
		NotReady = 0,
		Idle,
		Playing,
		Paused
	}
	
	/// <summary>
	/// Defines the three classic audio player buttons and their functions.
	/// </summary>
	public interface IPlayable
	{
		/// <summary>
		/// If in Idle state, attempts to play from the beginning.  
		/// If Paused, resumes play from current position.  Otherwise has no effect.
		/// </summary>
		void Play();

		/// <summary>
		/// Pause playing the sound file from Playing state, or resume playing from Paused state.
		/// If state is not Playing nor Paused, has no effect.
		/// </summary>
		/// <returns>Buffer.PlayPosition at time of call [bytes]</returns>
		int Pause();

		/// <summary>
		/// Stops play of the sound file and transitions to Idle state.
		/// </summary>
		void Stop();
	}
	#endregion

	#region MdxSoundBuffer Base Class

	/// <summary>
	/// Base class for implementations of Managed DirectX ("MDX") DirectSound SecondaryBuffers.
	/// Each instance is associated with a single RIFF WAVE file specified at construction.
	/// </summary>
	public abstract class MdxSoundBuffer : IPlayable, IDisposable
	{
		protected SecondaryBuffer	m_SecondaryBuffer;
		protected BufferPlayState	m_State;
		private bool				m_Disposed;

		public int BufferLength
		{
			get
			{
				return m_SecondaryBuffer.Caps.BufferBytes;
			}
		}

		protected MdxSoundBuffer()
		{}

		#region IPlayable Members

		/// <summary>
		/// Derived classes must call this method first.
		/// Assures buffer is not disposed.
		/// </summary>
		public virtual void Play()
		{
			if(Disposed)
			{
				throw new ObjectDisposedException("MdxSoundBuffer");
			}
		}
		
		/// <summary>
		/// Derived classes must call this method first.
		/// Assures buffer is not disposed.
		/// </summary>
		public virtual int Pause()
		{
			if(Disposed)
			{
				throw new ObjectDisposedException("MdxSoundBuffer");
			}
			return 0;
		}
		
		/// <summary>
		/// Derived classes must call this method first.
		/// Assures buffer is not disposed.
		/// </summary>
		public virtual void Stop()
		{
			if(Disposed)
			{
				throw new ObjectDisposedException("MdxSoundBuffer");
			}
		}
		#endregion

		#region Finalization

		// � 2005 IDesign Inc. Used by permission. 
		protected bool Disposed
		{
			get
			{
				lock(this)
				{
					return m_Disposed;
				}
			}
		}
		// � 2005 IDesign Inc. Used by permission.
		public void Dispose()
		{
			lock(this)
			{
				if(m_Disposed == false)
				{
					Cleanup();
					m_Disposed = true;
					GC.SuppressFinalize(this);
				}
			}
		}

		protected virtual void Cleanup()
		{
			if (m_SecondaryBuffer != null)
			{
				m_SecondaryBuffer.Dispose();
				m_SecondaryBuffer = null;		// hint to GC
			}
		}
		~MdxSoundBuffer()
		{
			Cleanup();
		}
		#endregion
	}
	#endregion
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.


Written By
Software Developer (Senior)
United States United States
My life and career have been a bit unusual (mostly in good ways). So, I'm grateful every day for the opportunities God's given me to do different things and see different aspects of life.

Education: B.S. Physics '73 (atmospheric physics, sounding rockets), M.S. Computer Science '76 (radio astronomy, fuzzy controllers, music pattern recognition and visualization) New Mexico Tech; Ph.D. Engineering '83 (parallel computer architecture, digital signal processing, economics) U.C. Berkeley.

I'm married to Susan, a wonderful woman whom I met in a Computer Architecture class at U.C. Berkeley.

Professional activities: Digital systems engineer, digital audio pioneer, founder or key in several tech startups, consulting engineer, expert witness. I'm currently developing a multithreading framework in C# .NET, that makes it almost easy to write correct programs for multicore processors. I'm also implementing a new transform for recognizing, editing, and processing signals, especially sound.

I'm an occasional essayist, public speaker, and podcaster, and free-market space advocate. I enjoy good wine, good music, good friends, and cats.

If you think your project could use a different point of view, I'm available for consulting work in the San Francisco Bay area, or (preferrably) via the net.

Comments and Discussions