Changeset 3666:bae6cc157110 in roaraudio for libroaross


Ignore:
Timestamp:
04/04/10 23:38:53 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added support for static files

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroaross/libroaross.c

    r3665 r3666  
    105105#define HT_DMX        5 /* DMX512/DMX4Linux device */ 
    106106#define HT_VIO        6 /* General VIO object */ 
     107#define HT_STATIC     7 /* Static file */ 
    107108 
    108109struct session { 
     
    124125 size_t                readc, writec; 
    125126 size_t                pos; 
     127 union { 
     128  struct { 
     129   char * data; 
     130   size_t len; 
     131  } sf; 
     132 } userdata; 
    126133}; 
    127134 
     
    172179 
    173180 
     181static char _sf__dev_sndstat[] = 
     182 "Sound Driver:RoarAudio\n" 
     183 "Config options: 0\n" 
     184 "\n" 
     185 "Installed drivers:\n" 
     186 "Type 10: RoarAudio emulation\n" 
     187 "\n" 
     188 "Card config:\n" 
     189 "\n" 
     190 "Audio devices:\n" 
     191 "0: RoarAudio OSS emulation (DUPLEX)\n" 
     192 "\n" 
     193 "Midi devices:\n" 
     194 "0: RoarAudio OSS emulation MIDI\n" 
     195 "\n" 
     196 "Timers:\n" 
     197 "\n" 
     198 "Mixers:\n" 
     199 "0: RoarAudio OSS emulation Mixer\n" 
     200; 
     201 
    174202static struct devices { 
    175203  char * prefix; 
    176204  int type; 
     205  size_t len; 
     206  void * userdata; 
    177207} _device_list[] = { 
    178  {"/dev/dsp",           HT_WAVEFORM}, 
    179  {"/dev/audio",         HT_WAVEFORM}, 
    180  {"/dev/sound/dsp",     HT_WAVEFORM}, 
    181  {"/dev/sound/audio",   HT_WAVEFORM}, 
    182  {"/dev/mixer",         HT_MIXER}, 
    183  {"/dev/sound/mixer",   HT_MIXER}, 
    184  {"/dev/midi",          HT_MIDI}, 
    185  {"/dev/rmidi",         HT_MIDI}, 
    186  {"/dev/sound/midi",    HT_MIDI}, 
    187  {"/dev/sound/rmidi",   HT_MIDI}, 
    188  {"/dev/dmx",           HT_DMX}, 
    189  {"/dev/misc/dmx",      HT_DMX}, 
    190  {"/dev/dmxin",         HT_DMX}, 
    191  {"/dev/misc/dmxin",    HT_DMX}, 
     208 {"/dev/dsp",           HT_WAVEFORM,  0, NULL}, 
     209 {"/dev/audio",         HT_WAVEFORM,  0, NULL}, 
     210 {"/dev/sound/dsp",     HT_WAVEFORM,  0, NULL}, 
     211 {"/dev/sound/audio",   HT_WAVEFORM,  0, NULL}, 
     212 {"/dev/mixer",         HT_MIXER,     0, NULL}, 
     213 {"/dev/sound/mixer",   HT_MIXER,     0, NULL}, 
     214 {"/dev/midi",          HT_MIDI,      0, NULL}, 
     215 {"/dev/rmidi",         HT_MIDI,      0, NULL}, 
     216 {"/dev/sound/midi",    HT_MIDI,      0, NULL}, 
     217 {"/dev/sound/rmidi",   HT_MIDI,      0, NULL}, 
     218 {"/dev/dmx",           HT_DMX,       0, NULL}, 
     219 {"/dev/misc/dmx",      HT_DMX,       0, NULL}, 
     220 {"/dev/dmxin",         HT_DMX,       0, NULL}, 
     221 {"/dev/misc/dmxin",    HT_DMX,       0, NULL}, 
     222 {"/dev/sndstat",       HT_STATIC,    sizeof(_sf__dev_sndstat)-1, _sf__dev_sndstat}, 
    192223#ifdef ROAR_DEFAULT_OSS_DEV 
    193  {ROAR_DEFAULT_OSS_DEV, HT_WAVEFORM}, 
    194 #endif 
    195  {NULL, HT_NONE}, 
     224 {ROAR_DEFAULT_OSS_DEV, HT_WAVEFORM,  0, NULL}, 
     225#endif 
     226 {NULL, HT_NONE, 0, NULL}, 
    196227}; 
    197228 
     
    345376 handle->refc = 1; 
    346377 handle->session = session; 
    347  session->refc++; // TODO: better warp this 
     378 
     379 if ( session != NULL ) 
     380  session->refc++; // TODO: better warp this 
     381 
    348382 handle->type = HT_NONE; 
    349383 handle->stream_dir = ROAR_DIR_PLAY; 
     
    462496  return -2; 
    463497 
    464  if ( (session = _open_session(NULL, NULL)) == NULL ) { 
    465   ROAR_DBG("_open_file(pathname='%s', flags=0x%x) = -1", pathname, flags); 
    466   return -1; 
     498 if ( ptr->type == HT_STATIC || ptr->type == HT_VIO ) { // non-session handles 
     499  session = NULL; 
     500 } else { 
     501  if ( (session = _open_session(NULL, NULL)) == NULL ) { 
     502   ROAR_DBG("_open_file(pathname='%s', flags=0x%x) = -1", pathname, flags); 
     503   return -1; 
     504  } 
    467505 } 
    468506 
     
    489527      break; 
    490528     case HT_MIXER: 
     529     case HT_STATIC: 
    491530      break; 
    492531     default: 
     
    506545       handle->stream_dir = ROAR_DIR_LIGHT_IN; 
    507546      break; 
     547     case HT_MIXER: 
     548     case HT_STATIC: 
     549      break; 
    508550     default: 
    509551       ROAR_DBG("_open_file(pathname='%s', flags=0x%x) = -1", pathname, flags); 
     
    515557     case HT_WAVEFORM: 
    516558       handle->stream_dir = ROAR_DIR_BIDIR; 
     559      break; 
     560     case HT_MIXER: 
     561     case HT_STATIC: 
    517562      break; 
    518563     default: 
     
    539584    handle->stream.info.channels = 512; 
    540585    handle->stream.info.codec    = ROAR_CODEC_ROARDMX; 
     586   break; 
     587  case HT_STATIC: 
     588    handle->userdata.sf.len      = ptr->len; 
     589    handle->userdata.sf.data     = ptr->userdata; 
    541590   break; 
    542591 } 
     
    9861035 
    9871036 if ( (pointer = _get_pointer_by_fh(fd)) != NULL ) { 
     1037  ROAR_DBG("read(fd=%i, buf=%p, count=%lu) = ? // pointer read", fd, buf, (long unsigned int)count); 
     1038 
    9881039  switch (pointer->handle->type) { 
    9891040   case HT_STREAM: 
     
    10001051     return ret; 
    10011052    break; 
     1053   case HT_STATIC: 
     1054     ROAR_DBG("read(fd=%i, buf=%p, count=%lu) = ? // type=HT_STATIC", fd, buf, (long unsigned int)count); 
     1055     ret = pointer->handle->pos + count; // calc the end of the read 
     1056 
     1057     if ( ret > (ssize_t)pointer->handle->userdata.sf.len ) { 
     1058      count = pointer->handle->userdata.sf.len - pointer->handle->pos; 
     1059     } 
     1060 
     1061     memcpy(buf, pointer->handle->userdata.sf.data + pointer->handle->pos, count); 
     1062     pointer->handle->pos += count; 
     1063     return count; 
     1064    break; 
    10021065   default: 
    10031066     errno = EINVAL; 
     
    10121075off_t lseek(int fildes, off_t offset, int whence) { 
    10131076 struct pointer * pointer; 
     1077 ssize_t tmp; 
    10141078 
    10151079 _init(); 
     
    10351099   case HT_VIO: 
    10361100     return roar_vio_lseek(&(pointer->handle->stream_vio), offset, whence); 
     1101    break; 
     1102   case HT_STATIC: 
     1103     switch (whence) { 
     1104      case SEEK_SET: 
     1105        if ( offset < 0 || offset > (ssize_t)pointer->handle->userdata.sf.len ) { 
     1106         errno = EINVAL; 
     1107         return -1; 
     1108        } 
     1109        pointer->handle->pos  = offset; 
     1110       break; 
     1111      case SEEK_CUR: 
     1112        tmp = pointer->handle->pos + offset; 
     1113        if ( tmp < 0 || tmp > (ssize_t)pointer->handle->userdata.sf.len ) { 
     1114         errno = EINVAL; 
     1115         return -1; 
     1116        } 
     1117        pointer->handle->pos = tmp; 
     1118       break; 
     1119      case SEEK_END: 
     1120        tmp = pointer->handle->userdata.sf.len + offset; 
     1121        if ( tmp < 0 || tmp > (ssize_t)pointer->handle->userdata.sf.len ) { 
     1122         errno = EINVAL; 
     1123         return -1; 
     1124        } 
     1125        pointer->handle->pos = tmp; 
     1126       break; 
     1127      default: 
     1128        errno = EINVAL; 
     1129        return -1; 
     1130       break; 
     1131     } 
    10371132    break; 
    10381133   default: 
Note: See TracChangeset for help on using the changeset viewer.