1 /* 2 * Copyright (c) 2016 Guillaume Piolat 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: 8 * 9 * * Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * * Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * * Neither the names 'Derelict', 'DerelictSDL', nor the names of its contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 27 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 28 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 29 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 module derelict.carbon.coreaudio; 33 34 35 import derelict.carbon.corefoundation; 36 37 // <CoreAudio/CoreAudioTypes.h> 38 39 struct SMPTETime 40 { 41 short mSubframes; 42 short mSubframeDivisor; 43 uint mCounter; 44 uint mType; 45 uint mFlags; 46 short mHours; 47 short mMinutes; 48 short mSeconds; 49 short mFrames; 50 } 51 52 53 alias AudioTimeStampFlags = UInt32; 54 enum : AudioTimeStampFlags 55 { 56 kAudioTimeStampNothingValid = 0, 57 kAudioTimeStampSampleTimeValid = (1U << 0), 58 kAudioTimeStampHostTimeValid = (1U << 1), 59 kAudioTimeStampRateScalarValid = (1U << 2), 60 kAudioTimeStampWordClockTimeValid = (1U << 3), 61 kAudioTimeStampSMPTETimeValid = (1U << 4), 62 kAudioTimeStampSampleHostTimeValid = (kAudioTimeStampSampleTimeValid | kAudioTimeStampHostTimeValid) 63 } 64 65 66 struct AudioTimeStamp 67 { 68 double mSampleTime; 69 ulong mHostTime; 70 double mRateScalar; 71 ulong mWordClockTime; 72 SMPTETime mSMPTETime; 73 uint mFlags; 74 uint mReserved; 75 } 76 77 struct AudioBuffer 78 { 79 uint mNumberChannels; 80 uint mDataByteSize; 81 void* mData; 82 } 83 84 struct AudioBufferList 85 { 86 uint mNumberBuffers; 87 AudioBuffer[1] mBuffers; 88 } 89 90 alias AudioSampleType = float; 91 92 alias AudioFormatID = uint; 93 alias AudioFormatFlags = uint; 94 enum : AudioFormatFlags 95 { 96 kAudioFormatFlagIsFloat = (1U << 0), // 0x1 97 kAudioFormatFlagIsBigEndian = (1U << 1), // 0x2 98 kAudioFormatFlagIsSignedInteger = (1U << 2), // 0x4 99 kAudioFormatFlagIsPacked = (1U << 3), // 0x8 100 kAudioFormatFlagIsAlignedHigh = (1U << 4), // 0x10 101 kAudioFormatFlagIsNonInterleaved = (1U << 5), // 0x20 102 kAudioFormatFlagIsNonMixable = (1U << 6), // 0x40 103 kAudioFormatFlagsAreAllClear = 0x80000000, 104 105 kLinearPCMFormatFlagIsFloat = kAudioFormatFlagIsFloat, 106 kLinearPCMFormatFlagIsBigEndian = kAudioFormatFlagIsBigEndian, 107 kLinearPCMFormatFlagIsSignedInteger = kAudioFormatFlagIsSignedInteger, 108 kLinearPCMFormatFlagIsPacked = kAudioFormatFlagIsPacked, 109 kLinearPCMFormatFlagIsAlignedHigh = kAudioFormatFlagIsAlignedHigh, 110 kLinearPCMFormatFlagIsNonInterleaved = kAudioFormatFlagIsNonInterleaved, 111 kLinearPCMFormatFlagIsNonMixable = kAudioFormatFlagIsNonMixable, 112 kLinearPCMFormatFlagsSampleFractionShift = 7, 113 kLinearPCMFormatFlagsSampleFractionMask = (0x3F << kLinearPCMFormatFlagsSampleFractionShift), 114 kLinearPCMFormatFlagsAreAllClear = kAudioFormatFlagsAreAllClear, 115 116 kAppleLosslessFormatFlag_16BitSourceData = 1, 117 kAppleLosslessFormatFlag_20BitSourceData = 2, 118 kAppleLosslessFormatFlag_24BitSourceData = 3, 119 kAppleLosslessFormatFlag_32BitSourceData = 4 120 } 121 version(LittleEndian) 122 { 123 enum : AudioFormatFlags 124 { 125 kAudioFormatFlagsNativeEndian = 0 126 } 127 } 128 129 version(BigEndian) 130 { 131 enum : AudioFormatFlags 132 { 133 kAudioFormatFlagsNativeEndian = kAudioFormatFlagIsBigEndian 134 } 135 } 136 137 enum : AudioFormatFlags 138 { 139 kAudioFormatFlagsNativeFloatPacked = kAudioFormatFlagIsFloat | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked 140 } 141 142 143 struct AudioStreamBasicDescription 144 { 145 double mSampleRate; 146 AudioFormatID mFormatID; 147 AudioFormatFlags mFormatFlags; 148 uint mBytesPerPacket; 149 uint mFramesPerPacket; 150 uint mBytesPerFrame; 151 uint mChannelsPerFrame; 152 uint mBitsPerChannel; 153 uint mReserved; 154 } 155 156 enum : AudioFormatID 157 { 158 kAudioFormatLinearPCM = CCONST('l', 'p', 'c', 'm') 159 } 160 161 alias AudioChannelLayoutTag = UInt32; 162 enum : AudioChannelLayoutTag 163 { 164 kAudioChannelLayoutTag_Mono = (100U<<16) | 1, // a standard mono stream 165 kAudioChannelLayoutTag_Stereo = (101U<<16) | 2, // a standard stereo stream (L R) - implied playback 166 kAudioChannelLayoutTag_StereoHeadphones = (102U<<16) | 2, // a standard stereo stream (L R) - implied headphone playback 167 kAudioChannelLayoutTag_MatrixStereo = (103U<<16) | 2, // a matrix encoded stereo stream (Lt, Rt) 168 kAudioChannelLayoutTag_MidSide = (104U<<16) | 2, // mid/side recording 169 kAudioChannelLayoutTag_XY = (105U<<16) | 2, // coincident mic pair (often 2 figure 8's) 170 kAudioChannelLayoutTag_Binaural = (106U<<16) | 2, // binaural stereo (left, right) 171 kAudioChannelLayoutTag_Unknown = 0xFFFF0000 // needs to be OR'd with number of channels 172 } 173