ยปCore Development>Code coverage>Mac/Modules/snd/sndsupport.py

Python code coverage for Mac/Modules/snd/sndsupport.py

#countcontent
1n/a# This script generates the Sound interface for Python.
2n/a# It uses the "bgen" package to generate C code.
3n/a# It execs the file sndgen.py which contain the function definitions
4n/a# (sndgen.py was generated by sndscan.py, scanning the <Sound.h> header file).
5n/a
6n/afrom macsupport import *
7n/a
8n/a
9n/a# define our own function and module generators
10n/a
11n/aclass SndMixIn: pass
12n/a
13n/aclass SndFunction(SndMixIn, OSErrFunctionGenerator): pass
14n/aclass SndMethod(SndMixIn, OSErrMethodGenerator): pass
15n/a
16n/a
17n/a# includestuff etc. are imported from macsupport
18n/a
19n/aincludestuff = includestuff + """
20n/a#include <Carbon/Carbon.h>
21n/a"""
22n/a
23n/ainitstuff = initstuff + """
24n/a"""
25n/a
26n/a
27n/a# define types used for arguments (in addition to standard and macsupport types)
28n/a
29n/aclass SndChannelPtrType(OpaqueByValueType):
30n/a def declare(self, name):
31n/a # Initializing all SndChannelPtr objects to 0 saves
32n/a # special-casing NewSndChannel(), where it is formally an
33n/a # input-output parameter but we treat it as output-only
34n/a # (since Python users are not supposed to allocate memory)
35n/a Output("SndChannelPtr %s = 0;", name)
36n/a
37n/aSndChannelPtr = SndChannelPtrType('SndChannelPtr', 'SndCh')
38n/a
39n/aSndCommand = OpaqueType('SndCommand', 'SndCmd')
40n/aSndCommand_ptr = OpaqueType('SndCommand', 'SndCmd')
41n/aSndListHandle = OpaqueByValueType("SndListHandle", "ResObj")
42n/aSPBPtr = OpaqueByValueType("SPBPtr", "SPBObj")
43n/aModalFilterUPP = FakeType("(ModalFilterUPP)0")
44n/a
45n/a#
46n/a# NOTE: the following is pretty dangerous. For void pointers we pass buffer addresses
47n/a# but we have no way to check that the buffer is big enough. This is the same problem
48n/a# as in C, though (but Pythoneers may not be suspecting this...)
49n/avoid_ptr = Type("void *", "w")
50n/a
51n/aclass SndCallBackType(InputOnlyType):
52n/a def __init__(self):
53n/a Type.__init__(self, 'PyObject*', 'O')
54n/a def getargsCheck(self, name):
55n/a Output("if (%s != Py_None && !PyCallable_Check(%s))", name, name)
56n/a OutLbrace()
57n/a Output('PyErr_SetString(PyExc_TypeError, "callback must be callable");')
58n/a Output("goto %s__error__;", name)
59n/a OutRbrace()
60n/a def passInput(self, name):
61n/a return "NewSndCallBackUPP(SndCh_UserRoutine)"
62n/a def cleanup(self, name):
63n/a # XXX This knows it is executing inside the SndNewChannel wrapper
64n/a Output("if (_res != NULL && %s != Py_None)", name)
65n/a OutLbrace()
66n/a Output("SndChannelObject *p = (SndChannelObject *)_res;")
67n/a Output("p->ob_itself->userInfo = (long)p;")
68n/a Output("Py_INCREF(%s);", name)
69n/a Output("p->ob_callback = %s;", name)
70n/a OutRbrace()
71n/a DedentLevel()
72n/a Output(" %s__error__: ;", name)
73n/a IndentLevel()
74n/a
75n/aSndCallBackProcPtr = SndCallBackType()
76n/aSndCallBackUPP = SndCallBackProcPtr
77n/a
78n/aSndCompletionProcPtr = FakeType('(SndCompletionProcPtr)0') # XXX
79n/aSndCompletionUPP = SndCompletionProcPtr
80n/a
81n/a##InOutBuf128 = FixedInputOutputBufferType(128)
82n/aStateBlock = StructInputOutputBufferType('StateBlock')
83n/a
84n/aAudioSelectionPtr = FakeType('0') # XXX
85n/a
86n/aProcPtr = FakeType('0') # XXX
87n/aFilePlayCompletionUPP = FakeType('0') # XXX
88n/a
89n/aSCStatus = StructOutputBufferType('SCStatus')
90n/aSMStatus = StructOutputBufferType('SMStatus')
91n/aCompressionInfo = StructOutputBufferType('CompressionInfo')
92n/a
93n/aincludestuff = includestuff + """
94n/a/* Convert a SndCommand argument */
95n/astatic int
96n/aSndCmd_Convert(PyObject *v, SndCommand *pc)
97n/a{
98n/a int len;
99n/a pc->param1 = 0;
100n/a pc->param2 = 0;
101n/a if (PyTuple_Check(v)) {
102n/a if (PyArg_ParseTuple(v, "h|hl", &pc->cmd, &pc->param1, &pc->param2))
103n/a return 1;
104n/a PyErr_Clear();
105n/a return PyArg_ParseTuple(v, "Hhs#", &pc->cmd, &pc->param1, &pc->param2, &len);
106n/a }
107n/a return PyArg_Parse(v, "H", &pc->cmd);
108n/a}
109n/a
110n/astatic pascal void SndCh_UserRoutine(SndChannelPtr chan, SndCommand *cmd); /* Forward */
111n/astatic pascal void SPB_completion(SPBPtr my_spb); /* Forward */
112n/a"""
113n/a
114n/a
115n/afinalstuff = finalstuff + """
116n/a/* Routine passed to Py_AddPendingCall -- call the Python callback */
117n/astatic int
118n/aSndCh_CallCallBack(void *arg)
119n/a{
120n/a SndChannelObject *p = (SndChannelObject *)arg;
121n/a PyObject *args;
122n/a PyObject *res;
123n/a args = Py_BuildValue("(O(hhl))",
124n/a p, p->ob_cmd.cmd, p->ob_cmd.param1, p->ob_cmd.param2);
125n/a res = PyEval_CallObject(p->ob_callback, args);
126n/a Py_DECREF(args);
127n/a if (res == NULL)
128n/a return -1;
129n/a Py_DECREF(res);
130n/a return 0;
131n/a}
132n/a
133n/a/* Routine passed to NewSndChannel -- schedule a call to SndCh_CallCallBack */
134n/astatic pascal void
135n/aSndCh_UserRoutine(SndChannelPtr chan, SndCommand *cmd)
136n/a{
137n/a SndChannelObject *p = (SndChannelObject *)(chan->userInfo);
138n/a if (p->ob_callback != NULL) {
139n/a long A5 = SetA5(p->ob_A5);
140n/a p->ob_cmd = *cmd;
141n/a Py_AddPendingCall(SndCh_CallCallBack, (void *)p);
142n/a SetA5(A5);
143n/a }
144n/a}
145n/a
146n/a/* SPB callbacks - Schedule callbacks to Python */
147n/astatic int
148n/aSPB_CallCallBack(void *arg)
149n/a{
150n/a SPBObject *p = (SPBObject *)arg;
151n/a PyObject *args;
152n/a PyObject *res;
153n/a
154n/a if ( p->ob_thiscallback == 0 ) return 0;
155n/a args = Py_BuildValue("(O)", p);
156n/a res = PyEval_CallObject(p->ob_thiscallback, args);
157n/a p->ob_thiscallback = 0;
158n/a Py_DECREF(args);
159n/a if (res == NULL)
160n/a return -1;
161n/a Py_DECREF(res);
162n/a return 0;
163n/a}
164n/a
165n/astatic pascal void
166n/aSPB_completion(SPBPtr my_spb)
167n/a{
168n/a SPBObject *p = (SPBObject *)(my_spb->userLong);
169n/a
170n/a if (p && p->ob_completion) {
171n/a long A5 = SetA5(p->ob_A5);
172n/a p->ob_thiscallback = p->ob_completion; /* Hope we cannot get two at the same time */
173n/a Py_AddPendingCall(SPB_CallCallBack, (void *)p);
174n/a SetA5(A5);
175n/a }
176n/a}
177n/a
178n/a"""
179n/a
180n/a
181n/a# create the module and object definition and link them
182n/a
183n/aclass SndObjectDefinition(PEP252Mixin, ObjectDefinition):
184n/a
185n/a def outputStructMembers(self):
186n/a ObjectDefinition.outputStructMembers(self)
187n/a Output("/* Members used to implement callbacks: */")
188n/a Output("PyObject *ob_callback;")
189n/a Output("long ob_A5;");
190n/a Output("SndCommand ob_cmd;")
191n/a
192n/a def outputInitStructMembers(self):
193n/a ObjectDefinition.outputInitStructMembers(self)
194n/a Output("it->ob_callback = NULL;")
195n/a Output("it->ob_A5 = SetCurrentA5();");
196n/a
197n/a def outputCleanupStructMembers(self):
198n/a ObjectDefinition.outputCleanupStructMembers(self)
199n/a Output("Py_XDECREF(self->ob_callback);")
200n/a
201n/a def outputFreeIt(self, itselfname):
202n/a Output("SndDisposeChannel(%s, 1);", itselfname)
203n/a
204n/a def outputConvert(self):
205n/a pass # Not needed
206n/a
207n/a#
208n/a
209n/aclass SpbObjectDefinition(PEP252Mixin, ObjectDefinition):
210n/a getsetlist = [
211n/a (
212n/a 'inRefNum',
213n/a 'return Py_BuildValue("l", self->ob_spb.inRefNum);',
214n/a 'return -1 + PyArg_Parse(v, "l", &self->ob_spb.inRefNum);',
215n/a None,
216n/a ), (
217n/a 'count',
218n/a 'return Py_BuildValue("l", self->ob_spb.count);',
219n/a 'return -1 + PyArg_Parse(v, "l", &self->ob_spb.count);',
220n/a None
221n/a ), (
222n/a 'milliseconds',
223n/a 'return Py_BuildValue("l", self->ob_spb.milliseconds);',
224n/a 'return -1 + PyArg_Parse(v, "l", &self->ob_spb.milliseconds);',
225n/a None,
226n/a ), (
227n/a 'error',
228n/a 'return Py_BuildValue("h", self->ob_spb.error);',
229n/a None,
230n/a None
231n/a ), (
232n/a 'completionRoutine',
233n/a None,
234n/a """self->ob_spb.completionRoutine = NewSICompletionUPP(SPB_completion);
235n/a self->ob_completion = v;
236n/a Py_INCREF(v);
237n/a return 0;""",
238n/a None,
239n/a )]
240n/a
241n/a def outputStructMembers(self):
242n/a Output("/* Members used to implement callbacks: */")
243n/a Output("PyObject *ob_completion;")
244n/a Output("PyObject *ob_interrupt;")
245n/a Output("PyObject *ob_thiscallback;");
246n/a Output("long ob_A5;")
247n/a Output("SPB ob_spb;")
248n/a
249n/a def outputNew(self):
250n/a Output()
251n/a Output("%sPyObject *%s_New(void)", self.static, self.prefix)
252n/a OutLbrace()
253n/a Output("%s *it;", self.objecttype)
254n/a self.outputCheckNewArg()
255n/a Output("it = PyObject_NEW(%s, &%s);", self.objecttype, self.typename)
256n/a Output("if (it == NULL) return NULL;")
257n/a self.outputInitStructMembers()
258n/a Output("return (PyObject *)it;")
259n/a OutRbrace()
260n/a
261n/a def outputInitStructMembers(self):
262n/a Output("it->ob_completion = NULL;")
263n/a Output("it->ob_interrupt = NULL;")
264n/a Output("it->ob_thiscallback = NULL;")
265n/a Output("it->ob_A5 = SetCurrentA5();")
266n/a Output("memset((char *)&it->ob_spb, 0, sizeof(it->ob_spb));")
267n/a Output("it->ob_spb.userLong = (long)it;")
268n/a
269n/a def outputCleanupStructMembers(self):
270n/a ObjectDefinition.outputCleanupStructMembers(self)
271n/a Output("self->ob_spb.userLong = 0;")
272n/a Output("self->ob_thiscallback = 0;")
273n/a Output("Py_XDECREF(self->ob_completion);")
274n/a Output("Py_XDECREF(self->ob_interrupt);")
275n/a
276n/a def outputConvert(self):
277n/a Output("%sint %s_Convert(PyObject *v, %s *p_itself)", self.static, self.prefix, self.itselftype)
278n/a OutLbrace()
279n/a self.outputCheckConvertArg()
280n/a Output("if (!%s_Check(v))", self.prefix)
281n/a OutLbrace()
282n/a Output('PyErr_SetString(PyExc_TypeError, "%s required");', self.name)
283n/a Output("return 0;")
284n/a OutRbrace()
285n/a Output("*p_itself = &((%s *)v)->ob_spb;", self.objecttype)
286n/a Output("return 1;")
287n/a OutRbrace()
288n/a
289n/a
290n/asndobject = SndObjectDefinition('SndChannel', 'SndCh', 'SndChannelPtr')
291n/aspbobject = SpbObjectDefinition('SPB', 'SPBObj', 'SPBPtr')
292n/aspbgenerator = ManualGenerator("SPB", "_res = SPBObj_New(); return _res;")
293n/amodule = MacModule('_Snd', 'Snd', includestuff, finalstuff, initstuff)
294n/amodule.addobject(sndobject)
295n/amodule.addobject(spbobject)
296n/amodule.add(spbgenerator)
297n/a
298n/a
299n/a# create lists of functions and object methods
300n/a
301n/afunctions = []
302n/asndmethods = []
303n/a
304n/a
305n/a# populate the lists
306n/a
307n/aexecfile('sndgen.py')
308n/a
309n/a
310n/a# add the functions and methods to the module and object, respectively
311n/a
312n/afor f in functions: module.add(f)
313n/afor f in sndmethods: sndobject.add(f)
314n/a
315n/a
316n/a# generate output
317n/a
318n/aSetOutputFileName('_Sndmodule.c')
319n/amodule.generate()