1 | # Scan an Apple header file, generating a Python file of generator calls.
|
---|
2 |
|
---|
3 | import sys
|
---|
4 | from bgenlocations import TOOLBOXDIR, BGENDIR
|
---|
5 | sys.path.append(BGENDIR)
|
---|
6 | from scantools import Scanner
|
---|
7 |
|
---|
8 | LONG = "QuickTime"
|
---|
9 | SHORT = "qt"
|
---|
10 | HEADERFILES= (
|
---|
11 | # "Components.h" -- In Carbon.Cm
|
---|
12 | "Movies.h",
|
---|
13 | "ImageCompression.h",
|
---|
14 | "QuickTimeComponents.h",
|
---|
15 | # "ImageCodec.h" -- seems not too useful, and difficult.
|
---|
16 | # "IsochronousDataHandlers.h" -- Is this useful?
|
---|
17 | "MediaHandlers.h",
|
---|
18 | # "QTML.h", -- Windows only, needs separate module
|
---|
19 | # "QuickTimeStreaming.h", -- Difficult
|
---|
20 | # "QTStreamingComponents.h", -- Needs QTStreaming
|
---|
21 | "QuickTimeMusic.h",
|
---|
22 | # "QuickTimeVR.h", -- Not done yet
|
---|
23 | # "Sound.h", -- In Carbon.Snd
|
---|
24 | )
|
---|
25 | OBJECTS = ("Movie", "Track", "Media", "UserData", "TimeBase", "MovieController",
|
---|
26 | "IdleManager", "SGOutput")
|
---|
27 |
|
---|
28 | def main():
|
---|
29 | input = HEADERFILES
|
---|
30 | output = SHORT + "gen.py"
|
---|
31 | defsoutput = TOOLBOXDIR + LONG + ".py"
|
---|
32 | scanner = MyScanner(input, output, defsoutput)
|
---|
33 | scanner.scan()
|
---|
34 | scanner.close()
|
---|
35 | scanner.gentypetest(SHORT+"typetest.py")
|
---|
36 | print "=== Testing definitions output code ==="
|
---|
37 | execfile(defsoutput, {}, {})
|
---|
38 | print "=== Done scanning and generating, now importing the generated code... ==="
|
---|
39 | exec "import " + SHORT + "support"
|
---|
40 | print "=== Done. It's up to you to compile it now! ==="
|
---|
41 |
|
---|
42 | class MyScanner(Scanner):
|
---|
43 |
|
---|
44 | def destination(self, type, name, arglist):
|
---|
45 | classname = "Function"
|
---|
46 | listname = "functions"
|
---|
47 | if arglist:
|
---|
48 | t, n, m = arglist[0]
|
---|
49 | if t in OBJECTS and m == "InMode":
|
---|
50 | classname = "Method"
|
---|
51 | listname = t + "_methods"
|
---|
52 | return classname, listname
|
---|
53 |
|
---|
54 | def writeinitialdefs(self):
|
---|
55 | self.defsfile.write("def FOUR_CHAR_CODE(x): return x\n")
|
---|
56 | self.defsfile.write("xmlIdentifierUnrecognized = -1\n")
|
---|
57 | self.defsfile.write("kControllerMinimum = -0xf777\n")
|
---|
58 | self.defsfile.write("notImplementedMusicOSErr = -2071\n")
|
---|
59 | self.defsfile.write("cantSendToSynthesizerOSErr = -2072\n")
|
---|
60 | self.defsfile.write("cantReceiveFromSynthesizerOSErr = -2073\n")
|
---|
61 | self.defsfile.write("illegalVoiceAllocationOSErr = -2074\n")
|
---|
62 | self.defsfile.write("illegalPartOSErr = -2075\n")
|
---|
63 | self.defsfile.write("illegalChannelOSErr = -2076\n")
|
---|
64 | self.defsfile.write("illegalKnobOSErr = -2077\n")
|
---|
65 | self.defsfile.write("illegalKnobValueOSErr = -2078\n")
|
---|
66 | self.defsfile.write("illegalInstrumentOSErr = -2079\n")
|
---|
67 | self.defsfile.write("illegalControllerOSErr = -2080\n")
|
---|
68 | self.defsfile.write("midiManagerAbsentOSErr = -2081\n")
|
---|
69 | self.defsfile.write("synthesizerNotRespondingOSErr = -2082\n")
|
---|
70 | self.defsfile.write("synthesizerOSErr = -2083\n")
|
---|
71 | self.defsfile.write("illegalNoteChannelOSErr = -2084\n")
|
---|
72 | self.defsfile.write("noteChannelNotAllocatedOSErr = -2085\n")
|
---|
73 | self.defsfile.write("tunePlayerFullOSErr = -2086\n")
|
---|
74 | self.defsfile.write("tuneParseOSErr = -2087\n")
|
---|
75 |
|
---|
76 | def makeblacklistnames(self):
|
---|
77 | return [
|
---|
78 | "xmlIdentifierUnrecognized", # const with incompatible definition
|
---|
79 | "DisposeMovie", # Done on python-object disposal
|
---|
80 | "DisposeMovieTrack", # ditto
|
---|
81 | "DisposeTrackMedia", # ditto
|
---|
82 | "DisposeUserData", # ditto
|
---|
83 | # "DisposeTimeBase", # ditto
|
---|
84 | "DisposeMovieController", # ditto
|
---|
85 |
|
---|
86 | # The following 4 use 'void *' in an uncontrolled way
|
---|
87 | # TBD when I've read the manual...
|
---|
88 | "GetUserDataItem",
|
---|
89 | "SetUserDataItem",
|
---|
90 | "SetTextSampleData",
|
---|
91 | "BeginFullScreen",
|
---|
92 | # bgen gets the argument in/out wrong..
|
---|
93 | "AddTextSample",
|
---|
94 | "AddTESample",
|
---|
95 | "AddHiliteSample",
|
---|
96 | "HiliteTextSample",
|
---|
97 |
|
---|
98 | "MakeTrackTimeTable", # Uses long * return?
|
---|
99 | "MakeMediaTimeTable", # ditto
|
---|
100 | ## "VideoMediaGetStallCount", # Undefined in CW Pro 3 library
|
---|
101 | # OS8 only:
|
---|
102 | 'SpriteMediaGetIndImageProperty', # XXXX Why isn't this in carbon?
|
---|
103 | 'CheckQuickTimeRegistration',
|
---|
104 | 'SetMovieAnchorDataRef',
|
---|
105 | 'GetMovieAnchorDataRef',
|
---|
106 | 'GetMovieLoadState',
|
---|
107 | 'OpenADataHandler',
|
---|
108 | 'MovieMediaGetCurrentMovieProperty',
|
---|
109 | 'MovieMediaGetCurrentTrackProperty',
|
---|
110 | 'MovieMediaGetChildMovieDataReference',
|
---|
111 | 'MovieMediaSetChildMovieDataReference',
|
---|
112 | 'MovieMediaLoadChildMovieFromDataReference',
|
---|
113 | 'Media3DGetViewObject',
|
---|
114 |
|
---|
115 | # these are ImageCompression blacklists
|
---|
116 | "GraphicsExportGetInputPtr",
|
---|
117 |
|
---|
118 | # QuickTimeComponents
|
---|
119 | # These two need some help: the first returns a point to a databuffer that
|
---|
120 | # the second disposes. Generate manually?
|
---|
121 | "VDCompressDone",
|
---|
122 | "VDReleaseCompressBuffer",
|
---|
123 | "QTVideoOutputGetGWorldParameters", # How useful is this?
|
---|
124 |
|
---|
125 | # MediaHandlers
|
---|
126 | "MediaMakeMediaTimeTable", # just lazy
|
---|
127 | "MediaGetSampleDataPointer", # funny output pointer
|
---|
128 |
|
---|
129 | # QuickTimeMusic
|
---|
130 | "kControllerMinimum",
|
---|
131 | # These are artefacts of a macro definition
|
---|
132 | "ulen",
|
---|
133 | "_ext",
|
---|
134 | "x",
|
---|
135 | "w1",
|
---|
136 | "w2",
|
---|
137 | ]
|
---|
138 |
|
---|
139 | def makeblacklisttypes(self):
|
---|
140 | return [
|
---|
141 | # I don't think we want to do these
|
---|
142 | "QTSyncTaskPtr",
|
---|
143 | # We dont do callbacks yet, so no need for these
|
---|
144 | "QTCallBack",
|
---|
145 | # Skipped for now, due to laziness
|
---|
146 | "TrackEditState",
|
---|
147 | "MovieEditState",
|
---|
148 | "MatrixRecord",
|
---|
149 | "MatrixRecord_ptr",
|
---|
150 | "SampleReferencePtr",
|
---|
151 | "QTTweener",
|
---|
152 | "QTErrorReplacementPtr",
|
---|
153 | "QTRestrictionSet",
|
---|
154 | "QTUUID",
|
---|
155 | "QTUUID_ptr",
|
---|
156 |
|
---|
157 | # Routine pointers, not yet.
|
---|
158 | "MoviesErrorUPP",
|
---|
159 | "MoviePreviewCallOutUPP",
|
---|
160 | "MovieDrawingCompleteUPP",
|
---|
161 | "QTCallBackUPP",
|
---|
162 | "TextMediaUPP",
|
---|
163 | "MovieProgressUPP",
|
---|
164 | "MovieRgnCoverUPP",
|
---|
165 | "MCActionFilterUPP",
|
---|
166 | "MCActionFilterWithRefConUPP",
|
---|
167 | "GetMovieUPP",
|
---|
168 | "ModalFilterUPP",
|
---|
169 | "TrackTransferUPP",
|
---|
170 | "MoviePrePrerollCompleteUPP",
|
---|
171 | "MovieExecuteWiredActionsUPP",
|
---|
172 | "QTBandwidthNotificationUPP",
|
---|
173 | "DoMCActionUPP",
|
---|
174 | "QTNextTaskNeededSoonerCallbackUPP",
|
---|
175 |
|
---|
176 | "SampleReference64Ptr", # Don't know what this does, yet
|
---|
177 | "QTRuntimeSpriteDescPtr",
|
---|
178 | "QTBandwidthReference",
|
---|
179 | "QTScheduledBandwidthReference",
|
---|
180 | "QTAtomContainer",
|
---|
181 | "SpriteWorld",
|
---|
182 | "Sprite",
|
---|
183 |
|
---|
184 | # these are ImageCompression blacklists
|
---|
185 | "ICMDataUPP",
|
---|
186 | "ICMFlushUPP",
|
---|
187 | "ICMCompletionUPP",
|
---|
188 | "ICMProgressUPP",
|
---|
189 | "StdPixUPP",
|
---|
190 | "QDPixUPP",
|
---|
191 | "ICMAlignmentUPP",
|
---|
192 | "ICMCursorShieldedUPP",
|
---|
193 | "ICMMemoryDisposedUPP",
|
---|
194 | "ICMConvertDataFormatUPP",
|
---|
195 | "ModalFilterYDUPP",
|
---|
196 | "FileFilterUPP",
|
---|
197 |
|
---|
198 | "CodecNameSpecListPtr",
|
---|
199 | "CodecInfo",
|
---|
200 | "ImageSequence",
|
---|
201 | "MatrixRecordPtr",
|
---|
202 | "ICMDataProcRecordPtr",
|
---|
203 | "OpenCPicParams",
|
---|
204 | "ICMProgressProcRecordPtr",
|
---|
205 | "ICMAlignmentProcRecordPtr",
|
---|
206 | "ICMPixelFormatInfoPtr",
|
---|
207 | "ImageSequenceDataSource",
|
---|
208 | "ConstStrFileNameParam",
|
---|
209 | "ImageTranscodeSequence",
|
---|
210 | "ImageFieldSequence",
|
---|
211 | "Fract",
|
---|
212 | "PixMapPtr",
|
---|
213 | "GWorldFlags",
|
---|
214 | "void_ptr", # XXX Being lazy, this one is doable.
|
---|
215 |
|
---|
216 | # These are from QuickTimeComponents
|
---|
217 | "CDataHandlerUPP",
|
---|
218 | "CharDataHandlerUPP",
|
---|
219 | "CommentHandlerUPP",
|
---|
220 | "DataHCompletionUPP",
|
---|
221 | "'MovieExportGetDataUPP",
|
---|
222 | "MovieExportGetPropertyUPP",
|
---|
223 | "PreprocessInstructionHandlerUPP",
|
---|
224 | "SGModalFilterUPP",
|
---|
225 | "StartDocumentHandlerUPP",
|
---|
226 | "StartElementHandlerUPP",
|
---|
227 | "VdigIntUPP",
|
---|
228 | "SGDataUPP",
|
---|
229 | "EndDocumentHandlerUPP",
|
---|
230 | "EndElementHandlerUPP",
|
---|
231 | "VideoBottles", # Record full of UPPs
|
---|
232 |
|
---|
233 | "SCParams",
|
---|
234 | "ICMCompletionProcRecordPtr",
|
---|
235 | "DataHVolumeList",
|
---|
236 | "DigitizerInfo",
|
---|
237 | "SGCompressInfo",
|
---|
238 | "SeqGrabExtendedFrameInfoPtr",
|
---|
239 | "SeqGrabFrameInfoPtr",
|
---|
240 | "TCTextOptionsPtr",
|
---|
241 | "SGCompressInfo_ptr",
|
---|
242 | "SGDeviceList",
|
---|
243 | "TextDisplayData",
|
---|
244 | "TimeCodeDef",
|
---|
245 | "TimeCodeRecord",
|
---|
246 | "TweenRecord",
|
---|
247 | "VDGamRecPtr",
|
---|
248 | "ToneDescription", # XXXX Just lazy: this one is easy.
|
---|
249 | "XMLDoc",
|
---|
250 | "UInt64", # XXXX lazy
|
---|
251 | "UInt64_ptr", # XXXX lazy
|
---|
252 |
|
---|
253 | # From MediaHandlers
|
---|
254 | "ActionsUPP",
|
---|
255 | "PrePrerollCompleteUPP",
|
---|
256 | "CodecComponentHandle", # Difficult: handle containing list of components.
|
---|
257 | "GetMovieCompleteParams", # Immense struct
|
---|
258 | "LevelMeterInfoPtr", # Lazy. Also: can be an output parameter!!
|
---|
259 | "MediaEQSpectrumBandsRecordPtr", # ditto
|
---|
260 |
|
---|
261 | # From QuickTimeMusic
|
---|
262 | "MusicMIDISendUPP",
|
---|
263 | "MusicOfflineDataUPP",
|
---|
264 | "TuneCallBackUPP",
|
---|
265 | "TunePlayCallBackUPP",
|
---|
266 | "GCPart", # Struct with lots of fields
|
---|
267 | "GCPart_ptr",
|
---|
268 | "GenericKnobDescription", # Struct with lots of fields
|
---|
269 | "KnobDescription", # Struct with lots of fields
|
---|
270 | "InstrumentAboutInfo", # Struct, not too difficult
|
---|
271 | "NoteChannel", # XXXX Lazy. Could be opaque, I think
|
---|
272 | "NoteRequest", # XXXX Lazy. Not-too-difficult struct
|
---|
273 | "SynthesizerConnections", # Struct with lots of fields
|
---|
274 | "SynthesizerDescription", # Struct with lots of fields
|
---|
275 | "TuneStatus", # Struct with lots of fields
|
---|
276 |
|
---|
277 | ]
|
---|
278 |
|
---|
279 | def makerepairinstructions(self):
|
---|
280 | return [
|
---|
281 | ([('FSSpec', '*', 'OutMode')], [('FSSpec_ptr', '*', 'InMode')]),
|
---|
282 |
|
---|
283 | # Movie controller creation
|
---|
284 | ([('ComponentInstance', 'NewMovieController', 'ReturnMode')],
|
---|
285 | [('MovieController', '*', 'ReturnMode')]),
|
---|
286 |
|
---|
287 | # NewMovieFromFile
|
---|
288 | ([('short', 'resId', 'OutMode'), ('StringPtr', 'resName', 'InMode')],
|
---|
289 | [('short', 'resId', 'InOutMode'), ('dummyStringPtr', 'resName', 'InMode')]),
|
---|
290 |
|
---|
291 | # MCDoAction and more
|
---|
292 | ([('void', '*', 'OutMode')], [('mcactionparams', '*', 'InMode')]),
|
---|
293 |
|
---|
294 | # SetTimeBaseZero. Does not handle NULLs, unfortunately
|
---|
295 | ([('TimeRecord', 'zero', 'OutMode')], [('TimeRecord', 'zero', 'InMode')]),
|
---|
296 |
|
---|
297 | # ConvertTime and ConvertTimeScale
|
---|
298 | ([('TimeRecord', 'inout', 'OutMode')], [('TimeRecord', 'inout', 'InOutMode')]),
|
---|
299 | ([('TimeRecord', 'theTime', 'OutMode')], [('TimeRecord', 'theTime', 'InOutMode')]),
|
---|
300 |
|
---|
301 | # AddTime and SubtractTime
|
---|
302 | ([('TimeRecord', 'dst', 'OutMode')], [('TimeRecord', 'dst', 'InOutMode')]),
|
---|
303 |
|
---|
304 | # Funny definitions
|
---|
305 | ([('char_ptr', '*', 'InMode')], [('stringptr', '*', 'InMode')]),
|
---|
306 | ([('FSSpecPtr', '*', 'InMode')], [('FSSpec_ptr', '*', 'InMode')]),
|
---|
307 | ([('unsigned_char', 'swfVersion', 'OutMode')], [('UInt8', 'swfVersion', 'OutMode')]),
|
---|
308 |
|
---|
309 | # It seems MusicMIDIPacket if never flagged with const but always used
|
---|
310 | # for sending only. If that ever changes this needs to be fixed.
|
---|
311 | ([('MusicMIDIPacket', '*', 'OutMode')], [('MusicMIDIPacket_ptr', '*', 'InMode')]),
|
---|
312 |
|
---|
313 | # QTMusic const-less input parameters
|
---|
314 | ([('unsigned_long', 'header', 'OutMode')], [('UnsignedLongPtr', 'header', 'InMode')]),
|
---|
315 | ]
|
---|
316 |
|
---|
317 | if __name__ == "__main__":
|
---|
318 | main()
|
---|