view dstep/coreaudio/AudioHardware.d @ 16:19885b43130e

Huge update, the bridge actually works now
author Jacob Carlborg <doob@me.com>
date Sun, 03 Jan 2010 22:06:11 +0100
parents
children
line wrap: on
line source

/**
 * Copyright: Copyright (c) 2009 Jacob Carlborg.
 * Authors: Jacob Carlborg
 * Version: Initial created: Sep 30, 2009 
 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
 */
module dstep.coreaudio.AudioHardware;

import dstep.coreaudio.CoreAudioTypes;
import dstep.corefoundation.CoreFoundation;
import dstep.internal.Version;
import dstep.objc.bridge.TypeEncoding;

alias uint AudioObjectPropertySelector;
alias uint AudioObjectPropertyScope;
alias uint AudioObjectPropertyElement;
alias uint AudioClassID;
alias uint AudioObjectID;
alias uint AudioHardwarePropertyID;
alias uint AudioDeviceID;
alias uint AudioDevicePropertyID;
alias AudioDeviceIOProc AudioDeviceIOProcID;
alias uint AudioStreamID;

extern (C)
{
	alias int function (AudioDeviceID inDevice, uint inChannel, bool isInput, AudioDevicePropertyID inPropertyID) AudioDevicePropertyListenerProc;
	alias int function (AudioDevicePropertyID inPropertyID, void* inClientData) AudioHardwarePropertyListenerProc;
	alias int function (AudioDeviceID inDevice, AudioTimeStamp* inNow, AudioBufferList* inInputData, AudioTimeStamp* inInputTime, AudioBufferList* outOutputData, AudioTimeStamp* inOutputTime, void* inClientData) AudioDeviceIOProc;
	alias int function (AudioStreamID inStream, uint inChannel, AudioDevicePropertyID inPropertyID, void* inClientData) AudioStreamPropertyListenerProc;
	alias int function (AudioObjectID inObjectID, uint inNumberAddresses, AudioObjectPropertyAddress* inAddresses, void* inClientData) AudioObjectPropertyListenerProc;
}

// This is needed otherwise the enums will fail compiling with gdc
version (GNU)
{
	private
	{
		const __kAudioHardwareNotRunningError = getOSType!("stop");
		const __kAudioHardwareUnspecifiedError = getOSType!("what");
		const __kAudioHardwareUnknownPropertyError = getOSType!("who?");
		const __kAudioHardwareBadPropertySizeError = getOSType!("!siz");
		const __kAudioHardwareIllegalOperationError = getOSType!("nope");
		const __kAudioHardwareBadObjectError = getOSType!("!obj");
		const __kAudioHardwareBadDeviceError = getOSType!("!dev");
		const __kAudioHardwareBadStreamError = getOSType!("!str");
		const __kAudioHardwareUnsupportedOperationError = getOSType!("unop");
		const __kAudioDeviceUnsupportedFormatError = getOSType!("!dat");
		const __kAudioDevicePermissionsError = getOSType!("!hog");
		const __kAudioObjectPropertySelectorWildcard = getOSType!("****");
		const __kAudioObjectPropertyScopeWildcard = getOSType!("****");
		const __kAudioObjectPropertyScopeGlobal = getOSType!("glob");
		const __kAudioObjectClassID = getOSType!("aobj");
		const __kAudioObjectClassIDWildcard = getOSType!("****");
		const __kAudioObjectPropertyClass = getOSType!("clas");
		const __kAudioObjectPropertyOwner = getOSType!("stdv");
		const __kAudioObjectPropertyCreator = getOSType!("oplg");
		const __kAudioObjectPropertyName = getOSType!("lnam");
		const __kAudioObjectPropertyManufacturer = getOSType!("lmak");
		const __kAudioObjectPropertyElementName = getOSType!("lchn");
		const __kAudioObjectPropertyElementCategoryName = getOSType!("lccn");
		const __kAudioObjectPropertyElementNumberName = getOSType!("lcnn");
		const __kAudioObjectPropertyOwnedObjects = getOSType!("ownd");
		const __kAudioObjectPropertyListenerAdded = getOSType!("lisa");
		const __kAudioObjectPropertyListenerRemoved = getOSType!("lisr");
		const __kAudioControlClassID = getOSType!("actl");
		const __kAudioLevelControlClassID = getOSType!("levl");
		const __kAudioBooleanControlClassID = getOSType!("togl");
		const __kAudioSelectorControlClassID = getOSType!("slct");
		const __kAudioStereoPanControlClassID = getOSType!("span");
		const __kAudioVolumeControlClassID = getOSType!("vlme");
		const __kAudioLFEVolumeControlClassID = getOSType!("subv");
		const __kAudioBootChimeVolumeControlClassID = getOSType!("pram");
		const __kAudioMuteControlClassID = getOSType!("mute");
		const __kAudioSoloControlClassID = getOSType!("solo");
		const __kAudioJackControlClassID = getOSType!("jack");
		const __kAudioLFEMuteControlClassID = getOSType!("subm");
		const __kAudioISubOwnerControlClassID = getOSType!("atch");
		const __kAudioDataSourceControlClassID = getOSType!("dsrc");
		const __kAudioDataDestinationControlClassID = getOSType!("dest");
		const __kAudioClockSourceControlClassID = getOSType!("clck");
		const __kAudioLineLevelControlClassID = getOSType!("nlvl");
		const __kAudioControlPropertyScope = getOSType!("cscp");
		const __kAudioControlPropertyElement = getOSType!("celm");
		const __kAudioControlPropertyVariant = getOSType!("cvar");
		const __kAudioLevelControlPropertyScalarValue = getOSType!("lcsv");
		const __kAudioLevelControlPropertyDecibelValue = getOSType!("lcdv");
		const __kAudioLevelControlPropertyDecibelRange = getOSType!("lcdr");
		const __kAudioLevelControlPropertyConvertScalarToDecibels = getOSType!("lcsd");
		const __kAudioLevelControlPropertyConvertDecibelsToScalar = getOSType!("lcds");
		const __kAudioLevelControlPropertyDecibelsToScalarTransferFunction = getOSType!("lctf");
		const __kAudioBooleanControlPropertyValue = getOSType!("bcvl");
		const __kAudioSelectorControlPropertyCurrentItem = getOSType!("scci");
		const __kAudioSelectorControlPropertyAvailableItems = getOSType!("scai");
		const __kAudioSelectorControlPropertyItemName = getOSType!("scin");
		const __kAudioClockSourceControlPropertyItemKind = getOSType!("clkk");
		const __kAudioStereoPanControlPropertyValue = getOSType!("spcv");
		const __kAudioStereoPanControlPropertyPanningChannels = getOSType!("spcc");
		const __kAudioSystemObjectClassID = getOSType!("asys");
		const __kAudioHardwarePropertyProcessIsMaster = getOSType!("mast");
		const __kAudioHardwarePropertyIsInitingOrExiting = getOSType!("inot");
		const __kAudioHardwarePropertyDevices = getOSType!("dev#");
		const __kAudioHardwarePropertyDefaultInputDevice = getOSType!("dIn ");
		const __kAudioHardwarePropertyDefaultOutputDevice = getOSType!("dOut");
		const __kAudioHardwarePropertyDefaultSystemOutputDevice = getOSType!("sOut");
		const __kAudioHardwarePropertyDeviceForUID = getOSType!("duid");
		const __kAudioHardwarePropertyProcessIsAudible = getOSType!("pmut");
		const __kAudioHardwarePropertySleepingIsAllowed = getOSType!("slep");
		const __kAudioHardwarePropertyUnloadingIsAllowed = getOSType!("unld");
		const __kAudioHardwarePropertyHogModeIsAllowed = getOSType!("hogr");
		const __kAudioHardwarePropertyRunLoop = getOSType!("rnlp");
		const __kAudioHardwarePropertyPlugInForBundleID = getOSType!("pibi");
		const __kAudioHardwarePropertyUserSessionIsActiveOrHeadless = getOSType!("user");
		const __kAudioHardwarePropertyBootChimeVolumeScalar = getOSType!("bbvs");
		const __kAudioHardwarePropertyBootChimeVolumeDecibels = getOSType!("bbvd");
		const __kAudioHardwarePropertyBootChimeVolumeRangeDecibels = getOSType!("bbd#");
		const __kAudioHardwarePropertyBootChimeVolumeScalarToDecibels = getOSType!("bv2d");
		const __kAudioHardwarePropertyBootChimeVolumeDecibelsToScalar = getOSType!("bd2v");
		const __kAudioHardwarePropertyBootChimeVolumeDecibelsToScalarTransferFunction = getOSType!("bvtf");
		const __kAudioPlugInClassID = getOSType!("aplg");
		const __kAudioPlugInPropertyBundleID = getOSType!("piid");
		const __kAudioPlugInCreateAggregateDevice = getOSType!("cagg");
		const __kAudioPlugInDestroyAggregateDevice = getOSType!("dagg");
		const __kAudioDevicePropertyScopeInput = getOSType!("inpt");
		const __kAudioDevicePropertyScopeOutput = getOSType!("outp");
		const __kAudioDevicePropertyScopePlayThrough = getOSType!("ptru");
		const __kAudioDeviceClassID = getOSType!("adev");
		const __kAudioDevicePropertyPlugIn = getOSType!("plug");
		const __kAudioDevicePropertyConfigurationApplication = getOSType!("capp");
		const __kAudioDevicePropertyDeviceUID = getOSType!("uid ");
		const __kAudioDevicePropertyModelUID = getOSType!("muid");
		const __kAudioDevicePropertyTransportType = getOSType!("tran");
		const __kAudioDevicePropertyRelatedDevices = getOSType!("akin");
		const __kAudioDevicePropertyClockDomain = getOSType!("clkd");
		const __kAudioDevicePropertyDeviceIsAlive = getOSType!("livn");
		const __kAudioDevicePropertyDeviceHasChanged = getOSType!("diff");
		const __kAudioDevicePropertyDeviceIsRunning = getOSType!("goin");
		const __kAudioDevicePropertyDeviceIsRunningSomewhere = getOSType!("gone");
		const __kAudioDevicePropertyDeviceCanBeDefaultDevice = getOSType!("dflt");
		const __kAudioDevicePropertyDeviceCanBeDefaultSystemDevice = getOSType!("sflt");
		const __kAudioDeviceProcessorOverload = getOSType!("over");
		const __kAudioDevicePropertyHogMode = getOSType!("oink");
		const __kAudioDevicePropertyLatency = getOSType!("ltnc");
		const __kAudioDevicePropertyBufferFrameSize = getOSType!("fsiz");
		const __kAudioDevicePropertyBufferFrameSizeRange = getOSType!("fsz#");
		const __kAudioDevicePropertyUsesVariableBufferFrameSizes = getOSType!("vfsz");
		const __kAudioDevicePropertyStreams = getOSType!("stm#");
		const __kAudioDevicePropertySafetyOffset = getOSType!("saft");
		const __kAudioDevicePropertyIOCycleUsage = getOSType!("ncyc");
		const __kAudioDevicePropertyStreamConfiguration = getOSType!("slay");
		const __kAudioDevicePropertyIOProcStreamUsage = getOSType!("suse");
		const __kAudioDevicePropertyPreferredChannelsForStereo = getOSType!("dch2");
		const __kAudioDevicePropertyPreferredChannelLayout = getOSType!("srnd");
		const __kAudioDevicePropertyNominalSampleRate = getOSType!("nsrt");
		const __kAudioDevicePropertyAvailableNominalSampleRates = getOSType!("nsr#");
		const __kAudioDevicePropertyActualSampleRate = getOSType!("asrt");
		const __kAudioDevicePropertyIcon = getOSType!("icon");
		const __kAudioDevicePropertyIsHidden = getOSType!("hidn");
		const __kAudioDevicePropertyJackIsConnected = getOSType!("jack");
		const __kAudioDevicePropertyVolumeScalar = getOSType!("volm");
		const __kAudioDevicePropertyVolumeDecibels = getOSType!("vold");
		const __kAudioDevicePropertyVolumeRangeDecibels = getOSType!("vdb#");
		const __kAudioDevicePropertyVolumeScalarToDecibels = getOSType!("v2db");
		const __kAudioDevicePropertyVolumeDecibelsToScalar = getOSType!("db2v");
		const __kAudioDevicePropertyVolumeDecibelsToScalarTransferFunction = getOSType!("vctf");
		const __kAudioDevicePropertyStereoPan = getOSType!("span");
		const __kAudioDevicePropertyStereoPanChannels = getOSType!("spn#");
		const __kAudioDevicePropertyMute = getOSType!("mute");
		const __kAudioDevicePropertySolo = getOSType!("solo");
		const __kAudioDevicePropertyDataSource = getOSType!("ssrc");
		const __kAudioDevicePropertyDataSources = getOSType!("ssc#");
		const __kAudioDevicePropertyDataSourceNameForIDCFString = getOSType!("lscn");
		const __kAudioDevicePropertyClockSource = getOSType!("csrc");
		const __kAudioDevicePropertyClockSources = getOSType!("csc#");
		const __kAudioDevicePropertyClockSourceNameForIDCFString = getOSType!("lcsn");
		const __kAudioDevicePropertyClockSourceKindForID = getOSType!("csck");
		const __kAudioDevicePropertyPlayThru = getOSType!("thru");
		const __kAudioDevicePropertyPlayThruSolo = getOSType!("thrs");
		const __kAudioDevicePropertyPlayThruVolumeScalar = getOSType!("mvsc");
		const __kAudioDevicePropertyPlayThruVolumeDecibels = getOSType!("mvdb");
		const __kAudioDevicePropertyPlayThruVolumeRangeDecibels = getOSType!("mvd#");
		const __kAudioDevicePropertyPlayThruVolumeScalarToDecibels = getOSType!("mv2d");
		const __kAudioDevicePropertyPlayThruVolumeDecibelsToScalar = getOSType!("mv2s");
		const __kAudioDevicePropertyPlayThruVolumeDecibelsToScalarTransferFunction = getOSType!("mvtf");
		const __kAudioDevicePropertyPlayThruStereoPan = getOSType!("mspn");
		const __kAudioDevicePropertyPlayThruStereoPanChannels = getOSType!("msp#");
		const __kAudioDevicePropertyPlayThruDestination = getOSType!("mdds");
		const __kAudioDevicePropertyPlayThruDestinations = getOSType!("mdd#");
		const __kAudioDevicePropertyPlayThruDestinationNameForIDCFString = getOSType!("mddc");
		const __kAudioDevicePropertyChannelNominalLineLevel = getOSType!("nlvl");
		const __kAudioDevicePropertyChannelNominalLineLevels = getOSType!("nlv#");
		const __kAudioDevicePropertyChannelNominalLineLevelNameForIDCFString = getOSType!("lcnl");
		const __kAudioDevicePropertyDriverShouldOwniSub = getOSType!("isub");
		const __kAudioDevicePropertySubVolumeScalar = getOSType!("svlm");
		const __kAudioDevicePropertySubVolumeDecibels = getOSType!("svld");
		const __kAudioDevicePropertySubVolumeRangeDecibels = getOSType!("svd#");
		const __kAudioDevicePropertySubVolumeScalarToDecibels = getOSType!("sv2d");
		const __kAudioDevicePropertySubVolumeDecibelsToScalar = getOSType!("sd2v");
		const __kAudioDevicePropertySubVolumeDecibelsToScalarTransferFunction = getOSType!("svtf");
		const __kAudioDevicePropertySubMute = getOSType!("smut");
		const __kAudioDevicePropertyDeviceName = getOSType!("name");
		const __kAudioDevicePropertyDeviceManufacturer = getOSType!("makr");
		const __kAudioDevicePropertyRegisterBufferList = getOSType!("rbuf");
		const __kAudioDevicePropertyBufferSize = getOSType!("bsiz");
		const __kAudioDevicePropertyBufferSizeRange = getOSType!("bsz#");
		const __kAudioDevicePropertyChannelName = getOSType!("chnm");
		const __kAudioDevicePropertyChannelCategoryName = getOSType!("ccnm");
		const __kAudioDevicePropertyChannelNumberName = getOSType!("cnnm");
		const __kAudioDevicePropertySupportsMixing = getOSType!("mix?");
		const __kAudioDevicePropertyStreamFormat = getOSType!("sfmt");
		const __kAudioDevicePropertyStreamFormats = getOSType!("sfm#");
		const __kAudioDevicePropertyStreamFormatSupported = getOSType!("sfm?");
		const __kAudioDevicePropertyStreamFormatMatch = getOSType!("sfmm");
		const __kAudioDevicePropertyDataSourceNameForID = getOSType!("sscn");
		const __kAudioDevicePropertyClockSourceNameForID = getOSType!("cscn");
		const __kAudioDevicePropertyPlayThruDestinationNameForID = getOSType!("mddn");
		const __kAudioDevicePropertyChannelNominalLineLevelNameForID = getOSType!("cnlv");
		const __kAudioStreamClassID = getOSType!("astr");
		const __kAudioStreamPropertyDirection = getOSType!("sdir");
		const __kAudioStreamPropertyTerminalType = getOSType!("term");
		const __kAudioStreamPropertyStartingChannel = getOSType!("schn");
		const __kAudioStreamPropertyVirtualFormat = getOSType!("sfmt");
		const __kAudioStreamPropertyAvailableVirtualFormats = getOSType!("sfma");
		const __kAudioStreamPropertyPhysicalFormat = getOSType!("pft ");
		const __kAudioStreamPropertyAvailablePhysicalFormats = getOSType!("pfta");
		const __kAudioStreamPropertyPhysicalFormats = getOSType!("pft#");
		const __kAudioStreamPropertyPhysicalFormatSupported = getOSType!("pft?");
		const __kAudioStreamPropertyPhysicalFormatMatch = getOSType!("pftm");
		const __kAudioAggregateDeviceClassID = getOSType!("aagg");
		const __kAudioDeviceTransportTypeAggregate = getOSType!("grup");
		const __kAudioDeviceTransportTypeAutoAggregate = getOSType!("fgrp");
		const __kAudioAggregateDevicePropertyFullSubDeviceList = getOSType!("grup");
		const __kAudioAggregateDevicePropertyActiveSubDeviceList = getOSType!("agrp");
		const __kAudioAggregateDevicePropertyComposition = getOSType!("acom");
		const __kAudioAggregateDevicePropertyMasterSubDevice = getOSType!("amst");
		const __kAudioSubDeviceClassID = getOSType!("asub");
		const __kAudioSubDevicePropertyExtraLatency = getOSType!("xltc");
		const __kAudioSubDevicePropertyDriftCompensation = getOSType!("drft");
		const __kAudioSubDevicePropertyDriftCompensationQuality = getOSType!("drfq");
	}
}

enum
{
	kAudioHardwareNoError = 0,
	kAudioHardwareNotRunningError = getOSType!("stop"),
	kAudioHardwareUnspecifiedError = getOSType!("what"),
	kAudioHardwareUnknownPropertyError = getOSType!("who?"),
	kAudioHardwareBadPropertySizeError = getOSType!("!siz"),
	kAudioHardwareIllegalOperationError = getOSType!("nope"),
	kAudioHardwareBadObjectError = getOSType!("!obj"),
	kAudioHardwareBadDeviceError = getOSType!("!dev"),
	kAudioHardwareBadStreamError = getOSType!("!str"),
	kAudioHardwareUnsupportedOperationError = getOSType!("unop"),
	kAudioDeviceUnsupportedFormatError = getOSType!("!dat"),
	kAudioDevicePermissionsError = getOSType!("!hog")
}

version (D_LP64)
{
	enum : ulong
	{
		kAudioObjectPropertySelectorWildcard = getOSType!("****"),
		kAudioObjectPropertyScopeWildcard = getOSType!("****"),
		kAudioObjectPropertyElementWildcard = 0xFFFFFFFFUL,
		kAudioPropertyWildcardPropertyID = kAudioObjectPropertySelectorWildcard,
		kAudioPropertyWildcardSection = 0xFF,
		kAudioPropertyWildcardChannel = kAudioObjectPropertyElementWildcard
	}
}

else
{
	enum
	{
		kAudioObjectPropertySelectorWildcard = getOSType!("****"),
		kAudioObjectPropertyScopeWildcard = getOSType!("****"),
		kAudioObjectPropertyElementWildcard = 0xFFFFFFFFU,
		kAudioPropertyWildcardPropertyID = kAudioObjectPropertySelectorWildcard,
		kAudioPropertyWildcardSection = 0xFF,
		kAudioPropertyWildcardChannel = kAudioObjectPropertyElementWildcard
	}
}

enum
{
	kAudioObjectPropertyScopeGlobal = getOSType!("glob"),
	kAudioObjectPropertyElementMaster = 0UL,
	kAudioObjectClassID = getOSType!("aobj"),
	kAudioObjectClassIDWildcard = getOSType!("****"),
	kAudioObjectUnknown = 0UL
}

enum
{
	kAudioObjectPropertyClass = getOSType!("clas"),
	kAudioObjectPropertyOwner = getOSType!("stdv"),
	kAudioObjectPropertyCreator = getOSType!("oplg"),
	kAudioObjectPropertyName = getOSType!("lnam"),
	kAudioObjectPropertyManufacturer = getOSType!("lmak"),
	kAudioObjectPropertyElementName = getOSType!("lchn"),
	kAudioObjectPropertyElementCategoryName = getOSType!("lccn"),
	kAudioObjectPropertyElementNumberName = getOSType!("lcnn"),
	kAudioObjectPropertyOwnedObjects = getOSType!("ownd"),
	kAudioObjectPropertyListenerAdded = getOSType!("lisa"),
	kAudioObjectPropertyListenerRemoved = getOSType!("lisr")
}

enum
{
	kAudioControlClassID = getOSType!("actl"),
	kAudioLevelControlClassID = getOSType!("levl"),
	kAudioBooleanControlClassID = getOSType!("togl"),
	kAudioSelectorControlClassID = getOSType!("slct"),
	kAudioStereoPanControlClassID = getOSType!("span")
}

enum
{
	kAudioVolumeControlClassID = getOSType!("vlme"),
	kAudioLFEVolumeControlClassID = getOSType!("subv"),
	kAudioBootChimeVolumeControlClassID = getOSType!("pram")
}

enum
{
	kAudioMuteControlClassID = getOSType!("mute"),
	kAudioSoloControlClassID = getOSType!("solo"),
	kAudioJackControlClassID = getOSType!("jack"),
	kAudioLFEMuteControlClassID = getOSType!("subm"),
	kAudioISubOwnerControlClassID = getOSType!("atch")
}

enum
{
	kAudioDataSourceControlClassID = getOSType!("dsrc"),
	kAudioDataDestinationControlClassID = getOSType!("dest"),
	kAudioClockSourceControlClassID = getOSType!("clck"),
	kAudioLineLevelControlClassID = getOSType!("nlvl")
}

enum
{
	kAudioControlPropertyScope = getOSType!("cscp"),
	kAudioControlPropertyElement = getOSType!("celm"),
	kAudioControlPropertyVariant = getOSType!("cvar")
}

enum
{
	kAudioLevelControlPropertyScalarValue = getOSType!("lcsv"),
	kAudioLevelControlPropertyDecibelValue = getOSType!("lcdv"),
	kAudioLevelControlPropertyDecibelRange = getOSType!("lcdr"),
	kAudioLevelControlPropertyConvertScalarToDecibels = getOSType!("lcsd"),
	kAudioLevelControlPropertyConvertDecibelsToScalar = getOSType!("lcds"),
	kAudioLevelControlPropertyDecibelsToScalarTransferFunction = getOSType!("lctf")
}

enum
{
	kAudioBooleanControlPropertyValue = getOSType!("bcvl")
}

enum
{
	kAudioSelectorControlPropertyCurrentItem = getOSType!("scci"),
	kAudioSelectorControlPropertyAvailableItems = getOSType!("scai"),
	kAudioSelectorControlPropertyItemName = getOSType!("scin")
}

enum
{
	kAudioClockSourceControlPropertyItemKind = getOSType!("clkk")
}

enum
{
	kAudioStereoPanControlPropertyValue = getOSType!("spcv"),
	kAudioStereoPanControlPropertyPanningChannels = getOSType!("spcc")
}

enum
{
	kAudioSystemObjectClassID = getOSType!("asys"),
	kAudioObjectSystemObject = 1UL
}

enum
{
	kAudioHardwarePropertyProcessIsMaster = getOSType!("mast"),
	kAudioHardwarePropertyIsInitingOrExiting = getOSType!("inot"),
	kAudioHardwarePropertyDevices = getOSType!("dev#"),
	kAudioHardwarePropertyDefaultInputDevice = getOSType!("dIn "),
	kAudioHardwarePropertyDefaultOutputDevice = getOSType!("dOut"),
	kAudioHardwarePropertyDefaultSystemOutputDevice = getOSType!("sOut"),
	kAudioHardwarePropertyDeviceForUID = getOSType!("duid"),
	kAudioHardwarePropertyProcessIsAudible = getOSType!("pmut"),
	kAudioHardwarePropertySleepingIsAllowed = getOSType!("slep"),
	kAudioHardwarePropertyUnloadingIsAllowed = getOSType!("unld"),
	kAudioHardwarePropertyHogModeIsAllowed = getOSType!("hogr"),
	kAudioHardwarePropertyRunLoop = getOSType!("rnlp"),
	kAudioHardwarePropertyPlugInForBundleID = getOSType!("pibi"),
	kAudioHardwarePropertyUserSessionIsActiveOrHeadless = getOSType!("user")
}

enum
{
	kAudioHardwarePropertyBootChimeVolumeScalar = getOSType!("bbvs"),
	kAudioHardwarePropertyBootChimeVolumeDecibels = getOSType!("bbvd"),
	kAudioHardwarePropertyBootChimeVolumeRangeDecibels = getOSType!("bbd#"),
	kAudioHardwarePropertyBootChimeVolumeScalarToDecibels = getOSType!("bv2d"),
	kAudioHardwarePropertyBootChimeVolumeDecibelsToScalar = getOSType!("bd2v"),
	kAudioHardwarePropertyBootChimeVolumeDecibelsToScalarTransferFunction = getOSType!("bvtf")
}

enum
{
	kAudioPlugInClassID = getOSType!("aplg")
}

enum
{
	kAudioPlugInPropertyBundleID = getOSType!("piid"),
	kAudioPlugInCreateAggregateDevice = getOSType!("cagg"),
	kAudioPlugInDestroyAggregateDevice = getOSType!("dagg")
}

enum
{
	kAudioDevicePropertyScopeInput = getOSType!("inpt"),
	kAudioDevicePropertyScopeOutput = getOSType!("outp"),
	kAudioDevicePropertyScopePlayThrough = getOSType!("ptru"),
	kAudioDeviceClassID = getOSType!("adev"),
	kAudioDeviceUnknown = kAudioObjectUnknown
}

enum
{
	kAudioDeviceStartTimeIsInputFlag = (1L << 0),
	kAudioDeviceStartTimeDontConsultDeviceFlag = (1L << 1),
	kAudioDeviceStartTimeDontConsultHALFlag = (1L << 2)
}

enum
{
	kAudioDevicePropertyPlugIn = getOSType!("plug"),
	kAudioDevicePropertyConfigurationApplication = getOSType!("capp"),
	kAudioDevicePropertyDeviceUID = getOSType!("uid "),
	kAudioDevicePropertyModelUID = getOSType!("muid"),
	kAudioDevicePropertyTransportType = getOSType!("tran"),
	kAudioDevicePropertyRelatedDevices = getOSType!("akin"),
	kAudioDevicePropertyClockDomain = getOSType!("clkd"),
	kAudioDevicePropertyDeviceIsAlive = getOSType!("livn"),
	kAudioDevicePropertyDeviceHasChanged = getOSType!("diff"),
	kAudioDevicePropertyDeviceIsRunning = getOSType!("goin"),
	kAudioDevicePropertyDeviceIsRunningSomewhere = getOSType!("gone"),
	kAudioDevicePropertyDeviceCanBeDefaultDevice = getOSType!("dflt"),
	kAudioDevicePropertyDeviceCanBeDefaultSystemDevice = getOSType!("sflt"),
	kAudioDeviceProcessorOverload = getOSType!("over"),
	kAudioDevicePropertyHogMode = getOSType!("oink"),
	kAudioDevicePropertyLatency = getOSType!("ltnc"),
	kAudioDevicePropertyBufferFrameSize = getOSType!("fsiz"),
	kAudioDevicePropertyBufferFrameSizeRange = getOSType!("fsz#"),
	kAudioDevicePropertyUsesVariableBufferFrameSizes = getOSType!("vfsz"),
	kAudioDevicePropertyStreams = getOSType!("stm#"),
	kAudioDevicePropertySafetyOffset = getOSType!("saft"),
	kAudioDevicePropertyIOCycleUsage = getOSType!("ncyc"),
	kAudioDevicePropertyStreamConfiguration = getOSType!("slay"),
	kAudioDevicePropertyIOProcStreamUsage = getOSType!("suse"),
	kAudioDevicePropertyPreferredChannelsForStereo = getOSType!("dch2"),
	kAudioDevicePropertyPreferredChannelLayout = getOSType!("srnd"),
	kAudioDevicePropertyNominalSampleRate = getOSType!("nsrt"),
	kAudioDevicePropertyAvailableNominalSampleRates = getOSType!("nsr#"),
	kAudioDevicePropertyActualSampleRate = getOSType!("asrt"),
	kAudioDevicePropertyIcon = getOSType!("icon"),
	kAudioDevicePropertyIsHidden = getOSType!("hidn")
}

enum
{
	kAudioDevicePropertyJackIsConnected = getOSType!("jack"),
	kAudioDevicePropertyVolumeScalar = getOSType!("volm"),
	kAudioDevicePropertyVolumeDecibels = getOSType!("vold"),
	kAudioDevicePropertyVolumeRangeDecibels = getOSType!("vdb#"),
	kAudioDevicePropertyVolumeScalarToDecibels = getOSType!("v2db"),
	kAudioDevicePropertyVolumeDecibelsToScalar = getOSType!("db2v"),
	kAudioDevicePropertyVolumeDecibelsToScalarTransferFunction = getOSType!("vctf"),
	kAudioDevicePropertyStereoPan = getOSType!("span"),
	kAudioDevicePropertyStereoPanChannels = getOSType!("spn#"),
	kAudioDevicePropertyMute = getOSType!("mute"),
	kAudioDevicePropertySolo = getOSType!("solo"),
	kAudioDevicePropertyDataSource = getOSType!("ssrc"),
	kAudioDevicePropertyDataSources = getOSType!("ssc#"),
	kAudioDevicePropertyDataSourceNameForIDCFString = getOSType!("lscn"),
	kAudioDevicePropertyClockSource = getOSType!("csrc"),
	kAudioDevicePropertyClockSources = getOSType!("csc#"),
	kAudioDevicePropertyClockSourceNameForIDCFString = getOSType!("lcsn"),
	kAudioDevicePropertyClockSourceKindForID = getOSType!("csck"),
	kAudioDevicePropertyPlayThru = getOSType!("thru"),
	kAudioDevicePropertyPlayThruSolo = getOSType!("thrs"),
	kAudioDevicePropertyPlayThruVolumeScalar = getOSType!("mvsc"),
	kAudioDevicePropertyPlayThruVolumeDecibels = getOSType!("mvdb"),
	kAudioDevicePropertyPlayThruVolumeRangeDecibels = getOSType!("mvd#"),
	kAudioDevicePropertyPlayThruVolumeScalarToDecibels = getOSType!("mv2d"),
	kAudioDevicePropertyPlayThruVolumeDecibelsToScalar = getOSType!("mv2s"),
	kAudioDevicePropertyPlayThruVolumeDecibelsToScalarTransferFunction = getOSType!("mvtf"),
	kAudioDevicePropertyPlayThruStereoPan = getOSType!("mspn"),
	kAudioDevicePropertyPlayThruStereoPanChannels = getOSType!("msp#"),
	kAudioDevicePropertyPlayThruDestination = getOSType!("mdds"),
	kAudioDevicePropertyPlayThruDestinations = getOSType!("mdd#"),
	kAudioDevicePropertyPlayThruDestinationNameForIDCFString = getOSType!("mddc"),
	kAudioDevicePropertyChannelNominalLineLevel = getOSType!("nlvl"),
	kAudioDevicePropertyChannelNominalLineLevels = getOSType!("nlv#"),
	kAudioDevicePropertyChannelNominalLineLevelNameForIDCFString = getOSType!("lcnl"),
	kAudioDevicePropertyDriverShouldOwniSub = getOSType!("isub"),
	kAudioDevicePropertySubVolumeScalar = getOSType!("svlm"),
	kAudioDevicePropertySubVolumeDecibels = getOSType!("svld"),
	kAudioDevicePropertySubVolumeRangeDecibels = getOSType!("svd#"),
	kAudioDevicePropertySubVolumeScalarToDecibels = getOSType!("sv2d"),
	kAudioDevicePropertySubVolumeDecibelsToScalar = getOSType!("sd2v"),
	kAudioDevicePropertySubVolumeDecibelsToScalarTransferFunction = getOSType!("svtf"),
	kAudioDevicePropertySubMute = getOSType!("smut")
}

enum
{
	kAudioDevicePropertyDeviceName = getOSType!("name"),
	kAudioDevicePropertyDeviceNameCFString = kAudioObjectPropertyName,
	kAudioDevicePropertyDeviceManufacturer = getOSType!("makr"),
	kAudioDevicePropertyDeviceManufacturerCFString = kAudioObjectPropertyManufacturer,
	kAudioDevicePropertyRegisterBufferList = getOSType!("rbuf"),
	kAudioDevicePropertyBufferSize = getOSType!("bsiz"),
	kAudioDevicePropertyBufferSizeRange = getOSType!("bsz#"),
	kAudioDevicePropertyChannelName = getOSType!("chnm"),
	kAudioDevicePropertyChannelNameCFString = kAudioObjectPropertyElementName,
	kAudioDevicePropertyChannelCategoryName = getOSType!("ccnm"),
	kAudioDevicePropertyChannelCategoryNameCFString = kAudioObjectPropertyElementCategoryName,
	kAudioDevicePropertyChannelNumberName = getOSType!("cnnm"),
	kAudioDevicePropertyChannelNumberNameCFString = kAudioObjectPropertyElementNumberName,
	kAudioDevicePropertySupportsMixing = getOSType!("mix?"),
	kAudioDevicePropertyStreamFormat = getOSType!("sfmt"),
	kAudioDevicePropertyStreamFormats = getOSType!("sfm#"),
	kAudioDevicePropertyStreamFormatSupported = getOSType!("sfm?"),
	kAudioDevicePropertyStreamFormatMatch = getOSType!("sfmm"),
	kAudioDevicePropertyDataSourceNameForID = getOSType!("sscn"),
	kAudioDevicePropertyClockSourceNameForID = getOSType!("cscn"),
	kAudioDevicePropertyPlayThruDestinationNameForID = getOSType!("mddn"),
	kAudioDevicePropertyChannelNominalLineLevelNameForID = getOSType!("cnlv")
}

enum
{
	kAudioStreamClassID = getOSType!("astr"),
	kAudioStreamUnknown = kAudioObjectUnknown
}

enum
{
	kAudioStreamPropertyDirection = getOSType!("sdir"),
	kAudioStreamPropertyTerminalType = getOSType!("term"),
	kAudioStreamPropertyStartingChannel = getOSType!("schn"),
	kAudioStreamPropertyLatency = kAudioDevicePropertyLatency,
	kAudioStreamPropertyVirtualFormat = getOSType!("sfmt"),
	kAudioStreamPropertyAvailableVirtualFormats = getOSType!("sfma"),
	kAudioStreamPropertyPhysicalFormat = getOSType!("pft "),
	kAudioStreamPropertyAvailablePhysicalFormats = getOSType!("pfta")
}

enum
{
	kAudioStreamPropertyOwningDevice = kAudioObjectPropertyOwner,
	kAudioStreamPropertyPhysicalFormats = getOSType!("pft#"),
	kAudioStreamPropertyPhysicalFormatSupported = getOSType!("pft?"),
	kAudioStreamPropertyPhysicalFormatMatch = getOSType!("pftm")
}

enum
{
	kAudioAggregateDeviceClassID = getOSType!("aagg"),
	kAudioDeviceTransportTypeAggregate = getOSType!("grup"),
	kAudioDeviceTransportTypeAutoAggregate = getOSType!("fgrp")
}

enum
{
	kAudioAggregateDevicePropertyFullSubDeviceList = getOSType!("grup"),
	kAudioAggregateDevicePropertyActiveSubDeviceList = getOSType!("agrp"),
	kAudioAggregateDevicePropertyComposition = getOSType!("acom")
}

enum
{
	kAudioAggregateDevicePropertyMasterSubDevice = getOSType!("amst")
}

enum
{
	kAudioSubDeviceClassID = getOSType!("asub")
}

enum
{
	kAudioSubDeviceDriftCompensationMinQuality = 0,
	kAudioSubDeviceDriftCompensationLowQuality = 0x20,
	kAudioSubDeviceDriftCompensationMediumQuality = 0x40,
	kAudioSubDeviceDriftCompensationHighQuality = 0x60,
	kAudioSubDeviceDriftCompensationMaxQuality = 0x7F
}

enum
{
	kAudioSubDevicePropertyExtraLatency = getOSType!("xltc"),
	kAudioSubDevicePropertyDriftCompensation = getOSType!("drft"),
	kAudioSubDevicePropertyDriftCompensationQuality = getOSType!("drfq")
}

struct AudioObjectPropertyAddress
{
	uint mSelector;
	uint mScope;
	uint mElement;
}


struct AudioHardwareIOProcStreamUsage
{
	void* mIOProc;
	uint mNumberStreams;
	uint* mStreamIsOn;
}


struct AudioStreamRangedDescription
{
	AudioStreamBasicDescription mFormat;
	AudioValueRange mSampleRateRange;
}

extern (C)
{
	void AudioObjectShow (uint inObjectID);
	ubyte AudioObjectHasProperty (uint inObjectID, AudioObjectPropertyAddress* inAddress);
	int AudioObjectIsPropertySettable (uint inObjectID, AudioObjectPropertyAddress* inAddress, char* outIsSettable);
	int AudioObjectGetPropertyDataSize (uint inObjectID, AudioObjectPropertyAddress* inAddress, uint inQualifierDataSize, void* inQualifierData, uint* outDataSize);
	int AudioObjectGetPropertyData (uint inObjectID, AudioObjectPropertyAddress* inAddress, uint inQualifierDataSize, void* inQualifierData, uint* ioDataSize, void* outData);
	int AudioObjectSetPropertyData (uint inObjectID, AudioObjectPropertyAddress* inAddress, uint inQualifierDataSize, void* inQualifierData, uint inDataSize, void* inData);
	int AudioObjectAddPropertyListener (uint inObjectID, AudioObjectPropertyAddress* inAddress, AudioObjectPropertyListenerProc inListener, void* inClientData);
	int AudioObjectRemovePropertyListener (uint inObjectID, AudioObjectPropertyAddress* inAddress, AudioObjectPropertyListenerProc inListener, void* inClientData);
	int AudioHardwareAddRunLoopSource (CFRunLoopSourceRef inRunLoopSource);
	int AudioHardwareRemoveRunLoopSource (CFRunLoopSourceRef inRunLoopSource);
	int AudioHardwareUnload ();
	int AudioHardwareGetPropertyInfo (uint inPropertyID, uint* outSize, char* outWritable);
	int AudioHardwareGetProperty (uint inPropertyID, uint* ioPropertyDataSize, void* outPropertyData);
	int AudioHardwareSetProperty (uint inPropertyID, uint inPropertyDataSize, void* inPropertyData);
	int AudioHardwareAddPropertyListener (uint inPropertyID, AudioHardwarePropertyListenerProc inProc, void* inClientData);
	int AudioHardwareRemovePropertyListener (uint inPropertyID, AudioHardwarePropertyListenerProc inProc);
	int AudioDeviceCreateIOProcID (uint inDevice, AudioDeviceIOProc inProc, void* inClientData, AudioDeviceIOProcID* outIOProcID);
	int AudioDeviceDestroyIOProcID (uint inDevice, AudioDeviceIOProcID inIOProcID);
	int AudioDeviceAddIOProc (uint inDevice, AudioDeviceIOProc inProc, void* inClientData);
	int AudioDeviceRemoveIOProc (uint inDevice, AudioDeviceIOProc inProc);
	int AudioDeviceStart (uint inDevice, AudioDeviceIOProcID inProcID);
	int AudioDeviceStartAtTime (uint inDevice, AudioDeviceIOProcID inProcID, AudioTimeStamp* ioRequestedStartTime, uint inFlags);
	int AudioDeviceStop (uint inDevice, AudioDeviceIOProcID inProcID);
	int AudioDeviceRead (uint inDevice, AudioTimeStamp* inStartTime, AudioBufferList* outData);
	int AudioDeviceGetCurrentTime (uint inDevice, AudioTimeStamp* outTime);
	int AudioDeviceTranslateTime (uint inDevice, AudioTimeStamp* inTime, AudioTimeStamp* outTime);
	int AudioDeviceGetNearestStartTime (uint inDevice, AudioTimeStamp* ioRequestedStartTime, uint inFlags);
	int AudioDeviceGetPropertyInfo (uint inDevice, uint inChannel, ubyte isInput, uint inPropertyID, uint* outSize, char* outWritable);
	int AudioDeviceGetProperty (uint inDevice, uint inChannel, ubyte isInput, uint inPropertyID, uint* ioPropertyDataSize, void* outPropertyData);
	int AudioDeviceSetProperty (uint inDevice, AudioTimeStamp* inWhen, uint inChannel, ubyte isInput, uint inPropertyID, uint inPropertyDataSize, void* inPropertyData);
	int AudioDeviceAddPropertyListener (uint inDevice, uint inChannel, ubyte isInput, uint inPropertyID, AudioDevicePropertyListenerProc inProc, void* inClientData);
	int AudioDeviceRemovePropertyListener (uint inDevice, uint inChannel, ubyte isInput, uint inPropertyID, AudioDevicePropertyListenerProc inProc);
	int AudioStreamGetPropertyInfo (uint inStream, uint inChannel, uint inPropertyID, uint* outSize, char* outWritable);
	int AudioStreamGetProperty (uint inStream, uint inChannel, uint inPropertyID, uint* ioPropertyDataSize, void* outPropertyData);
	int AudioStreamSetProperty (uint inStream, AudioTimeStamp* inWhen, uint inChannel, uint inPropertyID, uint inPropertyDataSize, void* inPropertyData);
	int AudioStreamAddPropertyListener (uint inStream, uint inChannel, uint inPropertyID, AudioStreamPropertyListenerProc inProc, void* inClientData);
	int AudioStreamRemovePropertyListener (uint inStream, uint inChannel, uint inPropertyID, AudioStreamPropertyListenerProc inProc);
}