# Scan Sound.h header file, generate sndgen.py and Sound.py files.
# Then import sndsupport (which execs sndgen.py) to generate Sndmodule.c.
# (Should learn how to tell the compiler to compile it as well.)

import sys
import os
from bgenlocations import TOOLBOXDIR, BGENDIR
sys.path.append(BGENDIR)

from scantools import Scanner

def main():
    input = "Sound.h"
    output = "sndgen.py"
    defsoutput = TOOLBOXDIR + "Sound.py"
    scanner = SoundScanner(input, output, defsoutput)
    scanner.scan()
    scanner.close()
    print "=== Testing definitions output code ==="
    execfile(defsoutput, {}, {})
    print "=== Done scanning and generating, now doing 'import sndsupport' ==="
    import sndsupport
    print "=== Done.  It's up to you to compile Sndmodule.c ==="

class SoundScanner(Scanner):

    def destination(self, type, name, arglist):
        classname = "SndFunction"
        listname = "functions"
        if arglist:
            t, n, m = arglist[0]
            if t == "SndChannelPtr" and m == "InMode":
                classname = "SndMethod"
                listname = "sndmethods"
        return classname, listname

    def writeinitialdefs(self):
        self.defsfile.write("def FOUR_CHAR_CODE(x): return x\n")

    def makeblacklistnames(self):
        return [
                'SndDisposeChannel',            # automatic on deallocation
                'SndAddModifier',               # for internal use only
                'SndPlayDoubleBuffer',          # very low level routine
                # Missing from libraries (UH332)
                'SoundManagerSetInfo',
                'SoundManagerGetInfo',
                # Constants with funny definitions
                'rate48khz',
                'rate44khz',
                'kInvalidSource',
                # OS8 only:
                'MACEVersion',
                'SPBRecordToFile',
                'Exp1to6',
                'Comp6to1',
                'Exp1to3',
                'Comp3to1',
                'SndControl',
                'SndStopFilePlay',
                'SndStartFilePlay',
                'SndPauseFilePlay',
                'SndRecordToFile',

                ]

    def makeblacklisttypes(self):
        return [
                "GetSoundVol",
                "SetSoundVol",
                "UnsignedFixed",
                # Don't have the time to dig into this...
                "Component",
                "ComponentInstance",
                "SoundComponentDataPtr",
                "SoundComponentData",
                "SoundComponentData_ptr",
                "SoundConverter",
                ]

    def makerepairinstructions(self):
        return [
                ([("Str255", "*", "InMode")],
                 [("*", "*", "OutMode")]),

                ([("void_ptr", "*", "InMode"), ("long", "*", "InMode")],
                 [("InBuffer", "*", "*")]),

                ([("void", "*", "OutMode"), ("long", "*", "InMode"),
                                            ("long", "*", "OutMode")],
                 [("VarVarOutBuffer", "*", "InOutMode")]),

                ([("SCStatusPtr", "*", "InMode")],
                 [("SCStatus", "*", "OutMode")]),

                ([("SMStatusPtr", "*", "InMode")],
                 [("SMStatus", "*", "OutMode")]),

                ([("CompressionInfoPtr", "*", "InMode")],
                 [("CompressionInfo", "*", "OutMode")]),

                # For SndPlay's SndListHandle argument
                ([("Handle", "sndHdl", "InMode")],
                 [("SndListHandle", "*", "*")]),

                # For SndStartFilePlay
                ([("long", "bufferSize", "InMode"), ("void", "theBuffer", "OutMode")],
                 [("*", "*", "*"), ("FakeType('0')", "*", "InMode")]),

                # For Comp3to1 etc.
                ([("void_ptr", "inBuffer", "InMode"),
                  ("void", "outBuffer", "OutMode"),
                  ("unsigned_long", "cnt", "InMode")],
                 [("InOutBuffer", "buffer", "InOutMode")]),

                # Ditto
##                      ([("void_ptr", "inState", "InMode"), ("void", "outState", "OutMode")],
##                       [("InOutBuf128", "state", "InOutMode")]),
                ([("StateBlockPtr", "inState", "InMode"), ("StateBlockPtr", "outState", "InMode")],
                 [("StateBlock", "state", "InOutMode")]),

                # Catch-all for the last couple of void pointers
                ([("void", "*", "OutMode")],
                 [("void_ptr", "*", "InMode")]),
                ]

if __name__ == "__main__":
    main()
