Click here to Skip to main content
15,892,072 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 269.4K   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 System.Diagnostics;
using System.Windows.Forms;
using Microsoft.DirectX.DirectSound;
using StreamComputers.Riff;
using StreamComputers.Utilities;

namespace StreamComputers.MdxDirectSound
{
	/// <summary>
	/// Implements a MDX SecondaryBuffer loaded with wave data from a whole RIFF WAVE file.
	/// </summary>
	public class StaticSoundBuffer : MdxSoundBuffer
	{
		public StaticSoundBuffer(string fileName, BufferDescription bufferDescription, Device dev)
		{
			try
			{
				m_SecondaryBuffer = new SecondaryBuffer(fileName, bufferDescription, dev);
				m_SecondaryBuffer.SetCurrentPosition(0);
				m_State = BufferPlayState.Idle;
				DebugConsole.Write("Upon allocation, ");
				DebugConsole.WriteLine(MdxInfo.BufferCapsAsString(m_SecondaryBuffer.Caps));
			}
			catch (OutOfMemoryException)
			{
				MessageBox.Show("This sound file is too large\n to load into a Static buffer.\n"
					+ "Select Streaming Buffer instead.");
				throw;
			}
			catch (ArgumentException)
			{
				MessageBox.Show("File is not a valid Managed DirectSound RIFF file:"
					 + "\n Please select another.");
				throw;
			}	
		}
		
		/// <summary>
		/// If in Idle state, attempts to play from the beginning.  
		/// If Paused, resumes play from current position.
		/// If in Playing state, but not in Playing Status, restarts play. 
		/// Otherwise has no effect.
		/// </summary>
		public override void Play()
		{
			base.Play();
			switch(m_State)
			{
				case BufferPlayState.NotReady:
					Debug.Assert(false);
					break; 
					
				case BufferPlayState.Idle:
					try
					{
						m_SecondaryBuffer.SetCurrentPosition(0);
						m_SecondaryBuffer.Play(0,BufferPlayFlags.Default);
						m_State = BufferPlayState.Playing;
					}
					catch(OutOfMemoryException)
					{
						MessageBox.Show("This sound file is too large\n  to play using a Static buffer.\n"
							+ "Select Streaming Buffer instead.");
						throw;
					}				
					break;
					
				case BufferPlayState.Playing:
					if( !m_SecondaryBuffer.Status.Playing )
					{
						m_State = BufferPlayState.Idle;
						Play();
					}
					break;
					
				case BufferPlayState.Paused:
					{
						m_SecondaryBuffer.Play(0,BufferPlayFlags.Default);
						m_State = BufferPlayState.Playing;
					}
					break;
			}
		}

		/// <summary>
		/// Pauses and resumes play. If not playing nor paused, has no effect.
		/// </summary>
		/// <returns>Buffer.PlayPosition at time of call</returns>
		public override int Pause()
		{
			base.Pause();
			int playPos = m_SecondaryBuffer.PlayPosition;
			if (m_State == BufferPlayState.Playing)
			{
				m_SecondaryBuffer.Stop();
				m_State = BufferPlayState.Paused;
			}
			else if(m_State == BufferPlayState.Paused)
			{
				m_SecondaryBuffer.Play(0,BufferPlayFlags.Default);
				m_State = BufferPlayState.Playing;
			}
			return playPos ;
		}

		/// <summary>
		/// Stops play of the sound file and transitions to Idle state.
		/// </summary>
		public override void Stop()
		{
			base.Stop();
			m_SecondaryBuffer.Stop();
			m_State = BufferPlayState.Idle;
		}
	}
}

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