Changeset 3870:a1987a5a6824 in roaraudio


Ignore:
Timestamp:
05/20/10 19:44:48 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

use more general API, support tailing star in filenames

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroaross/libroaross.c

    r3868 r3870  
    215215  size_t len; 
    216216  void * userdata; 
     217  struct handle * (*open)(const char * file, int flags, mode_t mode, struct devices * ptr); 
    217218} _device_list[] = { 
    218  {"/dev/dsp",           HT_WAVEFORM,  0, NULL}, 
    219  {"/dev/audio",         HT_WAVEFORM,  0, NULL}, 
    220  {"/dev/sound/dsp",     HT_WAVEFORM,  0, NULL}, 
    221  {"/dev/sound/audio",   HT_WAVEFORM,  0, NULL}, 
    222  {"/dev/mixer",         HT_MIXER,     0, NULL}, 
    223  {"/dev/sound/mixer",   HT_MIXER,     0, NULL}, 
    224  {"/dev/midi",          HT_MIDI,      0, NULL}, 
    225  {"/dev/rmidi",         HT_MIDI,      0, NULL}, 
    226  {"/dev/sound/midi",    HT_MIDI,      0, NULL}, 
    227  {"/dev/sound/rmidi",   HT_MIDI,      0, NULL}, 
    228  {"/dev/dmx",           HT_DMX,       0, NULL}, 
    229  {"/dev/misc/dmx",      HT_DMX,       0, NULL}, 
    230  {"/dev/dmxin",         HT_DMX,       0, NULL}, 
    231  {"/dev/misc/dmxin",    HT_DMX,       0, NULL}, 
    232  {"/dev/sndstat",       HT_STATIC,    sizeof(_sf__dev_sndstat)-1, _sf__dev_sndstat}, 
     219 {"/dev/dsp*",          HT_WAVEFORM,  0, NULL, NULL}, 
     220 {"/dev/audio*",        HT_WAVEFORM,  0, NULL, NULL}, 
     221 {"/dev/sound/dsp*",    HT_WAVEFORM,  0, NULL, NULL}, 
     222 {"/dev/sound/audio*",  HT_WAVEFORM,  0, NULL, NULL}, 
     223 {"/dev/mixer*",        HT_MIXER,     0, NULL, NULL}, 
     224 {"/dev/sound/mixer*",  HT_MIXER,     0, NULL, NULL}, 
     225 {"/dev/midi*",         HT_MIDI,      0, NULL, NULL}, 
     226 {"/dev/rmidi*",        HT_MIDI,      0, NULL, NULL}, 
     227 {"/dev/sound/midi*",   HT_MIDI,      0, NULL, NULL}, 
     228 {"/dev/sound/rmidi*",  HT_MIDI,      0, NULL, NULL}, 
     229 {"/dev/dmx*",          HT_DMX,       0, NULL, NULL}, 
     230 {"/dev/misc/dmx*",     HT_DMX,       0, NULL, NULL}, 
     231 {"/dev/dmxin*",        HT_DMX,       0, NULL, NULL}, 
     232 {"/dev/misc/dmxin*",   HT_DMX,       0, NULL, NULL}, 
     233 {"/dev/sndstat",       HT_STATIC,    sizeof(_sf__dev_sndstat)-1, _sf__dev_sndstat, NULL}, 
    233234#ifdef ROAR_DEFAULT_OSS_DEV 
    234  {ROAR_DEFAULT_OSS_DEV, HT_WAVEFORM,  0, NULL}, 
    235 #endif 
    236  {NULL, HT_NONE, 0, NULL}, 
     235 {ROAR_DEFAULT_OSS_DEV, HT_WAVEFORM,  0, NULL, NULL}, 
     236#endif 
     237 {NULL, HT_NONE, 0, NULL, NULL}, 
    237238}; 
    238239 
     
    496497 
    497498// ------------------------------------- 
     499// central function to find device: 
     500// ------------------------------------- 
     501 
     502static struct devices * _get_device (const char * pathname) { 
     503 struct devices * ptr; 
     504 size_t len; 
     505 int i; 
     506 
     507 for (i = 0; _device_list[i].prefix != NULL; i++) { 
     508  len = strlen(_device_list[i].prefix); 
     509 
     510  if ( _device_list[i].prefix[len-1] == '*' ) { 
     511   len--; 
     512  } else { 
     513   len++; 
     514  } 
     515  if ( !strncmp(pathname, _device_list[i].prefix, len) ) { 
     516   ptr = &(_device_list[i]); 
     517  } 
     518 } 
     519 
     520 return NULL; 
     521} 
     522 
     523// ------------------------------------- 
    498524// central open function: 
    499525// ------------------------------------- 
     
    504530 struct pointer * pointer; 
    505531 struct devices * ptr = NULL; 
    506  int i; 
    507532 
    508533 ROAR_DBG("_open_file(pathname='%s', flags=0x%x) = ?", pathname, flags); 
     
    525550 } 
    526551 
    527  for (i = 0; _device_list[i].prefix != NULL; i++) { 
    528   if ( !strcmp(pathname, _device_list[i].prefix) ) { 
    529    ptr = &(_device_list[i]); 
    530   } 
    531  } 
    532  
    533  if ( ptr == NULL ) 
     552 if ( (ptr = _get_device(pathname)) == NULL ) 
    534553  return -2; 
    535554 
     
    543562 } 
    544563 
    545  if ( (handle = _open_handle(session)) == NULL ) { 
    546   _close_session(session); 
    547   ROAR_DBG("_open_file(pathname='%s', flags=0x%x) = -1", pathname, flags); 
    548   return -1; 
    549  } 
    550  
    551  handle->type        = ptr->type; 
    552  handle->sysio_flags = flags; 
    553  handle->stream_dir  = -1; 
     564 if ( ptr->open != NULL ) { 
     565  // TODO: Add support to pass mode (perms) to open. 
     566  if ( (handle = ptr->open(pathname, flags, 0000, ptr)) == NULL ) { 
     567   _close_session(session); 
     568   ROAR_DBG("_open_file(pathname='%s', flags=0x%x) = -1", pathname, flags); 
     569   return -1; 
     570  } 
     571 } else { 
     572  if ( (handle = _open_handle(session)) == NULL ) { 
     573   _close_session(session); 
     574   ROAR_DBG("_open_file(pathname='%s', flags=0x%x) = -1", pathname, flags); 
     575   return -1; 
     576  } 
     577 
     578  handle->type        = ptr->type; 
     579  handle->sysio_flags = flags; 
     580  handle->stream_dir  = -1; 
     581 } 
    554582 
    555583 switch (flags & _O_PARA_DIR) { 
     
    17801808int access(const char *pathname, int mode) { 
    17811809 struct devices * ptr = NULL; 
    1782  int i; 
    17831810 
    17841811 _init(); 
    17851812 
    1786  for (i = 0; _device_list[i].prefix != NULL; i++) { 
    1787   if ( !strcmp(pathname, _device_list[i].prefix) ) { 
    1788    ptr = &(_device_list[i]); 
    1789   } 
    1790  } 
    1791  
    1792  if ( ptr != NULL ) { 
     1813 if ( (ptr = _get_device(pathname)) != NULL ) { 
    17931814  // the only flag we do not support is +x, which means 
    17941815  // we need to reject all requets with X_OK. 
Note: See TracChangeset for help on using the changeset viewer.