Changeset 4626:bd2f6332d653 in roaraudio for libroar/vs.c
- Timestamp:
- 11/27/10 05:43:32 (13 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroar/vs.c
r4622 r4626 63 63 struct roar_vio_calls file_store; 64 64 struct roar_vio_calls * file; 65 struct roar_buffer * readring, * writering; 65 66 }; 66 67 … … 340 341 } 341 342 343 int roar_vs_buffer(roar_vs_t * vss, size_t buffer, int * error) { 344 _ckvss(-1); 345 346 if ( vss->flags & FLAG_BUFFERED ) 347 return -1; 348 349 if ( roar_buffer_ring_new(&(vss->readring), buffer, 0) == -1 ) { 350 _seterrre(); 351 return -1; 352 } 353 354 if ( roar_buffer_ring_new(&(vss->writering), buffer, 0) == -1 ) { 355 _seterrre(); 356 roar_buffer_free(vss->readring); 357 vss->readring = NULL; 358 return -1; 359 } 360 361 vss->flags |= FLAG_BUFFERED; 362 363 return 0; 364 } 365 342 366 int roar_vs_close(roar_vs_t * vss, int killit, int * error) { 343 367 if ( killit != ROAR_VS_TRUE && killit != ROAR_VS_FALSE ) { … … 353 377 roar_buffer_free(vss->writebuffer); 354 378 379 if ( vss->readring != NULL ) 380 roar_buffer_free(vss->readring); 381 if ( vss->writering != NULL ) 382 roar_buffer_free(vss->writering); 383 355 384 if ( vss->file != NULL && vss->flags & FLAG_CLOSEFILE ) 356 385 roar_vio_close(vss->file); … … 372 401 } 373 402 374 ssize_t roar_vs_write(roar_vs_t * vss, const void * buf, size_t len, int * error) { 375 ssize_t ret; 376 377 _ckvss(-1); 378 379 if ( !(vss->flags & FLAG_STREAM) ) { 380 _seterr(ROAR_ERROR_INVAL); 381 return -1; 382 } 383 384 _initerr(); 385 386 ret = roar_vio_write(&(vss->vio), (void*)buf, len); 403 static ssize_t roar_vs_write_direct(roar_vs_t * vss, const void * buf, size_t len, int * error) { 404 ssize_t ret = roar_vio_write(&(vss->vio), (void*)buf, len); 387 405 388 406 if ( ret == -1 ) { … … 400 418 } else { 401 419 vss->writec += ret; 420 } 421 422 return ret; 423 } 424 425 ssize_t roar_vs_write(roar_vs_t * vss, const void * buf, size_t len, int * error) { 426 ssize_t ret; 427 size_t writelen; 428 429 _ckvss(-1); 430 431 if ( !(vss->flags & FLAG_STREAM) ) { 432 _seterr(ROAR_ERROR_INVAL); 433 return -1; 434 } 435 436 _initerr(); 437 438 if ( vss->flags & FLAG_BUFFERED ) { 439 writelen = len; 440 441 if ( roar_buffer_ring_write(vss->writering, (void*)buf, &writelen) == -1 ) { 442 _seterrre(); 443 return -1; 444 } 445 446 ret = writelen; 447 vss->writec += ret; 448 } else { 449 ret = roar_vs_write_direct(vss, buf, len, error); 402 450 } 403 451 … … 905 953 int is_eof = 0; 906 954 void * data; 955 size_t tmp; 956 957 // TODO: fix error handling below. 907 958 908 959 _ckvss(-1); … … 938 989 // part 2 of above hack: 939 990 // emulate read handle. 940 vios[len].ud.vp = vss->file; 941 vios[len].eventsa = ROAR_VIO_SELECT_WRITE|ROAR_VIO_SELECT_READ;; 942 len++; 991 if ( vss->file != NULL ) { 992 vios[len].ud.vp = vss->file; 993 vios[len].eventsa = ROAR_VIO_SELECT_WRITE|ROAR_VIO_SELECT_READ; 994 len++; 995 } 943 996 944 997 // no error here nor EOF. … … 960 1013 } else if ( vios[i].ud.vp == vss->con ) { 961 1014 roar_sync(vss->con); 962 } else if ( v ios[i].ud.vp == vss->file ) {1015 } else if ( vss->file != NULL && vios[i].ud.vp == vss->file ) { 963 1016 if ( vios[i].eventsa & ROAR_VIO_SELECT_READ ) 964 1017 can_write++; … … 971 1024 } 972 1025 1026 if ( vss->flags & FLAG_BUFFERED ) { 1027 if ( roar_buffer_ring_avail(vss->readring, NULL, &tmp) != -1 ) 1028 if ( tmp > 0 ) 1029 can_read++; 1030 1031 if ( roar_buffer_ring_avail(vss->writering, &tmp, NULL) != -1 ) 1032 if ( tmp > 0 ) 1033 can_write++; 1034 } 1035 1036 ROAR_DBG("roar_vs_iterate(vss=%p, wait=%i, error=%p): can_read=%i, can_write=%i", vss, wait, error, can_read, can_write); 1037 973 1038 // TODO: FIXME: Need to correct error handling here! 974 1039 … … 980 1045 return -1; 981 1046 982 ret = roar_vs_write (vss, data, len, error);1047 ret = roar_vs_write_direct(vss, data, len, error); 983 1048 984 1049 if ( ret == -1 ) { … … 1034 1099 return -1; 1035 1100 1036 ret = roar_vio_write(vss->file, data, len); 1101 if ( vss->flags & FLAG_BUFFERED ) { 1102 tmp = len; 1103 if ( roar_buffer_ring_write(vss->readring, data, &tmp) == -1 ) { 1104 ret = -1; 1105 } else { 1106 ret = tmp; 1107 } 1108 } else { 1109 ret = roar_vio_write(vss->file, data, len); 1110 } 1037 1111 1038 1112 if ( ret == -1 ) { … … 1052 1126 return -1; 1053 1127 1054 ret = roar_vio_read(vss->file, data, len); 1128 if ( vss->flags & FLAG_BUFFERED ) { 1129 tmp = len; 1130 if ( roar_buffer_ring_read(vss->writering, data, &tmp) == -1 ) { 1131 ret = -1; 1132 } else { 1133 ret = tmp; 1134 } 1135 } else { 1136 ret = roar_vio_read(vss->file, data, len); 1137 } 1055 1138 1056 1139 ROAR_DBG("roar_vs_iterate(vss=%p, wait=%i, error=%p): ret=%lli", vss, wait, error, (long long int)ret); … … 1079 1162 ROAR_DBG("roar_vs_iterate(vss=%p, wait=%i, error=%p) = ?", vss, wait, error); 1080 1163 1081 ret = roar_vs_write (vss, data, len, error);1164 ret = roar_vs_write_direct(vss, data, len, error); 1082 1165 1083 1166 if ( ret == -1 ) { … … 1116 1199 } 1117 1200 1201 ssize_t roar_vs_get_avail_read(roar_vs_t * vss, int * error) { 1202 size_t len; 1203 1204 _ckvss(-1); 1205 1206 if ( !(vss->flags & FLAG_BUFFERED) ) { 1207 _seterr(ROAR_ERROR_INVAL); 1208 return -1; 1209 } 1210 1211 if ( roar_buffer_ring_avail(vss->readring, &len, NULL) == -1 ) { 1212 _seterrre(); 1213 return -1; 1214 } 1215 1216 return len; 1217 } 1218 1219 ssize_t roar_vs_get_avail_write(roar_vs_t * vss, int * error) { 1220 size_t len; 1221 1222 _ckvss(-1); 1223 1224 if ( !(vss->flags & FLAG_BUFFERED) ) { 1225 _seterr(ROAR_ERROR_INVAL); 1226 return -1; 1227 } 1228 1229 if ( roar_buffer_ring_avail(vss->writering, NULL, &len) == -1 ) { 1230 _seterrre(); 1231 return -1; 1232 } 1233 1234 return len; 1235 } 1236 1118 1237 int roar_vs_ctl (roar_vs_t * vss, roar_vs_ctlcmd cmd, void * argp, int * error) { 1119 1238 _ckvss(-1);
Note: See TracChangeset
for help on using the changeset viewer.