Click here to Skip to main content
15,891,762 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.2K   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.Text;
using Microsoft.DirectX.DirectSound;

namespace StreamComputers.Riff
{
	/// <summary>
	/// Contains static functions for developers working with MDX WAVE files and Buffers.
	/// </summary>
	public class MdxInfo
	{
		private MdxInfo() {}

		/// <summary>
		/// Returns a string representation of MDXWaveFormat properties.
		/// </summary>
		/// <param name="wf">MDX WaveFormat struct instance</param>
		/// <returns>7-line string representation of properties</returns>
		public static string WaveFormatAsString(WaveFormat wf)
		{
			StringBuilder wfs = new StringBuilder("MDX WaveFormat Properties:\n");
			wfs.AppendFormat("AverageBytesPerSecond:  {0}\n", wf.AverageBytesPerSecond);
			wfs.AppendFormat("BitsPerSample:          {0}\n", wf.BitsPerSample );
			wfs.AppendFormat("BlockAlign:             {0}\n", wf.BlockAlign );
			wfs.AppendFormat("Channels:               {0}\n", wf.Channels );
			wfs.AppendFormat("FormatTag:              {0}\n", wf.FormatTag );
			wfs.AppendFormat("SamplesPerSecond:       {0}\n", wf.SamplesPerSecond );
			return wfs.ToString();
		}

		public static string VariableDeviceCapsAsString (Device d)
		{
			StringBuilder devCaps = new StringBuilder();
			devCaps.AppendFormat("DirectX Device Capabilities that can change:\n");
			devCaps.AppendFormat("FreeHardware3DAllBuffers:             {0}\n", d.Caps.FreeHardware3DAllBuffers);
			devCaps.AppendFormat("FreeHardware3DStaticBuffers:          {0}\n", d.Caps.FreeHardware3DStaticBuffers);
			devCaps.AppendFormat("FreeHardware3DStreamingBuffers:       {0}\n", d.Caps.FreeHardware3DStreamingBuffers);
			devCaps.AppendFormat("FreeHardwareMemoryBytes:              {0}\n", d.Caps.FreeHardwareMemoryBytes);
			devCaps.AppendFormat("FreeHardwareMixingAllBuffers:         {0}\n", d.Caps.FreeHardwareMixingAllBuffers);
			devCaps.AppendFormat("FreeHardwareMixingStaticBuffers:      {0}\n", d.Caps.FreeHardwareMixingStaticBuffers);
			devCaps.AppendFormat("FreeHardwareMixingStreamingBuffers:   {0}\n", d.Caps.FreeHardwareMixingStreamingBuffers);
			devCaps.AppendFormat("MaxContigousFreeHardwareMemoryBytes:  {0}\n", d.Caps.MaxContigousFreeHardwareMemoryBytes);
			devCaps.AppendFormat("PlayCpuOverheadSoftwareBuffers:       {0}\n", d.Caps.PlayCpuOverheadSoftwareBuffers );
			return devCaps.ToString();
		}
		
		public static string DeviceCapsAsString (Device d)
		{
			StringBuilder devCaps = new StringBuilder();
			devCaps.AppendFormat("DirectX Device Capabilities:\n");
			devCaps.AppendFormat("Driver WDM Certified:                 {0}\n", d.Caps.Certified);
			devCaps.AppendFormat("ContinuousRate:                       {0}\n", d.Caps.ContinuousRate);
			devCaps.AppendFormat("EmulateDriver:                        {0}\n", d.Caps.EmulateDriver);
			devCaps.AppendFormat("FreeHardware3DAllBuffers:             {0}\n", d.Caps.FreeHardware3DAllBuffers);
			devCaps.AppendFormat("FreeHardware3DStaticBuffers:          {0}\n", d.Caps.FreeHardware3DStaticBuffers);
			devCaps.AppendFormat("FreeHardware3DStreamingBuffers:       {0}\n", d.Caps.FreeHardware3DStreamingBuffers);
			devCaps.AppendFormat("FreeHardwareMemoryBytes:              {0}\n", d.Caps.FreeHardwareMemoryBytes);
			devCaps.AppendFormat("FreeHardwareMixingAllBuffers:         {0}\n", d.Caps.FreeHardwareMixingAllBuffers);
			devCaps.AppendFormat("FreeHardwareMixingStaticBuffers:      {0}\n", d.Caps.FreeHardwareMixingStaticBuffers);
			devCaps.AppendFormat("FreeHardwareMixingStreamingBuffers:   {0}\n", d.Caps.FreeHardwareMixingStreamingBuffers);
			devCaps.AppendFormat("MaxContigousFreeHardwareMemoryBytes:  {0}\n", d.Caps.MaxContigousFreeHardwareMemoryBytes);
			devCaps.AppendFormat("MaxHardware3DAllBuffers:              {0}\n", d.Caps.MaxHardware3DAllBuffers);
			devCaps.AppendFormat("MaxHardware3DStaticBuffers:           {0}\n", d.Caps.MaxHardware3DStaticBuffers);
			devCaps.AppendFormat("MaxHardware3DStreamingBuffers:        {0}\n", d.Caps.MaxHardware3DStreamingBuffers);
			devCaps.AppendFormat("MaxHardwareMixingAllBuffers:          {0}\n", d.Caps.MaxHardwareMixingAllBuffers);
			devCaps.AppendFormat("MaxHardwareMixingStaticBuffers:       {0}\n", d.Caps.MaxHardwareMixingStaticBuffers);
			devCaps.AppendFormat("MaxHardwareMixingStreamingBuffers:    {0}\n", d.Caps.MaxHardwareMixingStreamingBuffers);
			devCaps.AppendFormat("MaxSecondarySampleRate:               {0}\n", d.Caps.MaxSecondarySampleRate);
			devCaps.AppendFormat("MinSecondarySampleRate:               {0}\n", d.Caps.MinSecondarySampleRate );
			devCaps.AppendFormat("PlayCpuOverheadSoftwareBuffers:       {0}\n", d.Caps.PlayCpuOverheadSoftwareBuffers );
			devCaps.AppendFormat("Primary16Bit:                         {0}\n", d.Caps.Primary16Bit );
			devCaps.AppendFormat("Primary8Bit:                          {0}\n", d.Caps.Primary8Bit );
			devCaps.AppendFormat("PrimaryBuffers:                       {0}\n", d.Caps.PrimaryBuffers );
			devCaps.AppendFormat("PrimaryMono:                          {0}\n", d.Caps.PrimaryMono );
			devCaps.AppendFormat("PrimaryStereo:                        {0}\n", d.Caps.PrimaryStereo );
			devCaps.AppendFormat("Secondary16Bit:                       {0}\n", d.Caps.Secondary16Bit );
			devCaps.AppendFormat("Secondary8Bit:                        {0}\n", d.Caps.Secondary8Bit );
			devCaps.AppendFormat("SecondaryMono:                        {0}\n", d.Caps.SecondaryMono );
			devCaps.AppendFormat("SecondaryStereo:                      {0}\n", d.Caps.SecondaryStereo );
			devCaps.AppendFormat("TotalHardwareMemoryBytes:             {0}\n", d.Caps.TotalHardwareMemoryBytes );
			devCaps.AppendFormat("UnlockTransferRateHardwareBuffers:    {0}\n", d.Caps.UnlockTransferRateHardwareBuffers );
			return devCaps.ToString();
		}
		
		/// <summary>
		///  Returns a string representation of BufferCaps properties.
		/// </summary>
		/// <param name="bc">MDX BufferCaps struct instance</param>
		/// <returns>19=line string representation of properties</returns>
		public static string BufferCapsAsString(BufferCaps bc)
		{
			StringBuilder bufCaps = new StringBuilder("MDX BufferCaps Properties:\n");
			bufCaps.AppendFormat("BufferBytes:             {0}\n", bc.BufferBytes);
			bufCaps.AppendFormat("CanGetCurrentPosition:   {0}\n", bc.CanGetCurrentPosition);
			bufCaps.AppendFormat("Control3D:               {0}\n", bc.Control3D);
			bufCaps.AppendFormat("ControlEffects:          {0}\n", bc.ControlEffects);
			bufCaps.AppendFormat("ControlFrequency:        {0}\n", bc.ControlFrequency);
			bufCaps.AppendFormat("ControlPan:              {0}\n", bc.ControlPan);
			bufCaps.AppendFormat("ControlPositionNotify:   {0}\n", bc.ControlPositionNotify);
			bufCaps.AppendFormat("ControlVolume:           {0}\n", bc.ControlVolume);
			bufCaps.AppendFormat("GlobalFocus:             {0}\n", bc.GlobalFocus);
			bufCaps.AppendFormat("LocateInHardware:        {0}\n", bc.LocateInHardware);
			bufCaps.AppendFormat("LocateInSoftware:        {0}\n", bc.LocateInSoftware);
			bufCaps.AppendFormat("LocationDefer:           {0}\n", bc.LocationDefer);
			bufCaps.AppendFormat("Mute3DAtMaximumDistance: {0}\n", bc.Mute3DAtMaximumDistance);
			bufCaps.AppendFormat("PlayCpuOverhead:         {0}\n", bc.PlayCpuOverhead);
			bufCaps.AppendFormat("PrimaryBuffer:           {0}\n", bc.PrimaryBuffer);
			bufCaps.AppendFormat("StaticBuffer:            {0}\n", bc.StaticBuffer);
			bufCaps.AppendFormat("StickyFocus:             {0}\n", bc.StickyFocus);
			bufCaps.AppendFormat("UnlockTransferRate:      {0}\n", bc.UnlockTransferRate);
			return bufCaps.ToString();

		}
	}

}




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