time sources now publish and retrieve timing information

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2372 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
beveloper
2003-01-06 23:11:18 +00:00
parent aac800c2d1
commit 0e21b167c9
9 changed files with 251 additions and 95 deletions
+11 -6
View File
@@ -17,8 +17,12 @@
class _BSlaveNodeStorageP;
struct _time_transmit_buf;
namespace BPrivate { namespace media { class TimeSourceObject; class SystemTimeSourceObject; } }
namespace BPrivate { namespace media {
class TimeSourceObject;
class SystemTimeSourceObject;
struct TimeSourceTransmit;
} }
class BTimeSource :
@@ -118,13 +122,14 @@ virtual status_t _Reserved_TimeSource_4(void *);
virtual status_t _Reserved_TimeSource_5(void *);
bool fStopped;
area_id _mArea;
volatile _time_transmit_buf * _mBuf;
area_id fArea;
volatile BPrivate::media::TimeSourceTransmit *fBuf;
_BSlaveNodeStorageP * _mSlaveNodes;
area_id _mOrigArea;
uint32 _reserved_time_source_[11];
bool fIsRealtime;
bool _reserved_bool_[3];
uint32 _reserved_time_source_[10];
explicit BTimeSource(
media_node_id id);
+12 -4
View File
@@ -202,6 +202,8 @@ BMediaNode::TimeSource() const
self->fTimeSource = roster->MakeTimeSourceFor(clone);
if (fTimeSource == 0) {
FATAL("BMediaNode::TimeSource: Error, MakeTimeSourceFor failed\n");
} else {
fTimeSource->AddMe(self);
}
rv = roster->ReleaseNode(clone);
if (fTimeSource == 0) {
@@ -471,8 +473,11 @@ BMediaNode::SetTimeSource(BTimeSource *time_source)
newnode->Release();
return;
}
if (fTimeSource)
if (fTimeSource) {
fTimeSource->RemoveMe(this);
fTimeSource->Release();
newsource->AddMe(this);
}
fTimeSource = newsource;
}
@@ -490,6 +495,7 @@ BMediaNode::HandleMessage(int32 message,
case NODE_START:
{
const node_start_command *command = static_cast<const node_start_command *>(data);
printf("NODE_START, node %ld\n", fNodeID);
Start(command->performance_time);
return B_OK;
}
@@ -497,6 +503,7 @@ BMediaNode::HandleMessage(int32 message,
case NODE_STOP:
{
const node_stop_command *command = static_cast<const node_stop_command *>(data);
printf("NODE_STOP, node %ld\n", fNodeID);
Stop(command->performance_time, command->immediate);
return B_OK;
}
@@ -504,6 +511,7 @@ BMediaNode::HandleMessage(int32 message,
case NODE_SEEK:
{
const node_seek_command *command = static_cast<const node_seek_command *>(data);
printf("NODE_SEEK, node %ld\n", fNodeID);
Seek(command->media_time, command->performance_time);
return B_OK;
}
@@ -531,12 +539,12 @@ BMediaNode::HandleMessage(int32 message,
case NODE_SET_TIMESOURCE:
{
printf("NODE_SET_TIMESOURCE enter\n");
const node_set_timesource_command *command = static_cast<const node_set_timesource_command *>(data);
BMediaRoster *roster;
BTimeSource *newsource;
media_node clone;
status_t rv;
printf("NODE_SET_TIMESOURCE, node %ld, timesource %ld\n", fNodeID, command->timesource_id);
roster = BMediaRoster::Roster();
rv = roster->GetNodeFor(command->timesource_id, &clone);
if (rv != B_OK) {
@@ -551,13 +559,14 @@ BMediaNode::HandleMessage(int32 message,
}
roster->ReleaseNode(clone);
if (fTimeSource) {
fTimeSource->RemoveMe(this);
fTimeSource->Release();
fTimeSource = newsource;
SetTimeSource(fTimeSource);
} else {
fTimeSource = newsource;
}
printf("NODE_SET_TIMESOURCE leave\n");
fTimeSource->AddMe(this);
return B_OK;
}
@@ -793,7 +802,6 @@ BMediaNode::_InitObject(const char *name, media_node_id id, uint64 kinds)
_mChangeCount = 0; // deprecated
_mChangeCountReserved = 0; // deprecated
fKinds = kinds;
// fTimeSourceID = -1;
fProducerThis = 0;
fConsumerThis = 0;
fFileInterfaceThis = 0;
+57 -13
View File
@@ -438,12 +438,24 @@ BTimeSource *
BMediaRoster::MakeTimeSourceFor(const media_node & for_node)
{
CALLED();
printf("BMediaRoster::MakeTimeSourceFor enter, node %ld, port %ld, kind %#lx\n", for_node.node, for_node.port, for_node.kind);
BTimeSource *source = _TimeSourceObjectManager->GetTimeSource(for_node);
BTimeSource *source;
printf("BMediaRoster::MakeTimeSourceFor leave, node %ld, port %ld, kind %#lx\n", source->Node().node, source->Node().port, source->Node().kind);
// printf("BMediaRoster::MakeTimeSourceFor enter, node %ld, port %ld, kind %#lx\n", for_node.node, for_node.port, for_node.kind);
if (0 == (for_node.kind & B_TIME_SOURCE)) {
FATAL("BMediaRoster::MakeTimeSourceFor, node %ld is not a timesource!\n", for_node.node);
// XXX It appears that Cortex calls this function on every node, and expects
// XXX to be returned a system time source if the for_node is not a timesource
media_node clone;
GetSystemTimeSource(&clone);
source = _TimeSourceObjectManager->GetTimeSource(clone);
ReleaseNode(clone);
} else {
source = _TimeSourceObjectManager->GetTimeSource(for_node);
}
// printf("BMediaRoster::MakeTimeSourceFor leave, node %ld, port %ld, kind %#lx\n", source->Node().node, source->Node().port, source->Node().kind);
return source;
}
@@ -673,6 +685,8 @@ BMediaRoster::StartNode(const media_node & node,
CALLED();
if (node.node <= 0)
return B_MEDIA_BAD_NODE;
printf("BMediaRoster::StartNode, node %ld, at perf %Ld\n", node.node, at_performance_time);
node_start_command command;
command.performance_time = at_performance_time;
@@ -690,6 +704,8 @@ BMediaRoster::StopNode(const media_node & node,
if (node.node <= 0)
return B_MEDIA_BAD_NODE;
printf("BMediaRoster::StopNode, node %ld, at perf %Ld %s\n", node.node, at_performance_time, immediate ? "NOW" : "");
node_stop_command command;
command.performance_time = at_performance_time;
command.immediate = immediate;
@@ -707,6 +723,8 @@ BMediaRoster::SeekNode(const media_node & node,
if (node.node <= 0)
return B_MEDIA_BAD_NODE;
printf("BMediaRoster::SeekNode, node %ld, at perf %Ld, to perf %Ld\n", node.node, at_performance_time, to_media_time);
node_seek_command command;
command.media_time = to_media_time;
command.performance_time = at_performance_time;
@@ -720,10 +738,16 @@ BMediaRoster::StartTimeSource(const media_node & node,
bigtime_t at_real_time)
{
CALLED();
if (node.node <= 0)
if (node.node <= 0) {
FATAL("BMediaRoster::StartTimeSource node invalid\n");
return B_MEDIA_BAD_NODE;
if ((node.kind & B_TIME_SOURCE) == 0)
}
if ((node.kind & B_TIME_SOURCE) == 0) {
FATAL("BMediaRoster::StartTimeSource node is no timesource invalid\n");
return B_MEDIA_BAD_NODE;
}
printf("BMediaRoster::StartTimeSource, node %ld, at real %Ld\n", node.node, at_real_time);
BTimeSource::time_source_op_info msg;
msg.op = BTimeSource::B_TIMESOURCE_START;
@@ -739,10 +763,16 @@ BMediaRoster::StopTimeSource(const media_node & node,
bool immediate)
{
CALLED();
if (node.node <= 0)
if (node.node <= 0) {
FATAL("BMediaRoster::StartTimeSource node invalid\n");
return B_MEDIA_BAD_NODE;
if ((node.kind & B_TIME_SOURCE) == 0)
}
if ((node.kind & B_TIME_SOURCE) == 0) {
FATAL("BMediaRoster::StartTimeSource node is no timesource invalid\n");
return B_MEDIA_BAD_NODE;
}
printf("BMediaRoster::StopTimeSource, node %ld, at real %Ld %s\n", node.node, at_real_time, immediate ? "NOW" : "");
BTimeSource::time_source_op_info msg;
msg.op = immediate ? BTimeSource::B_TIMESOURCE_STOP_IMMEDIATELY : BTimeSource::B_TIMESOURCE_STOP;
@@ -758,11 +788,17 @@ BMediaRoster::SeekTimeSource(const media_node & node,
bigtime_t at_real_time)
{
CALLED();
if (node.node <= 0)
if (node.node <= 0) {
FATAL("BMediaRoster::StartTimeSource node invalid\n");
return B_MEDIA_BAD_NODE;
if ((node.kind & B_TIME_SOURCE) == 0)
}
if ((node.kind & B_TIME_SOURCE) == 0) {
FATAL("BMediaRoster::StartTimeSource node is no timesource invalid\n");
return B_MEDIA_BAD_NODE;
}
printf("BMediaRoster::SeekTimeSource, node %ld, at real %Ld, to perf %Ld\n", node.node, at_real_time, to_performance_time);
BTimeSource::time_source_op_info msg;
msg.op = BTimeSource::B_TIMESOURCE_SEEK;
msg.real_time = at_real_time;
@@ -1324,6 +1360,14 @@ BMediaRoster::RegisterNode(BMediaNode * node)
// call the callback
node->NodeRegistered();
// if the BMediaNode also inherits from BTimeSource, we need to call BTimeSource::FinishCreate()
if (node->Kinds() & B_TIME_SOURCE) {
BTimeSource *ts;
ts = dynamic_cast<BTimeSource *>(node);
if (ts)
ts->FinishCreate();
}
/*
// register existing inputs and outputs with the
@@ -1731,7 +1775,7 @@ BMediaRoster::GetLatencyFor(const media_node & producer,
bigtime_t * out_latency)
{
UNIMPLEMENTED();
*out_latency = 25000;
*out_latency = 2000;
return B_OK;
}
@@ -1742,7 +1786,7 @@ BMediaRoster::GetInitialLatencyFor(const media_node & producer,
uint32 * out_flags /* = NULL */)
{
UNIMPLEMENTED();
*out_latency = 10000;
*out_latency = 1000;
if (out_flags)
*out_flags = 0;
return B_OK;
+151 -27
View File
@@ -8,10 +8,20 @@
#include "DataExchange.h"
#include "ServerInterface.h"
// XXX This BTimeSource only works for realtime, nothing else is implemented
namespace BPrivate { namespace media {
struct TimeSourceTransmit
{
#define INDEX_COUNT 128
int32 readindex;
int32 writeindex;
bigtime_t realtime[INDEX_COUNT];
bigtime_t perftime[INDEX_COUNT];
float drift[INDEX_COUNT];
};
} }
// XXX The bebook says that the latency is always calculated in realtime
// XXX This is not currently done in this code
/*************************************************************
* protected BTimeSource
@@ -20,6 +30,8 @@
BTimeSource::~BTimeSource()
{
CALLED();
if (fArea > 0)
delete_area(fArea);
}
/*************************************************************
@@ -32,8 +44,13 @@ BTimeSource::SnoozeUntil(bigtime_t performance_time,
bool retry_signals)
{
CALLED();
return B_ERROR;
bigtime_t time;
status_t err;
do {
time = RealTimeFor(performance_time, with_latency);
err = snooze_until(time, B_SYSTEM_TIMEBASE);
} while (err == B_INTERRUPTED && retry_signals);
return err;
}
@@ -49,13 +66,14 @@ bigtime_t
BTimeSource::PerformanceTimeFor(bigtime_t real_time)
{
CALLED();
bigtime_t performanceTime;
float drift;
bigtime_t last_perf_time;
bigtime_t last_real_time;
float last_drift;
while (GetTime(&performanceTime, &real_time, &drift) != B_OK)
snooze(1000);
while (GetTime(&last_perf_time, &last_real_time, &last_drift) != B_OK)
snooze(1);
return (bigtime_t)(performanceTime + (RealTime() - real_time) * drift);
return (bigtime_t)(last_perf_time + (real_time - last_real_time) * last_drift);
}
@@ -65,7 +83,18 @@ BTimeSource::RealTimeFor(bigtime_t performance_time,
{
CALLED();
return performance_time - with_latency;
if (fIsRealtime) {
return performance_time - with_latency;
}
bigtime_t last_perf_time;
bigtime_t last_real_time;
float last_drift;
while (GetTime(&last_perf_time, &last_real_time, &last_drift) != B_OK)
snooze(1);
return (bigtime_t)(last_real_time + (performance_time - last_perf_time) / last_drift) - with_latency;
}
@@ -73,6 +102,7 @@ bool
BTimeSource::IsRunning()
{
CALLED();
printf("BTimeSource::IsRunning() node %ld, port %ld, %s\n", fNodeID, fControlPort, fStopped ? "no" : "yes");
return !fStopped;
}
@@ -83,9 +113,32 @@ BTimeSource::GetTime(bigtime_t *performance_time,
float *drift)
{
CALLED();
*performance_time = *real_time;
*drift = 1.0f;
if (fIsRealtime) {
*performance_time = *real_time = system_time();
*drift = 1.0f;
return B_OK;
}
// if (fBuf == 0) {
// FATAL("BTimeSource::GetTime: fBuf == 0, name %s, id %ld\n",Name(),ID());
// *performance_time = *real_time = system_time();
// *drift = 1.0f;
// return B_OK;
// }
int32 index;
index = atomic_and(&fBuf->readindex, INDEX_COUNT - 1);
*real_time = fBuf->realtime[index];
*performance_time = fBuf->perftime[index];
*drift = fBuf->drift[index];
// if (*real_time == 0) {
// *performance_time = *real_time = system_time();
// *drift = 1.0f;
// return B_OK;
// }
printf("BTimeSource::GetTime timesource %ld, perf %16Ld, real %16Ld, drift %2.2f\n", ID(), *performance_time, *real_time, *drift);
return B_OK;
}
@@ -112,31 +165,55 @@ BTimeSource::GetStartLatency(bigtime_t *out_latency)
BTimeSource::BTimeSource() :
BMediaNode("called by BTimeSource"),
fStopped(false)
BMediaNode("This one is never called"),
fStopped(false),
fArea(-1),
fBuf(NULL),
fIsRealtime(false)
{
CALLED();
AddNodeKind(B_TIME_SOURCE);
// printf("##### BTimeSource::BTimeSource() name %s, id %ld\n", Name(), ID());
// This constructor is only called by real time sources that inherit
// BTimeSource. We create the communication area in FinishCreate(),
// since we don't have a correct ID() until this node is registered.
}
status_t
BTimeSource::HandleMessage(int32 message,
const void *data,
const void *rawdata,
size_t size)
{
INFO("BTimeSource::HandleMessage %#lx, node %ld\n", message, fNodeID);
switch (message) {
case TIMESOURCE_OP:
{
const time_source_op_info *data = static_cast<const time_source_op_info *>(data);
const time_source_op_info *data = static_cast<const time_source_op_info *>(rawdata);
switch (data->op) {
case B_TIMESOURCE_START:
DirectStart(data->real_time);
break;
case B_TIMESOURCE_STOP:
DirectStop(data->real_time, false);
break;
case B_TIMESOURCE_STOP_IMMEDIATELY:
DirectStop(data->real_time, true);
break;
case B_TIMESOURCE_SEEK:
DirectSeek(data->performance_time, data->real_time);
break;
}
status_t result;
result = TimeSourceOp(*data, NULL);
if (result != B_OK) {
FATAL("BTimeSource::HandleMessage: TimeSourceOp failed\n");
}
return B_OK;
}
};
}
return B_ERROR;
}
@@ -146,7 +223,16 @@ BTimeSource::PublishTime(bigtime_t performance_time,
bigtime_t real_time,
float drift)
{
// UNIMPLEMENTED(); //XXX
printf("BTimeSource::PublishTime timesource %ld, perf %16Ld, real %16Ld, drift %2.2f\n", ID(), performance_time, real_time, drift);
if (0 == fBuf)
return;
int32 index;
index = atomic_add(&fBuf->writeindex, 1) & (INDEX_COUNT - 1);
fBuf->realtime[index] = real_time;
fBuf->perftime[index] = performance_time;
fBuf->drift[index] = drift;
atomic_add(&fBuf->readindex, 1);
}
@@ -155,6 +241,7 @@ BTimeSource::BroadcastTimeWarp(bigtime_t at_real_time,
bigtime_t new_performance_time)
{
UNIMPLEMENTED();
// call BMediaNode::TimeWarp() of all slaved nodes
}
@@ -162,6 +249,7 @@ void
BTimeSource::SendRunMode(run_mode mode)
{
UNIMPLEMENTED();
// send the run mode change to all slaved nodes
}
@@ -170,6 +258,7 @@ BTimeSource::SetRunMode(run_mode mode)
{
CALLED();
BMediaNode::SetRunMode(mode);
SendRunMode(mode);
}
/*************************************************************
* private BTimeSource
@@ -190,19 +279,54 @@ status_t BTimeSource::_Reserved_TimeSource_5(void *) { return B_ERROR; }
/* explicit */
BTimeSource::BTimeSource(media_node_id id) :
BMediaNode("called by BTimeSource", id, 0),
fStopped(false)
BMediaNode("This one is never called"),
fStopped(false),
fArea(-1),
fBuf(NULL),
fIsRealtime(false)
{
CALLED();
AddNodeKind(B_TIME_SOURCE);
ASSERT(id > 0);
// printf("###### explicit BTimeSource::BTimeSource() id %ld, name %s\n", id, Name());
// This constructor is only called by the derived BPrivate::media::TimeSourceObject objects
// We create a clone of the communication area
char name[32];
area_id area;
sprintf(name, "__timesource_buf_%ld", id);
area = find_area(name);
if (area <= 0) {
FATAL("BTimeSource::BTimeSource couldn't find area, node %ld\n", id);
return;
}
fArea = clone_area("__some_timesource_buf", reinterpret_cast<void **>(const_cast<BPrivate::media::TimeSourceTransmit **>(&fBuf)), B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA, area);
if (fArea <= 0) {
FATAL("BTimeSource::BTimeSource couldn't clone area, node %ld\n", id);
return;
}
}
void
BTimeSource::FinishCreate()
{
UNIMPLEMENTED();
CALLED();
//printf("BTimeSource::FinishCreate(), id %ld\n", ID());
char name[32];
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);
if (fArea <= 0) {
FATAL("BTimeSource::BTimeSource couldn't create area, node %ld\n", ID());
fBuf = NULL;
return;
}
fBuf->readindex = 0;
fBuf->writeindex = 1;
fBuf->realtime[0] = 0;
fBuf->perftime[0] = 0;
fBuf->drift[0] = 1.0f;
}
@@ -228,6 +352,7 @@ void
BTimeSource::DirectStart(bigtime_t at)
{
UNIMPLEMENTED();
fStopped = false;
}
@@ -236,6 +361,7 @@ BTimeSource::DirectStop(bigtime_t at,
bool immediate)
{
UNIMPLEMENTED();
fStopped = true;
}
@@ -252,5 +378,3 @@ BTimeSource::DirectSetRunMode(run_mode mode)
{
UNIMPLEMENTED();
}
+11 -32
View File
@@ -17,25 +17,11 @@ TimeSourceObject::TimeSourceObject(media_node_id id) :
BMediaNode("some timesource object", id, B_TIME_SOURCE),
BTimeSource(id)
{
printf("TimeSourceObject::TimeSourceObject enter, id = %ld\n", id);
// printf("TimeSourceObject::TimeSourceObject enter, id = %ld\n", id);
delete_port(fControlPort);
fControlPort = -999666; // must match value in BMediaNode::~BMediaNode()
ASSERT(id == fNodeID);
printf("TimeSourceObject::TimeSourceObject leave, node id %ld\n", fNodeID);
}
/* virtual */ status_t
TimeSourceObject::SnoozeUntil(
bigtime_t performance_time,
bigtime_t with_latency,
bool retry_signals)
{
bigtime_t time = performance_time - with_latency;
status_t err;
do {
err = snooze_until(time, B_SYSTEM_TIMEBASE);
} while (err == B_INTERRUPTED && retry_signals);
return err;
// printf("TimeSourceObject::TimeSourceObject leave, node id %ld\n", fNodeID);
}
/* virtual */ status_t
@@ -55,12 +41,14 @@ TimeSourceObject::AddOn(int32 *internal_id) const
}
/* virtual */ status_t
TimeSourceObject::DeleteHook(BMediaNode * node)
TimeSourceObject::DeleteHook(BMediaNode *node)
{
printf("TimeSourceObject::DeleteHook enter\n");
status_t status;
// printf("TimeSourceObject::DeleteHook enter\n");
_TimeSourceObjectManager->ObjectDeleted(this);
BTimeSource::DeleteHook(node);
printf("TimeSourceObject::DeleteHook leave\n");
status = BTimeSource::DeleteHook(node);
// printf("TimeSourceObject::DeleteHook leave\n");
return status;
}
@@ -68,18 +56,9 @@ SystemTimeSourceObject::SystemTimeSourceObject(media_node_id id)
: BMediaNode("System Time Source", id, B_TIME_SOURCE),
TimeSourceObject(id)
{
printf("SystemTimeSourceObject::SystemTimeSourceObject enter, id = %ld\n", id);
printf("SystemTimeSourceObject::SystemTimeSourceObject leave, node id %ld\n", ID());
}
/* virtual */ status_t
SystemTimeSourceObject::SnoozeUntil(
bigtime_t performance_time,
bigtime_t with_latency = 0,
bool retry_signals = false)
{
return TimeSourceObject::SnoozeUntil(performance_time, with_latency, retry_signals);
// printf("SystemTimeSourceObject::SystemTimeSourceObject enter, id = %ld\n", id);
fIsRealtime = true;
// printf("SystemTimeSourceObject::SystemTimeSourceObject leave, node id %ld\n", ID());
}
/* virtual */ status_t
-10
View File
@@ -18,11 +18,6 @@ class TimeSourceObject : public BTimeSource
public:
TimeSourceObject(media_node_id id);
virtual status_t SnoozeUntil(
bigtime_t performance_time,
bigtime_t with_latency = 0,
bool retry_signals = false);
protected:
virtual status_t TimeSourceOp(
const time_source_op_info & op,
@@ -40,11 +35,6 @@ class SystemTimeSourceObject : public TimeSourceObject
public:
SystemTimeSourceObject(media_node_id id);
virtual status_t SnoozeUntil(
bigtime_t performance_time,
bigtime_t with_latency = 0,
bool retry_signals = false);
protected:
// override from BMediaNode
virtual status_t DeleteHook(BMediaNode * node);
+2 -2
View File
@@ -50,7 +50,7 @@ TimeSourceObjectManager::GetTimeSource(const media_node &node)
{
BAutolock lock(fLock);
printf("TimeSourceObjectManager::GetTimeSource, node id %ld\n", node.node);
// printf("TimeSourceObjectManager::GetTimeSource, node id %ld\n", node.node);
if (fSystemTimeSource == 0) {
media_node clone;
@@ -92,7 +92,7 @@ TimeSourceObjectManager::ObjectDeleted(BTimeSource *timesource)
{
BAutolock lock(fLock);
printf("TimeSourceObjectManager::ObjectDeleted, node id %ld\n", timesource->ID());
// printf("TimeSourceObjectManager::ObjectDeleted, node id %ld\n", timesource->ID());
bool b;
b = fMap->Remove(timesource->ID());
+2
View File
@@ -619,6 +619,8 @@ NodeManager::CleanupTeam(team_id team)
FATAL("NodeManager::CleanupTeam: team %ld\n", team);
// XXX send notifications after removing nodes
registered_node *rn;
for (fRegisteredNodeMap->Rewind(); fRegisteredNodeMap->GetNext(&rn); ) {
// if the team hosting this node is gone, remove node from database
+5 -1
View File
@@ -36,6 +36,10 @@ BufferManager *gBufferManager;
AppManager *gAppManager;
NodeManager *gNodeManager;
namespace BPrivate { namespace media {
extern team_id team;
} } // BPrivate::media
#define REPLY_TIMEOUT ((bigtime_t)500000)
@@ -154,7 +158,7 @@ ServerApp::StartSystemTimeSource()
// register a dummy node
media_node node;
rv = gNodeManager->RegisterNode(&node.node, -1, 0, "Fake System Time Source", B_TIME_SOURCE, -1, -1);
rv = gNodeManager->RegisterNode(&node.node, -1, 0, "System Clock", B_TIME_SOURCE, -1, BPrivate::media::team);
ASSERT(rv == B_OK);
printf("StartSystemTimeSource setting as default\n");