fixed periodic plop noise that happend about every second

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@4565 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
beveloper
2003-09-08 19:33:23 +00:00
parent f2f96e6f06
commit 23d4209d29
+17 -9
View File
@@ -21,15 +21,19 @@
namespace BPrivate { namespace media { namespace BPrivate { namespace media {
struct TimeSourceTransmit // sizeof() must be <= 4096 #define _atomic_read(p) atomic_or((p), 0)
#define TS_AREA_SIZE B_PAGE_SIZE // must be multiple of page size
#define TS_INDEX_COUNT 128 // must be power of two
struct TimeSourceTransmit // sizeof(TimeSourceTransmit) must be <= TS_AREA_SIZE
{ {
#define INDEX_COUNT 128
int32 readindex; int32 readindex;
int32 writeindex; int32 writeindex;
int32 isrunning; int32 isrunning;
bigtime_t realtime[INDEX_COUNT]; bigtime_t realtime[TS_INDEX_COUNT];
bigtime_t perftime[INDEX_COUNT]; bigtime_t perftime[TS_INDEX_COUNT];
float drift[INDEX_COUNT]; float drift[TS_INDEX_COUNT];
}; };
struct SlaveNodes struct SlaveNodes
@@ -158,7 +162,8 @@ BTimeSource::GetTime(bigtime_t *performance_time,
// } // }
int32 index; int32 index;
index = atomic_and(&fBuf->readindex, INDEX_COUNT - 1); index = _atomic_read(&fBuf->readindex);
index &= (TS_INDEX_COUNT - 1);
*real_time = fBuf->realtime[index]; *real_time = fBuf->realtime[index];
*performance_time = fBuf->perftime[index]; *performance_time = fBuf->perftime[index];
*drift = fBuf->drift[index]; *drift = fBuf->drift[index];
@@ -288,13 +293,14 @@ BTimeSource::PublishTime(bigtime_t performance_time,
} }
int32 index; int32 index;
index = atomic_add(&fBuf->writeindex, 1) & (INDEX_COUNT - 1); index = atomic_add(&fBuf->writeindex, 1);
index &= (TS_INDEX_COUNT - 1);
fBuf->realtime[index] = real_time; fBuf->realtime[index] = real_time;
fBuf->perftime[index] = performance_time; fBuf->perftime[index] = performance_time;
fBuf->drift[index] = drift; fBuf->drift[index] = drift;
atomic_add(&fBuf->readindex, 1); atomic_add(&fBuf->readindex, 1);
//printf("BTimeSource::PublishTime timesource %ld, index %ld, perf %16Ld, real %16Ld, drift %2.2f\n", ID(), fBuf->readindex, performance_time, real_time, drift); // printf("BTimeSource::PublishTime timesource %ld, write index %ld, perf %16Ld, real %16Ld, drift %2.2f\n", ID(), index, performance_time, real_time, drift);
} }
@@ -305,6 +311,8 @@ BTimeSource::BroadcastTimeWarp(bigtime_t at_real_time,
CALLED(); CALLED();
// calls BMediaNode::TimeWarp() of all slaved nodes // calls BMediaNode::TimeWarp() of all slaved nodes
TRACE("BTimeSource::BroadcastTimeWarp: at_real_time %Ld, new_performance_time %Ld\n", at_real_time, new_performance_time);
BAutolock lock(fSlaveNodes->locker); BAutolock lock(fSlaveNodes->locker);
for (int i = 0, n = 0; i < SLAVE_NODES_COUNT && n != fSlaveNodes->count; i++) { for (int i = 0, n = 0; i < SLAVE_NODES_COUNT && n != fSlaveNodes->count; i++) {
@@ -403,7 +411,7 @@ BTimeSource::FinishCreate()
char name[32]; char name[32];
sprintf(name, "__timesource_buf_%ld", ID()); sprintf(name, "__timesource_buf_%ld", ID());
fArea = create_area(name, reinterpret_cast<void **>(const_cast<BPrivate::media::TimeSourceTransmit **>(&fBuf)), B_ANY_ADDRESS, B_PAGE_SIZE, B_FULL_LOCK, B_READ_AREA | B_WRITE_AREA); fArea = create_area(name, reinterpret_cast<void **>(const_cast<BPrivate::media::TimeSourceTransmit **>(&fBuf)), B_ANY_ADDRESS, TS_AREA_SIZE, B_FULL_LOCK, B_READ_AREA | B_WRITE_AREA);
if (fArea <= 0) { if (fArea <= 0) {
ERROR("BTimeSource::BTimeSource couldn't create area, node %ld\n", ID()); ERROR("BTimeSource::BTimeSource couldn't create area, node %ld\n", ID());
fBuf = NULL; fBuf = NULL;