1 /** 2 Dynamic bindings to the CoreAudio framework. 3 4 Copyright: Guillaume Piolat 2015. 5 License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0) 6 */ 7 module derelict.carbon.coreaudio; 8 9 10 import derelict.carbon.corefoundation; 11 12 // <CoreAudio/CoreAudioTypes.h> 13 14 struct SMPTETime 15 { 16 short mSubframes; 17 short mSubframeDivisor; 18 uint mCounter; 19 uint mType; 20 uint mFlags; 21 short mHours; 22 short mMinutes; 23 short mSeconds; 24 short mFrames; 25 } 26 27 28 alias AudioTimeStampFlags = UInt32; 29 enum : AudioTimeStampFlags 30 { 31 kAudioTimeStampNothingValid = 0, 32 kAudioTimeStampSampleTimeValid = (1U << 0), 33 kAudioTimeStampHostTimeValid = (1U << 1), 34 kAudioTimeStampRateScalarValid = (1U << 2), 35 kAudioTimeStampWordClockTimeValid = (1U << 3), 36 kAudioTimeStampSMPTETimeValid = (1U << 4), 37 kAudioTimeStampSampleHostTimeValid = (kAudioTimeStampSampleTimeValid | kAudioTimeStampHostTimeValid) 38 } 39 40 41 struct AudioTimeStamp 42 { 43 double mSampleTime; 44 ulong mHostTime; 45 double mRateScalar; 46 ulong mWordClockTime; 47 SMPTETime mSMPTETime; 48 uint mFlags; 49 uint mReserved; 50 } 51 52 struct AudioBuffer 53 { 54 uint mNumberChannels; 55 uint mDataByteSize; 56 void* mData; 57 } 58 59 struct AudioBufferList 60 { 61 uint mNumberBuffers; 62 AudioBuffer[1] mBuffers; 63 } 64 65 alias AudioSampleType = float; 66 67 alias AudioFormatID = uint; 68 alias AudioFormatFlags = uint; 69 enum : AudioFormatFlags 70 { 71 kAudioFormatFlagIsFloat = (1U << 0), // 0x1 72 kAudioFormatFlagIsBigEndian = (1U << 1), // 0x2 73 kAudioFormatFlagIsSignedInteger = (1U << 2), // 0x4 74 kAudioFormatFlagIsPacked = (1U << 3), // 0x8 75 kAudioFormatFlagIsAlignedHigh = (1U << 4), // 0x10 76 kAudioFormatFlagIsNonInterleaved = (1U << 5), // 0x20 77 kAudioFormatFlagIsNonMixable = (1U << 6), // 0x40 78 kAudioFormatFlagsAreAllClear = 0x80000000, 79 80 kLinearPCMFormatFlagIsFloat = kAudioFormatFlagIsFloat, 81 kLinearPCMFormatFlagIsBigEndian = kAudioFormatFlagIsBigEndian, 82 kLinearPCMFormatFlagIsSignedInteger = kAudioFormatFlagIsSignedInteger, 83 kLinearPCMFormatFlagIsPacked = kAudioFormatFlagIsPacked, 84 kLinearPCMFormatFlagIsAlignedHigh = kAudioFormatFlagIsAlignedHigh, 85 kLinearPCMFormatFlagIsNonInterleaved = kAudioFormatFlagIsNonInterleaved, 86 kLinearPCMFormatFlagIsNonMixable = kAudioFormatFlagIsNonMixable, 87 kLinearPCMFormatFlagsSampleFractionShift = 7, 88 kLinearPCMFormatFlagsSampleFractionMask = (0x3F << kLinearPCMFormatFlagsSampleFractionShift), 89 kLinearPCMFormatFlagsAreAllClear = kAudioFormatFlagsAreAllClear, 90 91 kAppleLosslessFormatFlag_16BitSourceData = 1, 92 kAppleLosslessFormatFlag_20BitSourceData = 2, 93 kAppleLosslessFormatFlag_24BitSourceData = 3, 94 kAppleLosslessFormatFlag_32BitSourceData = 4 95 } 96 version(LittleEndian) 97 { 98 enum : AudioFormatFlags 99 { 100 kAudioFormatFlagsNativeEndian = 0 101 } 102 } 103 104 version(BigEndian) 105 { 106 enum : AudioFormatFlags 107 { 108 kAudioFormatFlagsNativeEndian = kAudioFormatFlagIsBigEndian 109 } 110 } 111 112 enum : AudioFormatFlags 113 { 114 kAudioFormatFlagsNativeFloatPacked = kAudioFormatFlagIsFloat | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked 115 } 116 117 118 struct AudioStreamBasicDescription 119 { 120 double mSampleRate; 121 AudioFormatID mFormatID; 122 AudioFormatFlags mFormatFlags; 123 uint mBytesPerPacket; 124 uint mFramesPerPacket; 125 uint mBytesPerFrame; 126 uint mChannelsPerFrame; 127 uint mBitsPerChannel; 128 uint mReserved; 129 } 130 131 enum : AudioFormatID 132 { 133 kAudioFormatLinearPCM = CCONST('l', 'p', 'c', 'm') 134 } 135 136 alias AudioChannelLayoutTag = UInt32; 137 enum : AudioChannelLayoutTag 138 { 139 kAudioChannelLayoutTag_Mono = (100U<<16) | 1, // a standard mono stream 140 kAudioChannelLayoutTag_Stereo = (101U<<16) | 2, // a standard stereo stream (L R) - implied playback 141 kAudioChannelLayoutTag_StereoHeadphones = (102U<<16) | 2, // a standard stereo stream (L R) - implied headphone playback 142 kAudioChannelLayoutTag_MatrixStereo = (103U<<16) | 2, // a matrix encoded stereo stream (Lt, Rt) 143 kAudioChannelLayoutTag_MidSide = (104U<<16) | 2, // mid/side recording 144 kAudioChannelLayoutTag_XY = (105U<<16) | 2, // coincident mic pair (often 2 figure 8's) 145 kAudioChannelLayoutTag_Binaural = (106U<<16) | 2, // binaural stereo (left, right) 146 kAudioChannelLayoutTag_Unknown = 0xFFFF0000 // needs to be OR'd with number of channels 147 } 148