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