static int init() { if (audio_fd >= 0) return 1; if ((audio_fd = asa_init()) >= 0) return 1; err_setstr(RuntimeError, "can't initialize async audio"); return 0; }
static object * amigalibs_obj2reg(object *self, object *arg) { ULONG res; if(!arg) return (object*) PyErr_BadArgument(); if(obj2reg(arg, &res)) return newintobject(res); else { err_setstr(TypeError, "can't convert type to register ULONG"); return NULL; } }
static object * newamigalibobject(char *libname, int libver) { amigalibobject *ao; if(ao = NEWOBJ(amigalibobject, &Amigalibtype)) { if(strcmp(libname,"exec.library")==0) ao->libbase = *(struct Library**)4L; else ao->libbase = OpenLibrary(libname,libver); if(!ao->libbase) { err_setstr(AmigalibsError, "can't open library"); DECREF(ao); ao = NULL; } } return (object *)ao; }
/* ** CALL - perform library call */ static object * lib_call(amigalibobject *self, object *args) // call { object *dic; int LVO_value; ULONG regspec, orig_regspec; int pos=0; object *key, *value; /* the registers: */ ULONG reg[16]; if (!newgetargs(args, "(ii)O", &LVO_value, ®spec, &dic)) return NULL; if(!PyDict_Check(dic)) { err_setstr(TypeError, "2nd arg must be dictionary"); return NULL; } if(LVO_value>-30 || LVO_value%2) { err_setstr(ValueError, "illegal LVO value"); return NULL; } if(regspec<0 || regspec >0xFFFF) { err_setstr(ValueError, "illegal regspec"); return NULL; } orig_regspec=regspec; while(PyDict_Next(dic,&pos,&key,&value)) { int regnr = PyInt_AsLong(key); if(!PyInt_Check(key) || regnr<0 || regnr>15) { err_setstr(ValueError, "illegal key/regnr."); return NULL; } else { ULONG regval; if(!obj2reg(value,®val)) { err_setstr(ValueError, "illegal register value"); return NULL; } /* OK: the register `regnr' must get the value `regval' */ /* Check if register regnr indeed must get a value */ if(regspec & (1<<regnr)) { /* Yes, put value in register & clear register bit */ reg[regnr]=regval; regspec &= ~(1<<regnr); } else { err_setstr(ValueError, "registers not consistent with LVO spec"); return NULL; } } } /* Are there still registers to assign a value to? */ if(regspec) { err_setstr(ValueError, "too few arguments provided"); return NULL; } /* XXXX TODO: SHOULD PASS ARGUMENTS ALSO */ return newintobject( amigalibs_calllib(self->libbase, LVO_value,orig_regspec,reg)); }
/* Set a SV-specific error from svideo_errno and return NULL */ static object * sv_error() { err_setstr(SvError, svStrerror(svideo_errno)); return NULL; }