• [^] # Re: Beep en python

    Posté par (site web personnel) . En réponse au journal Tuner, un accordeur de guitare en python / GTK. Évalué à 1. Dernière modification le 13 mars 2012 à 23:02.

    Tient, sinon une autre solution marrante, avec ctypes.

    a) tu compiles un .so à partir de beep :

    gcc -shared beep.c -o beep.so
    
    

    b) tu fais un programme python qui fait le boulot en chargeant le module .so

    import ctypes
    class beep_parms_t(ctypes.Structure):
     _fields_ = [
     ('freq', ctypes.c_float),
     ('length', ctypes.c_int),
     ('reps', ctypes.c_int),
     ('delay', ctypes.c_int),
     ('end_delay', ctypes.c_int),
     ('stdin_beep', ctypes.c_int),
     ('verbose', ctypes.c_int),
     ('next', ctypes.c_void_p),
     ]
    # load the beep library
    lib = ctypes.CDLL('./beep.so')
    lib.play_beep.argtypes = (beep_parms_t, )
    def beep(frequency=440.0,
     length=200,
     reps=1,
     delay=100,
     end_delay=False,
     stdin_beep=False,
     verbose=False):
     '''
     Play a beep.
     '''
     param = beep_parms_t()
     param.freq = frequency
     param.length = length
     param.reps = reps
     param.delay = delay
     param.end_delay = end_delay
     param.stdin_beep = stdin_beep
     param.verbose = verbose
     param.next = None
     lib.play_beep(param)
    # usage simple
    beep()
    beep(frequency=500, reps=2)
    
    

    c) A toi de gérer le cas ou les choses tournent mal avec ton programme (ie, signal handler/atexit/…)

    (edit) Et en fait il semblerait que cela se passe bien, parce que lorsque le processus ferme le descripteur de fichier du beep, le système arrête le beep (mais dans ce cas là, à quoi sert le handler de signal dans beep.c ?)