Click here to Skip to main content
15,892,575 members
Articles / Programming Languages / Visual Basic

Audio Library Part I - (Windows Mixer Control)

Rate me:
Please Sign up or sign in to vote.
4.52/5 (79 votes)
1 Oct 2006CPOL3 min read 609.6K   15.4K   163  
Library to control Windows Mixer from C#
//
//  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
//  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
//  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
//  PURPOSE. IT CAN BE DISTRIBUTED FREE OF CHARGE AS LONG AS THIS HEADER 
//  REMAINS UNCHANGED.
//
//  Email:  gustavo_franco@hotmail.com
//
//  Copyright (C) 2005 Franco, Gustavo 
//
using System;
using System.Runtime.InteropServices;
using System.Text;

namespace WaveLib.WaveServices
{
	#region Enums
	#region Call Back Type
	public enum CallBackFlag
	{
		CALLBACK_TYPEMASK   = 0x00070000,    /* callback type mask */
		CALLBACK_NULL       = 0x00000000,    /* no callback */
		CALLBACK_WINDOW     = 0x00010000,    /* dwCallback is a HWND */
		CALLBACK_TASK       = 0x00020000,    /* dwCallback is a HTASK */
		CALLBACK_FUNCTION   = 0x00030000,    /* dwCallback is a FARPROC */
		CALLBACK_THREAD     = (CALLBACK_TASK), /* thread ID replaces 16 bit task */
		CALLBACK_EVENT      = 0x00050000    /* dwCallback is an EVENT Handle */
	}
	#endregion

	#region Wave Format Tag
	public enum WaveFormatTag : ushort
	{
		UNKNOWN                    = 0x0000, /* Microsoft Corporation */
		PCM						   = 0x0001, /* Microsoft Corporation */
		ADPCM                      = 0x0002, /* Microsoft Corporation */
		IEEE_FLOAT                 = 0x0003, /* Microsoft Corporation */
		VSELP                      = 0x0004, /* Compaq Computer Corp. */
		IBM_CVSD                   = 0x0005, /* IBM Corporation */
		ALAW                       = 0x0006, /* Microsoft Corporation */
		MULAW                      = 0x0007, /* Microsoft Corporation */
		DTS                        = 0x0008, /* Microsoft Corporation */
		DRM                        = 0x0009, /* Microsoft Corporation */
		OKI_ADPCM                  = 0x0010, /* OKI */
		DVI_ADPCM                  = 0x0011, /* Intel Corporation */
		IMA_ADPCM                  = (DVI_ADPCM), /*  Intel Corporation */
		MEDIASPACE_ADPCM           = 0x0012, /* Videologic */
		SIERRA_ADPCM               = 0x0013, /* Sierra Semiconductor Corp */
		G723_ADPCM                 = 0x0014, /* Antex Electronics Corporation */
		DIGISTD                    = 0x0015, /* DSP Solutions, Inc. */
		DIGIFIX                    = 0x0016, /* DSP Solutions, Inc. */
		DIALOGIC_OKI_ADPCM         = 0x0017, /* Dialogic Corporation */
		MEDIAVISION_ADPCM          = 0x0018, /* Media Vision, Inc. */
		CU_CODEC                   = 0x0019, /* Hewlett-Packard Company */
		YAMAHA_ADPCM               = 0x0020, /* Yamaha Corporation of America */
		SONARC                     = 0x0021, /* Speech Compression */
		DSPGROUP_TRUESPEECH        = 0x0022, /* DSP Group, Inc */
		ECHOSC1                    = 0x0023, /* Echo Speech Corporation */
		AUDIOFILE_AF36             = 0x0024, /* Virtual Music, Inc. */
		APTX                       = 0x0025, /* Audio Processing Technology */
		AUDIOFILE_AF10             = 0x0026, /* Virtual Music, Inc. */
		PROSODY_1612               = 0x0027, /* Aculab plc */
		LRC                        = 0x0028, /* Merging Technologies S.A. */
		DOLBY_AC2                  = 0x0030, /* Dolby Laboratories */
		GSM610                     = 0x0031, /* Microsoft Corporation */
		MSNAUDIO                   = 0x0032, /* Microsoft Corporation */
		ANTEX_ADPCME               = 0x0033, /* Antex Electronics Corporation */
		CONTROL_RES_VQLPC          = 0x0034, /* Control Resources Limited */
		DIGIREAL                   = 0x0035, /* DSP Solutions, Inc. */
		DIGIADPCM                  = 0x0036, /* DSP Solutions, Inc. */
		CONTROL_RES_CR10           = 0x0037, /* Control Resources Limited */
		NMS_VBXADPCM               = 0x0038, /* Natural MicroSystems */
		CS_IMAADPCM                = 0x0039, /* Crystal Semiconductor IMA ADPCM */
		ECHOSC3                    = 0x003A, /* Echo Speech Corporation */
		ROCKWELL_ADPCM             = 0x003B, /* Rockwell International */
		ROCKWELL_DIGITALK          = 0x003C, /* Rockwell International */
		XEBEC                      = 0x003D, /* Xebec Multimedia Solutions Limited */
		G721_ADPCM                 = 0x0040, /* Antex Electronics Corporation */
		G728_CELP                  = 0x0041, /* Antex Electronics Corporation */
		MSG723                     = 0x0042, /* Microsoft Corporation */
		MPEG                       = 0x0050, /* Microsoft Corporation */
		RT24                       = 0x0052, /* InSoft, Inc. */
		PAC                        = 0x0053, /* InSoft, Inc. */
		MPEGLAYER3                 = 0x0055, /* ISO/MPEG Layer3 Format Tag */
		LUCENT_G723                = 0x0059, /* Lucent Technologies */
		CIRRUS                     = 0x0060, /* Cirrus Logic */
		ESPCM                      = 0x0061, /* ESS Technology */
		VOXWARE                    = 0x0062, /* Voxware Inc */
		CANOPUS_ATRAC              = 0x0063, /* Canopus, co., Ltd. */
		G726_ADPCM                 = 0x0064, /* APICOM */
		G722_ADPCM                 = 0x0065, /* APICOM */
		DSAT_DISPLAY               = 0x0067, /* Microsoft Corporation */
		VOXWARE_BYTE_ALIGNED       = 0x0069, /* Voxware Inc */
		VOXWARE_AC8                = 0x0070, /* Voxware Inc */
		VOXWARE_AC10               = 0x0071, /* Voxware Inc */
		VOXWARE_AC16               = 0x0072, /* Voxware Inc */
		VOXWARE_AC20               = 0x0073, /* Voxware Inc */
		VOXWARE_RT24               = 0x0074, /* Voxware Inc */
		VOXWARE_RT29               = 0x0075, /* Voxware Inc */
		VOXWARE_RT29HW             = 0x0076, /* Voxware Inc */
		VOXWARE_VR12               = 0x0077, /* Voxware Inc */
		VOXWARE_VR18               = 0x0078, /* Voxware Inc */
		VOXWARE_TQ40               = 0x0079, /* Voxware Inc */
		SOFTSOUND                  = 0x0080, /* Softsound, Ltd. */
		VOXWARE_TQ60               = 0x0081, /* Voxware Inc */
		MSRT24                     = 0x0082, /* Microsoft Corporation */
		G729A                      = 0x0083, /* AT&T Labs, Inc. */
		MVI_MVI2                   = 0x0084, /* Motion Pixels */
		DF_G726                    = 0x0085, /* DataFusion Systems (Pty) (Ltd) */
		DF_GSM610                  = 0x0086, /* DataFusion Systems (Pty) (Ltd) */
		ISIAUDIO                   = 0x0088, /* Iterated Systems, Inc. */
		ONLIVE                     = 0x0089, /* OnLive! Technologies, Inc. */
		SBC24                      = 0x0091, /* Siemens Business Communications Sys */
		DOLBY_AC3_SPDIF            = 0x0092, /* Sonic Foundry */
		MEDIASONIC_G723            = 0x0093, /* MediaSonic */
		PROSODY_8KBPS              = 0x0094, /* Aculab plc */
		ZYXEL_ADPCM                = 0x0097, /* ZyXEL Communications, Inc. */
		PHILIPS_LPCBB              = 0x0098, /* Philips Speech Processing */
		PACKED                     = 0x0099, /* Studer Professional Audio AG */
		MALDEN_PHONYTALK           = 0x00A0, /* Malden Electronics Ltd. */
		RHETOREX_ADPCM             = 0x0100, /* Rhetorex Inc. */
		IRAT                       = 0x0101, /* BeCubed Software Inc. */
		VIVO_G723                  = 0x0111, /* Vivo Software */
		VIVO_SIREN                 = 0x0112, /* Vivo Software */
		DIGITAL_G723               = 0x0123, /* Digital Equipment Corporation */
		SANYO_LD_ADPCM             = 0x0125, /* Sanyo Electric Co., Ltd. */
		SIPROLAB_ACEPLNET          = 0x0130, /* Sipro Lab Telecom Inc. */
		SIPROLAB_ACELP4800         = 0x0131, /* Sipro Lab Telecom Inc. */
		SIPROLAB_ACELP8V3          = 0x0132, /* Sipro Lab Telecom Inc. */
		SIPROLAB_G729              = 0x0133, /* Sipro Lab Telecom Inc. */
		SIPROLAB_G729A             = 0x0134, /* Sipro Lab Telecom Inc. */
		SIPROLAB_KELVIN            = 0x0135, /* Sipro Lab Telecom Inc. */
		G726ADPCM                  = 0x0140, /* Dictaphone Corporation */
		QUALCOMM_PUREVOICE         = 0x0150, /* Qualcomm, Inc. */
		QUALCOMM_HALFRATE          = 0x0151, /* Qualcomm, Inc. */
		TUBGSM                     = 0x0155, /* Ring Zero Systems, Inc. */
		MSAUDIO1                   = 0x0160, /* Microsoft Corporation */
		UNISYS_NAP_ADPCM           = 0x0170, /* Unisys Corp. */
		UNISYS_NAP_ULAW            = 0x0171, /* Unisys Corp. */
		UNISYS_NAP_ALAW            = 0x0172, /* Unisys Corp. */
		UNISYS_NAP_16K             = 0x0173, /* Unisys Corp. */
		CREATIVE_ADPCM             = 0x0200, /* Creative Labs, Inc */
		CREATIVE_FASTSPEECH8       = 0x0202, /* Creative Labs, Inc */
		CREATIVE_FASTSPEECH10      = 0x0203, /* Creative Labs, Inc */
		UHER_ADPCM                 = 0x0210, /* UHER informatic GmbH */
		QUARTERDECK                = 0x0220, /* Quarterdeck Corporation */
		ILINK_VC                   = 0x0230, /* I-link Worldwide */
		RAW_SPORT                  = 0x0240, /* Aureal Semiconductor */
		ESST_AC3                   = 0x0241, /* ESS Technology, Inc. */
		IPI_HSX                    = 0x0250, /* Interactive Products, Inc. */
		IPI_RPELP                  = 0x0251, /* Interactive Products, Inc. */
		CS2                        = 0x0260, /* Consistent Software */
		SONY_SCX                   = 0x0270, /* Sony Corp. */
		FM_TOWNS_SND               = 0x0300, /* Fujitsu Corp. */
		BTV_DIGITAL                = 0x0400, /* Brooktree Corporation */
		QDESIGN_MUSIC              = 0x0450, /* QDesign Corporation */
		VME_VMPCM                  = 0x0680, /* AT&T Labs, Inc. */
		TPC                        = 0x0681, /* AT&T Labs, Inc. */
		OLIGSM                     = 0x1000, /* Ing C. Olivetti & C., S.p.A. */
		OLIADPCM                   = 0x1001, /* Ing C. Olivetti & C., S.p.A. */
		OLICELP                    = 0x1002, /* Ing C. Olivetti & C., S.p.A. */
		OLISBC                     = 0x1003, /* Ing C. Olivetti & C., S.p.A. */
		OLIOPR                     = 0x1004, /* Ing C. Olivetti & C., S.p.A. */
		LH_CODEC                   = 0x1100, /* Lernout & Hauspie */
		NORRIS                     = 0x1400, /* Norris Communications, Inc. */
		SOUNDSPACE_MUSICOMPRESS    = 0x1500, /* AT&T Labs, Inc. */
		DVM                        = 0x2000, /* FAST Multimedia AG */

		EXTENSIBLE                 = 0xFFFE /* Microsoft */
	}
	#endregion
	#endregion

	#region Structs
	[StructLayout(LayoutKind.Sequential, Pack=2, Size = 100)] 
	public struct WAVEFORMATEX
	{
		public WaveFormatTag	formatTag;
		public short			nChannels;
		public int				nSamplesPerSec;
		public int				nAvgBytesPerSec;
		public short			nBlockAlign;
		public short			wBitsPerSample;
		public short			cbSize;
		[MarshalAs(UnmanagedType.U1, SizeConst = 100 - 18)]
		public byte				extraInfo;

		public WAVEFORMATEX(int rate, int bits, int channels)
		{
			formatTag		= WaveFormatTag.PCM;
			nChannels		= (short)channels;
			nSamplesPerSec	= rate;
			wBitsPerSample	= (short)bits;
			cbSize			= 0;
               
			nBlockAlign		= (short)(channels * (bits / 8));
			nAvgBytesPerSec = nSamplesPerSec * nBlockAlign;
			extraInfo		= 0;
		}

		public static WAVEFORMATEX Empty
		{
			get{return new WAVEFORMATEX();}
		}

		public bool IsEmpty
		{
			get
			{
				if (formatTag == WaveFormatTag.UNKNOWN &&
					nChannels == 0 &&
					nSamplesPerSec == 0 &&
					nAvgBytesPerSec == 0 &&
					nBlockAlign == 0 &&
					wBitsPerSample == 0 && 
					cbSize == 0)
					return true;
				return false;
			}
		}

		public static int SizeOfEmpty
		{
			get{return 18;}
		}

		public int SizeOf
		{
			get{return SizeOfEmpty + cbSize;}
		}

	}
	#endregion

	[Author("Gustavo Franco")]
	internal class WaveNative
	{
		#region Constants
		public const int WAVE_MAPPER = -1;
		#endregion

		#region Winmm.dll
		[DllImport("winmm.dll")]
		public static extern int waveOutOpen(out IntPtr hWaveOut, int uDeviceID, ref WAVEFORMATEX lpFormat, IntPtr dwCallback, int dwInstance, int dwFlags);
		[DllImport("winmm.dll")]
		public static extern int waveOutOpen(out IntPtr hWaveOut, int uDeviceID, ref WAVEFORMATEX lpFormat, int dwCallback, int dwInstance, int dwFlags);
		[DllImport("winmm.dll")]
		public static extern int waveOutOpen(out IntPtr hWaveOut, int uDeviceID, ref WAVEFORMATEX lpFormat, IntPtr dwCallback, IntPtr dwInstance, int dwFlags);
		[DllImport("winmm.dll")]
		public static extern int waveOutClose(IntPtr hWaveOut);
		[DllImport("winmm.dll")]
		public static extern int waveInClose(IntPtr hwi);
		[DllImport("winmm.dll")]
		public static extern int waveInOpen(out IntPtr hWaveIn, int uDeviceID, ref WAVEFORMATEX lpFormat, IntPtr dwCallback, IntPtr dwInstance, int dwFlags);
		[DllImport("winmm.dll")]
		public static extern int waveInOpen(out IntPtr hWaveIn, int uDeviceID, ref WAVEFORMATEX lpFormat, int dwCallback, IntPtr dwInstance, int dwFlags);
		#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.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer Microsoft
United States United States
I started with programming about 19 years ago as a teenager, from my old Commodore moving to PC/Server environment Windows/UNIX SQLServer/Oracle doing gwBasic, QBasic, Turbo Pascal, Assembler, Turbo C, BC, Summer87, Clipper, Fox, SQL, C/C++, Pro*C, VB3/5/6, Java, and today loving C#.

Currently working as SDE on Failover Clustering team for Microsoft.

Passion for most programming languages and my kids Aidan&Nadia.

Comments and Discussions