Changeset 4905:3b98d0dc037b in roaraudio for libroar/buffer.c
- Timestamp:
- 05/05/11 11:30:38 (13 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroar/buffer.c
r4903 r4905 57 57 }; 58 58 59 #define _ckbuf(m) if ( buf == NULL || (m) ) { roar_err_set(ROAR_ERROR_FAULT); return -1; } 60 59 61 int roar_buffer_new_data (struct roar_buffer ** buf, size_t len, void ** data) { 60 62 void * bufdata; 63 int err; 61 64 62 65 if ((bufdata = roar_mm_malloc(len)) == NULL) { … … 65 68 66 69 if ( roar_buffer_new_no_ma(buf, len, bufdata) == -1 ) { 70 err = roar_error; 67 71 roar_mm_free(bufdata); 72 roar_err_set(err); 68 73 return -1; 69 74 } 70 75 71 76 if ( roar_buffer_set_flag(*buf, ROAR_BUFFER_FLAG_NOFREE, ROAR_BUFFER_RESET) == -1 ) { 77 err = roar_error; 72 78 roar_buffer_free(*buf); 73 79 roar_mm_free(bufdata); 80 roar_err_set(err); 74 81 return -1; 75 82 } … … 86 93 ROAR_DBG("buffer_new(buf=%p, len=%i) = ?", buf, len); 87 94 88 if ( buf == NULL || data == NULL ) 89 return -1; 95 _ckbuf(data == NULL) 90 96 91 97 if ((new = roar_mm_malloc(sizeof(struct roar_buffer))) == NULL) { … … 115 121 116 122 int roar_buffer_ref (struct roar_buffer * buf) { 117 if ( buf == NULL ) 118 return -1; 123 _ckbuf(0) 119 124 120 125 buf->refc++; … … 126 131 struct roar_buffer * next; 127 132 128 if ( buf == NULL ) 129 return -1; 133 _ckbuf(0) 130 134 131 135 if ( buf->refc == 0 ) { … … 159 163 if ( next != NULL ) 160 164 *next = NULL; 165 roar_err_set(ROAR_ERROR_FAULT); 161 166 return -1; 162 167 } … … 179 184 unsigned int deep = 0; 180 185 181 if ( buf == NULL ) 182 return -1; 186 _ckbuf(0) 183 187 184 188 ROAR_DBG("buffer_add(buf=%p, next=%p) = ?", buf, next); 185 189 186 if ( buf->flags & ROAR_BUFFER_FLAG_RING ) 187 return -1; 190 if ( buf->flags & ROAR_BUFFER_FLAG_RING ) { 191 roar_err_set(ROAR_ERROR_INVAL); 192 return -1; 193 } 188 194 189 195 if ( buf == next ) { 190 196 ROAR_ERR("buffer_add(*): both pointer are of the same destination, This is a error in the application"); 197 roar_err_set(ROAR_ERROR_INVAL); 191 198 return -1; 192 199 } … … 200 207 if ( buf == next ) { 201 208 ROAR_ERR("buffer_add(*): Can not add buffer: loop detected at deep %u. This is a error in the application", deep); 209 // why don't we return here? 202 210 } 203 211 } … … 211 219 212 220 int roar_buffer_clear_next (struct roar_buffer * buf) { 213 if ( buf == NULL ) 214 return -1; 221 _ckbuf(0) 215 222 216 223 buf->next = NULL; … … 220 227 221 228 int roar_buffer_get_next (struct roar_buffer * buf, struct roar_buffer ** next) { 222 if ( buf == NULL ) 223 return -1; 229 _ckbuf(0) 224 230 225 231 *next = buf->next; … … 231 237 struct roar_buffer * n; 232 238 233 if ( buf == NULL || len == 0 ) 234 return -1; 239 _ckbuf(0) 240 241 if ( len == 0 ) { 242 roar_err_set(ROAR_ERROR_RANGE); 243 return -1; 244 } 235 245 236 246 // just to be sure: … … 256 266 257 267 int roar_buffer_get_data (struct roar_buffer * buf, void ** data) { 258 if ( buf == NULL ) 259 return -1; 268 _ckbuf(0) 260 269 261 270 *data = buf->user_data; … … 265 274 266 275 int roar_buffer_set_offset (struct roar_buffer * buf, size_t off) { 267 if ( buf == NULL ) 268 return -1; 276 _ckbuf(0) 277 278 if ( off > buf->user_len ) { 279 roar_err_set(ROAR_ERROR_RANGE); 280 return -1; 281 } 269 282 270 283 buf->user_len -= off; … … 279 292 void * cd; 280 293 281 if ( len == NULL || buf == NULL || data == NULL ) { 282 ROAR_DBG("roar_buffer_shift_out(buf=%p, data=%p, len={%lu}) = -1 // Invalid input", buf, data, (unsigned long)*len); 283 return -1; 284 } 294 _ckbuf(len == NULL || data == NULL); 285 295 286 296 if ( *buf == NULL ) { 287 297 ROAR_DBG("roar_buffer_shift_out(buf=%p, data=%p, len={%lu}) = -1 // Invalid pointer to buffer ring", buf, data, (unsigned long)len); 298 roar_err_set(ROAR_ERROR_FAULT); 288 299 return -1; 289 300 } … … 338 349 339 350 int roar_buffer_set_meta (struct roar_buffer * buf, void * meta) { 340 if ( buf == NULL ) 341 return -1; 351 _ckbuf(0) 342 352 343 353 buf->meta.vp = meta; … … 347 357 348 358 int roar_buffer_get_meta (struct roar_buffer * buf, void ** meta) { 349 if ( buf == NULL || meta == NULL ) 350 return -1; 359 _ckbuf(meta == NULL) 351 360 352 361 *meta = buf->meta.vp; … … 356 365 357 366 int roar_buffer_set_meta_i32(struct roar_buffer * buf, int32_t meta) { 358 if ( buf == NULL ) 359 return -1; 367 _ckbuf(0) 360 368 361 369 buf->meta.i32 = meta; … … 365 373 366 374 int roar_buffer_get_meta_i32(struct roar_buffer * buf, int32_t * meta) { 367 if ( buf == NULL || meta == NULL ) 368 return -1; 375 _ckbuf(meta == NULL) 369 376 370 377 *meta = buf->meta.i32; … … 374 381 375 382 int roar_buffer_set_type (struct roar_buffer * buf, int type) { 376 if ( buf == NULL ) 377 return -1; 383 _ckbuf(0) 378 384 379 385 switch (type) { … … 383 389 break; 384 390 default: 391 roar_err_set(ROAR_ERROR_NOTSUP); 385 392 return -1; 386 393 } … … 392 399 393 400 int roar_buffer_get_type (struct roar_buffer * buf, int * type) { 394 if ( buf == NULL || type == NULL ) 395 return -1; 401 _ckbuf(type == NULL) 396 402 397 403 *type = buf->type; … … 404 410 void * newbuf; 405 411 406 if ( buf == NULL ) 407 return -1; 412 _ckbuf(0) 408 413 409 414 // handle specal case where user length is zero: … … 415 420 if ( len > buf->user_len ) { 416 421 // we can only enlage a buffer if it's one of our own memory segments 417 if ( buf->flags & ROAR_BUFFER_FLAG_NOFREE ) 422 if ( buf->flags & ROAR_BUFFER_FLAG_NOFREE ) { 423 roar_err_set(ROAR_ERROR_NOTSUP); 418 424 return -1; 425 } 419 426 420 427 totlen = buf->len - buf->user_len + len; … … 433 440 434 441 int roar_buffer_get_len (struct roar_buffer * buf, size_t * len) { 435 if ( buf == NULL ) 436 return -1; 442 _ckbuf(0) 437 443 438 444 *len = buf->user_len; … … 442 448 443 449 int roar_buffer_set_flag (struct roar_buffer * buf, int flag, int reset) { 444 if ( buf == NULL ) 445 return -1; 450 _ckbuf(0) 446 451 447 452 buf->flags |= flag; … … 454 459 455 460 int roar_buffer_get_flag (struct roar_buffer * buf, int flag) { 456 if ( buf == NULL ) 457 return -1; 461 _ckbuf(0) 458 462 459 463 return buf->flags & flag; … … 464 468 struct roar_buffer * new; 465 469 void * od, * nd; 470 int err; 471 472 _ckbuf(copy == NULL) 466 473 467 474 *copy = NULL; 468 475 469 while (cur ) {476 while (cur != NULL) { 470 477 if ( roar_buffer_new(&new, cur->user_len) == -1 ) { 478 err = roar_error; 471 479 roar_buffer_free(*copy); 480 roar_err_set(err); 472 481 return -1; 473 482 } … … 484 493 cur = cur->next; 485 494 } 495 486 496 return 0; 487 497 } 488 498 489 499 int roar_buffer_ring_stats (struct roar_buffer * buf, struct roar_buffer_stats * stats) { 490 if ( buf == NULL ) 491 return -1; 500 _ckbuf(0) 492 501 493 502 stats->parts = 0; … … 495 504 stats->memory_usage = 0; 496 505 497 while (buf ) {506 while (buf != NULL ) { 498 507 stats->parts++; 499 508 stats->bytes += buf->user_len; … … 511 520 size_t tmp; 512 521 522 _ckbuf(len == NULL) 523 513 524 if ( buf == NULL || len == NULL ) 514 525 return -1; 515 526 516 if ( data == NULL && *len != 0 ) 517 return -1; 518 519 if ( !(buf->flags & ROAR_BUFFER_FLAG_RING) ) 520 return -1; 527 if ( data == NULL && *len != 0 ) { 528 roar_err_set(ROAR_ERROR_FAULT); 529 return -1; 530 } 531 532 if ( !(buf->flags & ROAR_BUFFER_FLAG_RING) ) { 533 roar_err_set(ROAR_ERROR_TYPEMM); 534 return -1; 535 } 521 536 522 537 if ( *len == 0 ) … … 524 539 525 540 // we may handle this later: 526 if ( *len > buf->user_len ) 527 return -1; 541 if ( *len > buf->user_len ) { 542 roar_err_set(ROAR_ERROR_NOTSUP); 543 return -1; 544 } 528 545 529 546 if ( (buf->flags & ROAR_BUFFER_FLAG_FREE_RUNNING) ) { … … 593 610 return 0; 594 611 } 595 596 return -1; 597 } 598 612 } 613 614 roar_err_set(ROAR_ERROR_UNKNOWN); 599 615 return -1; 600 616 } … … 608 624 ROAR_DBG("roar_buffer_ring_write(buf=%p, data=%p, len=%p) = ?", buf, data, len); 609 625 610 if ( buf == NULL || len == NULL ) 611 return -1; 612 613 if ( data == NULL && *len != 0 ) 614 return -1; 615 616 if ( !(buf->flags & ROAR_BUFFER_FLAG_RING) ) 617 return -1; 626 _ckbuf(len == NULL) 627 628 if ( data == NULL && *len != 0 ) { 629 roar_err_set(ROAR_ERROR_FAULT); 630 return -1; 631 } 632 633 if ( !(buf->flags & ROAR_BUFFER_FLAG_RING) ) { 634 roar_err_set(ROAR_ERROR_TYPEMM); 635 return -1; 636 } 618 637 619 638 if ( *len == 0 ) … … 621 640 622 641 // we may handle this later: 623 if ( *len > buf->user_len ) 624 return -1; 642 if ( *len > buf->user_len ) { 643 roar_err_set(ROAR_ERROR_NOTSUP); 644 return -1; 645 } 625 646 626 647 if ( (buf->flags & ROAR_BUFFER_FLAG_FREE_RUNNING) ) { … … 702 723 return 0; 703 724 } 704 705 return -1; 706 } 707 725 } 726 727 roar_err_set(ROAR_ERROR_UNKNOWN); 708 728 return -1; 709 729 } … … 713 733 size_t have; 714 734 715 if ( buf == NULL ) 716 return -1; 717 718 if ( !(buf->flags & ROAR_BUFFER_FLAG_RING) ) 719 return -1; 735 _ckbuf(0) 736 737 if ( !(buf->flags & ROAR_BUFFER_FLAG_RING) ) { 738 roar_err_set(ROAR_ERROR_TYPEMM); 739 return -1; 740 } 720 741 721 742 ring = &(buf->meta.ring); … … 759 780 760 781 int roar_buffer_ring_reset(struct roar_buffer * buf) { 761 if ( buf == NULL ) 762 return -1; 763 764 if ( !(buf->flags & ROAR_BUFFER_FLAG_RING) ) 765 return -1; 782 _ckbuf(0) 783 784 if ( !(buf->flags & ROAR_BUFFER_FLAG_RING) ) { 785 roar_err_set(ROAR_ERROR_TYPEMM); 786 return -1; 787 } 766 788 767 789 buf->meta.ring.read_pos = buf->meta.ring.write_pos = 0;
Note: See TracChangeset
for help on using the changeset viewer.