Mercurial > hg > svcore
comparison base/RingBuffer.h @ 1527:710e6250a401 zoom
Merge from default branch
author | Chris Cannam |
---|---|
date | Mon, 17 Sep 2018 13:51:14 +0100 |
parents | 48e9f538e6e9 |
children | 66c1988fc906 |
comparison
equal
deleted
inserted
replaced
1324:d4a28d1479a8 | 1527:710e6250a401 |
---|---|
208 #endif | 208 #endif |
209 | 209 |
210 delete[] m_readers; | 210 delete[] m_readers; |
211 | 211 |
212 if (m_mlocked) { | 212 if (m_mlocked) { |
213 MUNLOCK((void *)m_buffer, m_size * sizeof(T)); | 213 MUNLOCK((void *)m_buffer, m_size * sizeof(T)); |
214 } | 214 } |
215 delete[] m_buffer; | 215 delete[] m_buffer; |
216 } | 216 } |
217 | 217 |
218 template <typename T, int N> | 218 template <typename T, int N> |
291 int | 291 int |
292 RingBuffer<T, N>::getWriteSpace() const | 292 RingBuffer<T, N>::getWriteSpace() const |
293 { | 293 { |
294 int space = 0; | 294 int space = 0; |
295 for (int i = 0; i < N; ++i) { | 295 for (int i = 0; i < N; ++i) { |
296 int here = (m_readers[i] + m_size - m_writer - 1) % m_size; | 296 int here = (m_readers[i] + m_size - m_writer - 1) % m_size; |
297 if (i == 0 || here < space) space = here; | 297 if (i == 0 || here < space) space = here; |
298 } | 298 } |
299 | 299 |
300 #ifdef DEBUG_RINGBUFFER | 300 #ifdef DEBUG_RINGBUFFER |
301 int rs(getReadSpace()), rp(m_readers[0]); | 301 int rs(getReadSpace()), rp(m_readers[0]); |
302 | 302 |
303 std::cerr << "RingBuffer: write space " << space << ", read space " | 303 std::cerr << "RingBuffer: write space " << space << ", read space " |
304 << rs << ", total " << (space + rs) << ", m_size " << m_size << std::endl; | 304 << rs << ", total " << (space + rs) << ", m_size " << m_size << std::endl; |
305 std::cerr << "RingBuffer: reader " << rp << ", writer " << m_writer << std::endl; | 305 std::cerr << "RingBuffer: reader " << rp << ", writer " << m_writer << std::endl; |
306 #endif | 306 #endif |
307 | 307 |
308 #ifdef DEBUG_RINGBUFFER | 308 #ifdef DEBUG_RINGBUFFER |
309 std::cerr << "RingBuffer<T," << N << ">[" << this << "]::getWriteSpace(): " << space << std::endl; | 309 std::cerr << "RingBuffer<T," << N << ">[" << this << "]::getWriteSpace(): " << space << std::endl; |
321 #endif | 321 #endif |
322 | 322 |
323 int available = getReadSpace(R); | 323 int available = getReadSpace(R); |
324 if (n > available) { | 324 if (n > available) { |
325 #ifdef DEBUG_RINGBUFFER | 325 #ifdef DEBUG_RINGBUFFER |
326 std::cerr << "WARNING: Only " << available << " samples available" | 326 std::cerr << "WARNING: Only " << available << " samples available" |
327 << std::endl; | 327 << std::endl; |
328 #endif | 328 #endif |
329 memset(destination + available, 0, (n - available) * sizeof(T)); | 329 memset(destination + available, 0, (n - available) * sizeof(T)); |
330 n = available; | 330 n = available; |
331 } | 331 } |
332 if (n == 0) return n; | 332 if (n == 0) return n; |
333 | 333 |
334 int here = m_size - m_readers[R]; | 334 int here = m_size - m_readers[R]; |
335 if (here >= n) { | 335 if (here >= n) { |
336 memcpy(destination, m_buffer + m_readers[R], n * sizeof(T)); | 336 memcpy(destination, m_buffer + m_readers[R], n * sizeof(T)); |
337 } else { | 337 } else { |
338 memcpy(destination, m_buffer + m_readers[R], here * sizeof(T)); | 338 memcpy(destination, m_buffer + m_readers[R], here * sizeof(T)); |
339 memcpy(destination + here, m_buffer, (n - here) * sizeof(T)); | 339 memcpy(destination + here, m_buffer, (n - here) * sizeof(T)); |
340 } | 340 } |
341 | 341 |
342 MBARRIER(); | 342 MBARRIER(); |
343 m_readers[R] = (m_readers[R] + n) % m_size; | 343 m_readers[R] = (m_readers[R] + n) % m_size; |
344 | 344 |
358 #endif | 358 #endif |
359 | 359 |
360 int available = getReadSpace(R); | 360 int available = getReadSpace(R); |
361 if (n > available) { | 361 if (n > available) { |
362 #ifdef DEBUG_RINGBUFFER | 362 #ifdef DEBUG_RINGBUFFER |
363 std::cerr << "WARNING: Only " << available << " samples available" | 363 std::cerr << "WARNING: Only " << available << " samples available" |
364 << std::endl; | 364 << std::endl; |
365 #endif | 365 #endif |
366 n = available; | 366 n = available; |
367 } | 367 } |
368 if (n == 0) return n; | 368 if (n == 0) return n; |
369 | 369 |
370 int here = m_size - m_readers[R]; | 370 int here = m_size - m_readers[R]; |
371 | 371 |
372 if (here >= n) { | 372 if (here >= n) { |
373 for (int i = 0; i < n; ++i) { | 373 for (int i = 0; i < n; ++i) { |
374 destination[i] += (m_buffer + m_readers[R])[i]; | 374 destination[i] += (m_buffer + m_readers[R])[i]; |
375 } | 375 } |
376 } else { | 376 } else { |
377 for (int i = 0; i < here; ++i) { | 377 for (int i = 0; i < here; ++i) { |
378 destination[i] += (m_buffer + m_readers[R])[i]; | 378 destination[i] += (m_buffer + m_readers[R])[i]; |
379 } | 379 } |
380 for (int i = 0; i < (n - here); ++i) { | 380 for (int i = 0; i < (n - here); ++i) { |
381 destination[i + here] += m_buffer[i]; | 381 destination[i + here] += m_buffer[i]; |
382 } | 382 } |
383 } | 383 } |
384 | 384 |
385 MBARRIER(); | 385 MBARRIER(); |
386 m_readers[R] = (m_readers[R] + n) % m_size; | 386 m_readers[R] = (m_readers[R] + n) % m_size; |
387 return n; | 387 return n; |
395 std::cerr << "RingBuffer<T," << N << ">[" << this << "]::readOne(" << R << ")" << std::endl; | 395 std::cerr << "RingBuffer<T," << N << ">[" << this << "]::readOne(" << R << ")" << std::endl; |
396 #endif | 396 #endif |
397 | 397 |
398 if (m_writer == m_readers[R]) { | 398 if (m_writer == m_readers[R]) { |
399 #ifdef DEBUG_RINGBUFFER | 399 #ifdef DEBUG_RINGBUFFER |
400 std::cerr << "WARNING: No sample available" | 400 std::cerr << "WARNING: No sample available" |
401 << std::endl; | 401 << std::endl; |
402 #endif | 402 #endif |
403 T t; | 403 T t; |
404 memset(&t, 0, sizeof(T)); | 404 memset(&t, 0, sizeof(T)); |
405 return t; | 405 return t; |
406 } | 406 } |
407 T value = m_buffer[m_readers[R]]; | 407 T value = m_buffer[m_readers[R]]; |
408 MBARRIER(); | 408 MBARRIER(); |
409 if (++m_readers[R] == m_size) m_readers[R] = 0; | 409 if (++m_readers[R] == m_size) m_readers[R] = 0; |
410 return value; | 410 return value; |
419 #endif | 419 #endif |
420 | 420 |
421 int available = getReadSpace(R); | 421 int available = getReadSpace(R); |
422 if (n > available) { | 422 if (n > available) { |
423 #ifdef DEBUG_RINGBUFFER | 423 #ifdef DEBUG_RINGBUFFER |
424 std::cerr << "WARNING: Only " << available << " samples available" | 424 std::cerr << "WARNING: Only " << available << " samples available" |
425 << std::endl; | 425 << std::endl; |
426 #endif | 426 #endif |
427 memset(destination + available, 0, (n - available) * sizeof(T)); | 427 memset(destination + available, 0, (n - available) * sizeof(T)); |
428 n = available; | 428 n = available; |
429 } | 429 } |
430 if (n == 0) return n; | 430 if (n == 0) return n; |
431 | 431 |
432 int here = m_size - m_readers[R]; | 432 int here = m_size - m_readers[R]; |
433 if (here >= n) { | 433 if (here >= n) { |
434 memcpy(destination, m_buffer + m_readers[R], n * sizeof(T)); | 434 memcpy(destination, m_buffer + m_readers[R], n * sizeof(T)); |
435 } else { | 435 } else { |
436 memcpy(destination, m_buffer + m_readers[R], here * sizeof(T)); | 436 memcpy(destination, m_buffer + m_readers[R], here * sizeof(T)); |
437 memcpy(destination + here, m_buffer, (n - here) * sizeof(T)); | 437 memcpy(destination + here, m_buffer, (n - here) * sizeof(T)); |
438 } | 438 } |
439 | 439 |
440 #ifdef DEBUG_RINGBUFFER | 440 #ifdef DEBUG_RINGBUFFER |
441 std::cerr << "RingBuffer<T," << N << ">[" << this << "]::peek: read " << n << std::endl; | 441 std::cerr << "RingBuffer<T," << N << ">[" << this << "]::peek: read " << n << std::endl; |
442 #endif | 442 #endif |
452 std::cerr << "RingBuffer<T," << N << ">[" << this << "]::peek(" << R << ")" << std::endl; | 452 std::cerr << "RingBuffer<T," << N << ">[" << this << "]::peek(" << R << ")" << std::endl; |
453 #endif | 453 #endif |
454 | 454 |
455 if (m_writer == m_readers[R]) { | 455 if (m_writer == m_readers[R]) { |
456 #ifdef DEBUG_RINGBUFFER | 456 #ifdef DEBUG_RINGBUFFER |
457 std::cerr << "WARNING: No sample available" | 457 std::cerr << "WARNING: No sample available" |
458 << std::endl; | 458 << std::endl; |
459 #endif | 459 #endif |
460 T t; | 460 T t; |
461 memset(&t, 0, sizeof(T)); | 461 memset(&t, 0, sizeof(T)); |
462 return t; | 462 return t; |
463 } | 463 } |
464 T value = m_buffer[m_readers[R]]; | 464 T value = m_buffer[m_readers[R]]; |
465 return value; | 465 return value; |
466 } | 466 } |
467 | 467 |
474 #endif | 474 #endif |
475 | 475 |
476 int available = getReadSpace(R); | 476 int available = getReadSpace(R); |
477 if (n > available) { | 477 if (n > available) { |
478 #ifdef DEBUG_RINGBUFFER | 478 #ifdef DEBUG_RINGBUFFER |
479 std::cerr << "WARNING: Only " << available << " samples available" | 479 std::cerr << "WARNING: Only " << available << " samples available" |
480 << std::endl; | 480 << std::endl; |
481 #endif | 481 #endif |
482 n = available; | 482 n = available; |
483 } | 483 } |
484 if (n == 0) return n; | 484 if (n == 0) return n; |
485 m_readers[R] = (m_readers[R] + n) % m_size; | 485 m_readers[R] = (m_readers[R] + n) % m_size; |
486 return n; | 486 return n; |
487 } | 487 } |
495 #endif | 495 #endif |
496 | 496 |
497 int available = getWriteSpace(); | 497 int available = getWriteSpace(); |
498 if (n > available) { | 498 if (n > available) { |
499 #ifdef DEBUG_RINGBUFFER | 499 #ifdef DEBUG_RINGBUFFER |
500 std::cerr << "WARNING: Only room for " << available << " samples" | 500 std::cerr << "WARNING: Only room for " << available << " samples" |
501 << std::endl; | 501 << std::endl; |
502 #endif | 502 #endif |
503 n = available; | 503 n = available; |
504 } | 504 } |
505 if (n == 0) return n; | 505 if (n == 0) return n; |
506 | 506 |
507 int here = m_size - m_writer; | 507 int here = m_size - m_writer; |
508 if (here >= n) { | 508 if (here >= n) { |
509 memcpy(m_buffer + m_writer, source, n * sizeof(T)); | 509 memcpy(m_buffer + m_writer, source, n * sizeof(T)); |
510 } else { | 510 } else { |
511 memcpy(m_buffer + m_writer, source, here * sizeof(T)); | 511 memcpy(m_buffer + m_writer, source, here * sizeof(T)); |
512 memcpy(m_buffer, source + here, (n - here) * sizeof(T)); | 512 memcpy(m_buffer, source + here, (n - here) * sizeof(T)); |
513 } | 513 } |
514 | 514 |
515 MBARRIER(); | 515 MBARRIER(); |
516 m_writer = (m_writer + n) % m_size; | 516 m_writer = (m_writer + n) % m_size; |
517 | 517 |
531 #endif | 531 #endif |
532 | 532 |
533 int available = getWriteSpace(); | 533 int available = getWriteSpace(); |
534 if (n > available) { | 534 if (n > available) { |
535 #ifdef DEBUG_RINGBUFFER | 535 #ifdef DEBUG_RINGBUFFER |
536 std::cerr << "WARNING: Only room for " << available << " samples" | 536 std::cerr << "WARNING: Only room for " << available << " samples" |
537 << std::endl; | 537 << std::endl; |
538 #endif | 538 #endif |
539 n = available; | 539 n = available; |
540 } | 540 } |
541 if (n == 0) return n; | 541 if (n == 0) return n; |
542 | 542 |
543 int here = m_size - m_writer; | 543 int here = m_size - m_writer; |
544 if (here >= n) { | 544 if (here >= n) { |
545 memset(m_buffer + m_writer, 0, n * sizeof(T)); | 545 memset(m_buffer + m_writer, 0, n * sizeof(T)); |
546 } else { | 546 } else { |
547 memset(m_buffer + m_writer, 0, here * sizeof(T)); | 547 memset(m_buffer + m_writer, 0, here * sizeof(T)); |
548 memset(m_buffer, 0, (n - here) * sizeof(T)); | 548 memset(m_buffer, 0, (n - here) * sizeof(T)); |
549 } | 549 } |
550 | 550 |
551 MBARRIER(); | 551 MBARRIER(); |
552 m_writer = (m_writer + n) % m_size; | 552 m_writer = (m_writer + n) % m_size; |
553 return n; | 553 return n; |