Changeset 3480:4e3826267412 in roaraudio for libroarpulse


Ignore:
Timestamp:
02/14/10 05:31:56 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

use IO based indirect callbacks

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroarpulse/mainloop-signal.c

    r3473 r3480  
    5555 pa_mainloop_api * api; 
    5656 pa_signal_event sig[MAX_SIG]; 
     57 int pipefh[2]; 
     58 pa_io_event * io_event; 
    5759} _roar_pa_signal; 
    5860 
    5961static void _roar_pa_signal_handler (int sig) { 
    60  pa_signal_event * e; 
     62 write(_roar_pa_signal.pipefh[1], &sig, sizeof(sig)); 
     63} 
    6164 
    62  ROAR_DBG("_roar_pa_signal_handler(sig=%s(%i)) = ?", strsignal(sig), sig); 
     65static void _roar_pa_signal_iocb(pa_mainloop_api   * a, 
     66                                 pa_io_event       * e, 
     67                                 int                 fd, 
     68                                 pa_io_event_flags_t f, 
     69                                 void *userdata         ) { 
     70 pa_signal_event * se; 
     71 int sig; 
     72 size_t ret; 
     73 
     74 ret = read(fd, &sig, sizeof(sig)); 
     75 
     76 if ( ret != sizeof(sig) ) 
     77  return; 
    6378 
    6479 if ( sig >= MAX_SIG ) 
    6580  return; 
    6681 
    67  e = &(_roar_pa_signal.sig[sig]); 
     82 se = &(_roar_pa_signal.sig[sig]); 
    6883 
    69  if ( !e->used ) 
     84 if ( !se->used ) 
    7085  return; 
    7186 
    72  ROAR_DBG("_roar_pa_signal_handler(sig=%s(%i)): signal is used", strsignal(sig), sig); 
    73  
    74  ROAR_DBG("_roar_pa_signal_handler(sig=%s(%i)): callback at %p", strsignal(sig), sig, e->cb); 
    75  
    76  ROAR_DBG("_roar_pa_signal_handler(sig=%s(%i)): api=%p, userdata=%p", strsignal(sig), sig, _roar_pa_signal.api, e->userdata); 
    77  
    78  if ( e->cb != NULL ) 
    79   e->cb(_roar_pa_signal.api, e, sig, e->userdata); 
    80  
    81  ROAR_DBG("_roar_pa_signal_handler(sig=%s(%i)) = (void)", strsignal(sig), sig); 
     87 if ( se->cb != NULL ) 
     88  se->cb(_roar_pa_signal.api, se, sig, se->userdata); 
    8289} 
    8390 
     
    9299 _roar_pa_signal.api = api; 
    93100 
     101 if ( pipe(_roar_pa_signal.pipefh) == -1 ) 
     102  return -1; 
     103 
     104 _roar_pa_signal.io_event = api->io_new(api, _roar_pa_signal.pipefh[0], PA_IO_EVENT_INPUT, _roar_pa_signal_iocb, NULL); 
     105 
    94106 _roar_pa_signal_inited = 1; 
    95107 
     
    99111/** Cleanup the signal subsystem */ 
    100112void pa_signal_done(void) { 
     113 int i; 
     114 
     115 for (i = 0; i < MAX_SIG; i++) { 
     116  _roar_pa_signal.sig[i].used = 0; 
     117 } 
     118 
     119 _roar_pa_signal.api->io_free(_roar_pa_signal.io_event); 
     120 
    101121 _roar_pa_signal_inited = 0; 
    102122} 
Note: See TracChangeset for help on using the changeset viewer.