1# Scan Sound.h header file, generate sndgen.py and Sound.py files. 2# Then import sndsupport (which execs sndgen.py) to generate Sndmodule.c. 3# (Should learn how to tell the compiler to compile it as well.) 4 5import sys 6from bgenlocations import TOOLBOXDIR, BGENDIR 7sys.path.append(BGENDIR) 8 9from scantools import Scanner 10 11def main(): 12 input = "Sound.h" 13 output = "sndgen.py" 14 defsoutput = TOOLBOXDIR + "Sound.py" 15 scanner = SoundScanner(input, output, defsoutput) 16 scanner.scan() 17 scanner.close() 18 print "=== Testing definitions output code ===" 19 execfile(defsoutput, {}, {}) 20 print "=== Done scanning and generating, now doing 'import sndsupport' ===" 21 import sndsupport 22 print "=== Done. It's up to you to compile Sndmodule.c ===" 23 24class SoundScanner(Scanner): 25 26 def destination(self, type, name, arglist): 27 classname = "SndFunction" 28 listname = "functions" 29 if arglist: 30 t, n, m = arglist[0] 31 if t == "SndChannelPtr" and m == "InMode": 32 classname = "SndMethod" 33 listname = "sndmethods" 34 return classname, listname 35 36 def writeinitialdefs(self): 37 self.defsfile.write("def FOUR_CHAR_CODE(x): return x\n") 38 39 def makeblacklistnames(self): 40 return [ 41 'SndDisposeChannel', # automatic on deallocation 42 'SndAddModifier', # for internal use only 43 'SndPlayDoubleBuffer', # very low level routine 44 # Missing from libraries (UH332) 45 'SoundManagerSetInfo', 46 'SoundManagerGetInfo', 47 # Constants with funny definitions 48 'rate48khz', 49 'rate44khz', 50 'kInvalidSource', 51 # OS8 only: 52 'MACEVersion', 53 'SPBRecordToFile', 54 'Exp1to6', 55 'Comp6to1', 56 'Exp1to3', 57 'Comp3to1', 58 'SndControl', 59 'SndStopFilePlay', 60 'SndStartFilePlay', 61 'SndPauseFilePlay', 62 'SndRecordToFile', 63 64 ] 65 66 def makeblacklisttypes(self): 67 return [ 68 "GetSoundVol", 69 "SetSoundVol", 70 "UnsignedFixed", 71 # Don't have the time to dig into this... 72 "Component", 73 "ComponentInstance", 74 "SoundComponentDataPtr", 75 "SoundComponentData", 76 "SoundComponentData_ptr", 77 "SoundConverter", 78 ] 79 80 def makerepairinstructions(self): 81 return [ 82 ([("Str255", "*", "InMode")], 83 [("*", "*", "OutMode")]), 84 85 ([("void_ptr", "*", "InMode"), ("long", "*", "InMode")], 86 [("InBuffer", "*", "*")]), 87 88 ([("void", "*", "OutMode"), ("long", "*", "InMode"), 89 ("long", "*", "OutMode")], 90 [("VarVarOutBuffer", "*", "InOutMode")]), 91 92 ([("SCStatusPtr", "*", "InMode")], 93 [("SCStatus", "*", "OutMode")]), 94 95 ([("SMStatusPtr", "*", "InMode")], 96 [("SMStatus", "*", "OutMode")]), 97 98 ([("CompressionInfoPtr", "*", "InMode")], 99 [("CompressionInfo", "*", "OutMode")]), 100 101 # For SndPlay's SndListHandle argument 102 ([("Handle", "sndHdl", "InMode")], 103 [("SndListHandle", "*", "*")]), 104 105 # For SndStartFilePlay 106 ([("long", "bufferSize", "InMode"), ("void", "theBuffer", "OutMode")], 107 [("*", "*", "*"), ("FakeType('0')", "*", "InMode")]), 108 109 # For Comp3to1 etc. 110 ([("void_ptr", "inBuffer", "InMode"), 111 ("void", "outBuffer", "OutMode"), 112 ("unsigned_long", "cnt", "InMode")], 113 [("InOutBuffer", "buffer", "InOutMode")]), 114 115 # Ditto 116## ([("void_ptr", "inState", "InMode"), ("void", "outState", "OutMode")], 117## [("InOutBuf128", "state", "InOutMode")]), 118 ([("StateBlockPtr", "inState", "InMode"), ("StateBlockPtr", "outState", "InMode")], 119 [("StateBlock", "state", "InOutMode")]), 120 121 # Catch-all for the last couple of void pointers 122 ([("void", "*", "OutMode")], 123 [("void_ptr", "*", "InMode")]), 124 ] 125 126if __name__ == "__main__": 127 main() 128