Changeset 803 for trunk/libffado/src/libutil/TimestampedBuffer.cpp
- Timestamp:
- 01/02/08 14:11:58 (16 years ago)
- Files:
-
- trunk/libffado/src/libutil/TimestampedBuffer.cpp (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/libffado/src/libutil/TimestampedBuffer.cpp
r796 r803 52 52 pthread_mutex_unlock(&m_framecounter_lock); \ 53 53 } 54 54 /* 55 #define POST_SEMAPHORE { \ 56 int tmp; \ 57 sem_getvalue(&m_frame_semaphore, &tmp); \ 58 debugWarning("posting semaphore from value %d\n", tmp); \ 59 sem_post(&m_frame_semaphore); \ 60 } 61 */ 62 63 //HACK 64 #define POST_SEMAPHORE { \ 65 if(m_update_period > 8) { \ 66 sem_post(&m_frame_semaphore); \ 67 } \ 68 } 55 69 namespace Util { 56 70 … … 77 91 ffado_ringbuffer_free(m_event_buffer); 78 92 free(m_cluster_buffer); 93 sem_destroy(&m_frame_semaphore); 79 94 } 80 95 … … 108 123 m_update_period=n; 109 124 return true; 125 } 126 127 /** 128 * \brief Get the nominal update period (in frames) 129 * 130 * Gets the nominal update period. This period is the number of frames 131 * between two timestamp updates (hence buffer writes) 132 * 133 * @return period in frames 134 */ 135 unsigned int TimestampedBuffer::getUpdatePeriod() { 136 return m_update_period; 110 137 } 111 138 … … 262 289 */ 263 290 bool TimestampedBuffer::init() { 291 if (sem_init(&m_frame_semaphore, 0, 0) == -1) { 292 debugError("Could not init frame semaphore"); 293 return false; 294 } 264 295 return true; 265 296 } … … 340 371 } 341 372 373 bool 374 TimestampedBuffer::waitForFrames(unsigned int nframes) 375 { 376 int result; 377 do { 378 unsigned int bufferfill = getBufferFill(); 379 if(bufferfill >= nframes) { 380 // first make the semaphore 0 381 while((result=sem_trywait(&m_frame_semaphore)) == 0) {}; 382 return true; 383 } else { 384 debugOutput(DEBUG_LEVEL_VERY_VERBOSE, 385 "only %d frames in buffer, waiting for more (%d)\n", 386 bufferfill, nframes); 387 } 388 } while((result=sem_wait(&m_frame_semaphore)) == 0); 389 debugOutput(DEBUG_LEVEL_VERBOSE, 390 "sem_wait returns: %d\n", 391 result); 392 return false; 393 } 394 395 bool 396 TimestampedBuffer::tryWaitForFrames(unsigned int nframes) 397 { 398 int result; 399 do { 400 unsigned int bufferfill = getBufferFill(); 401 if(bufferfill >= nframes) { 402 // first make the semaphore 0 403 while((result=sem_trywait(&m_frame_semaphore)) == 0) {}; 404 return true; 405 } else { 406 debugOutput(DEBUG_LEVEL_VERY_VERBOSE, 407 "only %d frames in buffer, waiting for more (%d)\n", 408 bufferfill, nframes); 409 } 410 } while((result=sem_trywait(&m_frame_semaphore)) == 0); 411 debugOutput(DEBUG_LEVEL_VERY_VERBOSE, 412 "sem_trywait returns: %d\n", 413 result); 414 return false; 415 } 416 417 bool 418 TimestampedBuffer::waitForFrames() 419 { 420 return waitForFrames(m_update_period); 421 } 422 423 bool 424 TimestampedBuffer::tryWaitForFrames() 425 { 426 return tryWaitForFrames(m_update_period); 427 } 428 429 342 430 /** 343 431 * @brief Insert a dummy frame to the head buffer … … 371 459 m_framecounter++; 372 460 EXIT_CRITICAL_SECTION; 373 461 462 POST_SEMAPHORE; 374 463 return true; 375 464 } … … 449 538 } 450 539 540 POST_SEMAPHORE; 451 541 return true; 452 542 } … … 1220 1310 // ts(x) = m_buffer_tail_timestamp + 1221 1311 // (m_buffer_next_tail_timestamp - m_buffer_tail_timestamp)/(samples_between_updates)*x 1222 1312 POST_SEMAPHORE; 1223 1313 } 1224 1314