Changeset 3666:bae6cc157110 in roaraudio for libroaross
- Timestamp:
- 04/04/10 23:38:53 (14 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroaross/libroaross.c
r3665 r3666 105 105 #define HT_DMX 5 /* DMX512/DMX4Linux device */ 106 106 #define HT_VIO 6 /* General VIO object */ 107 #define HT_STATIC 7 /* Static file */ 107 108 108 109 struct session { … … 124 125 size_t readc, writec; 125 126 size_t pos; 127 union { 128 struct { 129 char * data; 130 size_t len; 131 } sf; 132 } userdata; 126 133 }; 127 134 … … 172 179 173 180 181 static 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 174 202 static struct devices { 175 203 char * prefix; 176 204 int type; 205 size_t len; 206 void * userdata; 177 207 } _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}, 192 223 #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}, 196 227 }; 197 228 … … 345 376 handle->refc = 1; 346 377 handle->session = session; 347 session->refc++; // TODO: better warp this 378 379 if ( session != NULL ) 380 session->refc++; // TODO: better warp this 381 348 382 handle->type = HT_NONE; 349 383 handle->stream_dir = ROAR_DIR_PLAY; … … 462 496 return -2; 463 497 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 } 467 505 } 468 506 … … 489 527 break; 490 528 case HT_MIXER: 529 case HT_STATIC: 491 530 break; 492 531 default: … … 506 545 handle->stream_dir = ROAR_DIR_LIGHT_IN; 507 546 break; 547 case HT_MIXER: 548 case HT_STATIC: 549 break; 508 550 default: 509 551 ROAR_DBG("_open_file(pathname='%s', flags=0x%x) = -1", pathname, flags); … … 515 557 case HT_WAVEFORM: 516 558 handle->stream_dir = ROAR_DIR_BIDIR; 559 break; 560 case HT_MIXER: 561 case HT_STATIC: 517 562 break; 518 563 default: … … 539 584 handle->stream.info.channels = 512; 540 585 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; 541 590 break; 542 591 } … … 986 1035 987 1036 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 988 1039 switch (pointer->handle->type) { 989 1040 case HT_STREAM: … … 1000 1051 return ret; 1001 1052 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; 1002 1065 default: 1003 1066 errno = EINVAL; … … 1012 1075 off_t lseek(int fildes, off_t offset, int whence) { 1013 1076 struct pointer * pointer; 1077 ssize_t tmp; 1014 1078 1015 1079 _init(); … … 1035 1099 case HT_VIO: 1036 1100 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 } 1037 1132 break; 1038 1133 default:
Note: See TracChangeset
for help on using the changeset viewer.