Made time sources mode BeOS R5 conforming.

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2395 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
beveloper
2003-01-09 17:54:20 +00:00
parent cfe8d4a743
commit d6379053ba
7 changed files with 84 additions and 34 deletions
+1 -1
View File
@@ -121,7 +121,7 @@ virtual status_t _Reserved_TimeSource_3(void *);
virtual status_t _Reserved_TimeSource_4(void *); virtual status_t _Reserved_TimeSource_4(void *);
virtual status_t _Reserved_TimeSource_5(void *); virtual status_t _Reserved_TimeSource_5(void *);
bool fStopped; bool fStarted;
area_id fArea; area_id fArea;
volatile BPrivate::media::TimeSourceTransmit *fBuf; volatile BPrivate::media::TimeSourceTransmit *fBuf;
_BSlaveNodeStorageP * _mSlaveNodes; _BSlaveNodeStorageP * _mSlaveNodes;
+17 -8
View File
@@ -15,6 +15,7 @@
#include "DataExchange.h" #include "DataExchange.h"
#include "ServerInterface.h" #include "ServerInterface.h"
#include "Notifications.h" #include "Notifications.h"
#include "TimeSourceObject.h"
// don't rename this one, it's used and exported for binary compatibility // don't rename this one, it's used and exported for binary compatibility
int32 BMediaNode::_m_changeTag = 0; int32 BMediaNode::_m_changeTag = 0;
@@ -101,12 +102,17 @@ BMediaNode::~BMediaNode()
// BeBook: UnregisterNode() unregisters a node from the Media Server. It's called automatically // BeBook: UnregisterNode() unregisters a node from the Media Server. It's called automatically
// BeBook: by the BMediaNode destructor, but it might be convenient to call it sometime before // BeBook: by the BMediaNode destructor, but it might be convenient to call it sometime before
// BeBook: you delete your node instance, depending on your implementation and circumstances. // BeBook: you delete your node instance, depending on your implementation and circumstances.
// ATT! We do not unregister TimeSourceObject nodes (identified by fControlPort == -999666)
if (fControlPort != -999666) // must match value in TimeSourceObject::TimeSourceObject() // Attention! We do not unregister TimeSourceObject nodes,
(BMediaRoster::Roster())->UnregisterNode(this); // or delete their control ports, since they are only a
// shadow object, and the real one still exists
if (0 == (fKinds & NODE_KIND_SHADOW_TIMESOURCE)) {
BMediaRoster::Roster()->UnregisterNode(this);
if (fControlPort > 0) if (fControlPort > 0)
delete_port(fControlPort); delete_port(fControlPort);
}
if (fTimeSource) if (fTimeSource)
fTimeSource->Release(); fTimeSource->Release();
} }
@@ -159,7 +165,7 @@ uint64
BMediaNode::Kinds() const BMediaNode::Kinds() const
{ {
CALLED(); CALLED();
return fKinds; return fKinds & NODE_KIND_USER_MASK;
} }
@@ -200,13 +206,14 @@ BMediaNode::TimeSource() const
return NULL; return NULL;
} }
self->fTimeSource = roster->MakeTimeSourceFor(clone); self->fTimeSource = roster->MakeTimeSourceFor(clone);
ASSERT(fTimeSource == self->fTimeSource);
if (fTimeSource == 0) { if (fTimeSource == 0) {
FATAL("BMediaNode::TimeSource: Error, MakeTimeSourceFor failed\n"); FATAL("BMediaNode::TimeSource: Error, MakeTimeSourceFor failed\n");
} else { } else {
fTimeSource->AddMe(self); fTimeSource->AddMe(self);
} }
rv = roster->ReleaseNode(clone); rv = roster->ReleaseNode(clone);
if (fTimeSource == 0) { if (rv != B_OK) {
FATAL("BMediaNode::TimeSource: Error, ReleaseNode failed\n"); FATAL("BMediaNode::TimeSource: Error, ReleaseNode failed\n");
} }
@@ -479,6 +486,7 @@ BMediaNode::SetTimeSource(BTimeSource *time_source)
newsource->AddMe(this); newsource->AddMe(this);
} }
fTimeSource = newsource; fTimeSource = newsource;
//BMediaRoster::Roster()->StartTimeSource(fTimeSource->Node(), fTimeSource->RealTime());
} }
/************************************************************* /*************************************************************
@@ -567,6 +575,7 @@ BMediaNode::HandleMessage(int32 message,
fTimeSource = newsource; fTimeSource = newsource;
} }
fTimeSource->AddMe(this); fTimeSource->AddMe(this);
//roster->StartTimeSource(fTimeSource->Node(), fTimeSource->RealTime());
return B_OK; return B_OK;
} }
@@ -791,7 +800,7 @@ BMediaNode::_InitObject(const char *name, media_node_id id, uint64 kinds)
TRACE("BMediaNode::_InitObject: nodeid %ld, this %p\n", id, this); TRACE("BMediaNode::_InitObject: nodeid %ld, this %p\n", id, this);
fNodeID = id; fNodeID = id;
fTimeSource = 0; fTimeSource = NULL;
fRefCount = 1; fRefCount = 1;
fName[0] = 0; fName[0] = 0;
if (name) { if (name) {
+24 -9
View File
@@ -10,11 +10,12 @@
namespace BPrivate { namespace media { namespace BPrivate { namespace media {
struct TimeSourceTransmit struct TimeSourceTransmit // sizeof() must be <= 4096
{ {
#define INDEX_COUNT 128 #define INDEX_COUNT 128
int32 readindex; int32 readindex;
int32 writeindex; int32 writeindex;
int32 isrunning;
bigtime_t realtime[INDEX_COUNT]; bigtime_t realtime[INDEX_COUNT];
bigtime_t perftime[INDEX_COUNT]; bigtime_t perftime[INDEX_COUNT];
float drift[INDEX_COUNT]; float drift[INDEX_COUNT];
@@ -102,8 +103,11 @@ bool
BTimeSource::IsRunning() BTimeSource::IsRunning()
{ {
CALLED(); CALLED();
printf("BTimeSource::IsRunning() node %ld, port %ld, %s\n", fNodeID, fControlPort, fStopped ? "no" : "yes"); bool isrunning;
return !fStopped; isrunning = fBuf ? atomic_add(&fBuf->isrunning, 0) : fStarted;
printf("BTimeSource::IsRunning() node %ld, port %ld, %s\n", fNodeID, fControlPort, isrunning ? "yes" : "no");
return isrunning;
} }
@@ -166,7 +170,7 @@ BTimeSource::GetStartLatency(bigtime_t *out_latency)
BTimeSource::BTimeSource() : BTimeSource::BTimeSource() :
BMediaNode("This one is never called"), BMediaNode("This one is never called"),
fStopped(false), fStarted(false),
fArea(-1), fArea(-1),
fBuf(NULL), fBuf(NULL),
fIsRealtime(false) fIsRealtime(false)
@@ -224,8 +228,11 @@ BTimeSource::PublishTime(bigtime_t performance_time,
float drift) float drift)
{ {
printf("BTimeSource::PublishTime timesource %ld, perf %16Ld, real %16Ld, drift %2.2f\n", ID(), performance_time, real_time, drift); printf("BTimeSource::PublishTime timesource %ld, perf %16Ld, real %16Ld, drift %2.2f\n", ID(), performance_time, real_time, drift);
if (0 == fBuf) if (0 == fBuf) {
FATAL("BTimeSource::PublishTime timesource %ld, fBuf = NULL\n", ID());
fStarted = true;
return; return;
}
int32 index; int32 index;
index = atomic_add(&fBuf->writeindex, 1) & (INDEX_COUNT - 1); index = atomic_add(&fBuf->writeindex, 1) & (INDEX_COUNT - 1);
@@ -280,7 +287,7 @@ status_t BTimeSource::_Reserved_TimeSource_5(void *) { return B_ERROR; }
/* explicit */ /* explicit */
BTimeSource::BTimeSource(media_node_id id) : BTimeSource::BTimeSource(media_node_id id) :
BMediaNode("This one is never called"), BMediaNode("This one is never called"),
fStopped(false), fStarted(false),
fArea(-1), fArea(-1),
fBuf(NULL), fBuf(NULL),
fIsRealtime(false) fIsRealtime(false)
@@ -300,7 +307,8 @@ BTimeSource::BTimeSource(media_node_id id) :
FATAL("BTimeSource::BTimeSource couldn't find area, node %ld\n", id); FATAL("BTimeSource::BTimeSource couldn't find area, node %ld\n", id);
return; 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); sprintf(name, "__cloned_timesource_buf_%ld", id);
fArea = clone_area(name, reinterpret_cast<void **>(const_cast<BPrivate::media::TimeSourceTransmit **>(&fBuf)), B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA, area);
if (fArea <= 0) { if (fArea <= 0) {
FATAL("BTimeSource::BTimeSource couldn't clone area, node %ld\n", id); FATAL("BTimeSource::BTimeSource couldn't clone area, node %ld\n", id);
return; return;
@@ -327,6 +335,7 @@ BTimeSource::FinishCreate()
fBuf->realtime[0] = 0; fBuf->realtime[0] = 0;
fBuf->perftime[0] = 0; fBuf->perftime[0] = 0;
fBuf->drift[0] = 1.0f; fBuf->drift[0] = 1.0f;
fBuf->isrunning = fStarted;
} }
@@ -352,7 +361,10 @@ void
BTimeSource::DirectStart(bigtime_t at) BTimeSource::DirectStart(bigtime_t at)
{ {
UNIMPLEMENTED(); UNIMPLEMENTED();
fStopped = false; if (fBuf)
atomic_or(&fBuf->isrunning, 1);
else
fStarted = true;
} }
@@ -361,7 +373,10 @@ BTimeSource::DirectStop(bigtime_t at,
bool immediate) bool immediate)
{ {
UNIMPLEMENTED(); UNIMPLEMENTED();
fStopped = true; if (fBuf)
atomic_and(&fBuf->isrunning, 0);
else
fStarted = false;
} }
+22 -9
View File
@@ -13,14 +13,26 @@
#include "TimeSourceObject.h" #include "TimeSourceObject.h"
#include "TimeSourceObjectManager.h" #include "TimeSourceObjectManager.h"
TimeSourceObject::TimeSourceObject(media_node_id id) : TimeSourceObject::TimeSourceObject(const media_node &node)
BMediaNode("some timesource object", id, B_TIME_SOURCE), : BMediaNode("some timesource object", node.node, node.kind),
BTimeSource(id) BTimeSource(node.node)
{ {
// printf("TimeSourceObject::TimeSourceObject enter, id = %ld\n", id); // printf("TimeSourceObject::TimeSourceObject enter, id = %ld\n", id);
delete_port(fControlPort); if (fControlPort > 0)
fControlPort = -999666; // must match value in BMediaNode::~BMediaNode() delete_port(fControlPort);
ASSERT(id == fNodeID); fControlPort = node.port;
ASSERT(fNodeID == node.node);
ASSERT(fKinds == node.kind);
live_node_info lni;
if (B_OK == BMediaRoster::Roster()->GetLiveNodeInfo(node, &lni)) {
strcpy(fName, lni.name);
} else {
sprintf(fName, "timesource %ld", node.node);
}
AddNodeKind(NODE_KIND_SHADOW_TIMESOURCE);
fControlPort = -1234;
// printf("TimeSourceObject::TimeSourceObject leave, node id %ld\n", fNodeID); // printf("TimeSourceObject::TimeSourceObject leave, node id %ld\n", fNodeID);
} }
@@ -52,12 +64,13 @@ TimeSourceObject::DeleteHook(BMediaNode *node)
} }
SystemTimeSourceObject::SystemTimeSourceObject(media_node_id id) SystemTimeSourceObject::SystemTimeSourceObject(const media_node &node)
: BMediaNode("System Time Source", id, B_TIME_SOURCE), : BMediaNode("System Clock", node.node, node.kind),
TimeSourceObject(id) TimeSourceObject(node)
{ {
// printf("SystemTimeSourceObject::SystemTimeSourceObject enter, id = %ld\n", id); // printf("SystemTimeSourceObject::SystemTimeSourceObject enter, id = %ld\n", id);
fIsRealtime = true; fIsRealtime = true;
AddNodeKind(NODE_KIND_SYSTEM_TIMESOURCE);
// printf("SystemTimeSourceObject::SystemTimeSourceObject leave, node id %ld\n", ID()); // printf("SystemTimeSourceObject::SystemTimeSourceObject leave, node id %ld\n", ID());
} }
+6 -2
View File
@@ -11,12 +11,16 @@
#include <TimeSource.h> #include <TimeSource.h>
#define NODE_KIND_USER_MASK 0x00000000FFFFFFFFLL
#define NODE_KIND_SHADOW_TIMESOURCE 0x0000000100000000LL
#define NODE_KIND_SYSTEM_TIMESOURCE 0x0000000200000000LL
namespace BPrivate { namespace media { namespace BPrivate { namespace media {
class TimeSourceObject : public BTimeSource class TimeSourceObject : public BTimeSource
{ {
public: public:
TimeSourceObject(media_node_id id); TimeSourceObject(const media_node &node);
protected: protected:
virtual status_t TimeSourceOp( virtual status_t TimeSourceOp(
@@ -33,7 +37,7 @@ protected:
class SystemTimeSourceObject : public TimeSourceObject class SystemTimeSourceObject : public TimeSourceObject
{ {
public: public:
SystemTimeSourceObject(media_node_id id); SystemTimeSourceObject(const media_node &node);
protected: protected:
// override from BMediaNode // override from BMediaNode
+9 -5
View File
@@ -23,6 +23,7 @@ TimeSourceObjectManager::TimeSourceObjectManager()
: fSystemTimeSource(0), : fSystemTimeSource(0),
fSystemTimeSourceID(0) fSystemTimeSourceID(0)
{ {
CALLED();
fLock = new BLocker("timesource object manager locker"); fLock = new BLocker("timesource object manager locker");
fMap = new Map<media_node_id,BTimeSource *>; fMap = new Map<media_node_id,BTimeSource *>;
} }
@@ -30,6 +31,7 @@ TimeSourceObjectManager::TimeSourceObjectManager()
TimeSourceObjectManager::~TimeSourceObjectManager() TimeSourceObjectManager::~TimeSourceObjectManager()
{ {
CALLED();
delete fLock; delete fLock;
// force unloading all currently loaded // force unloading all currently loaded
@@ -48,6 +50,7 @@ TimeSourceObjectManager::~TimeSourceObjectManager()
BTimeSource * BTimeSource *
TimeSourceObjectManager::GetTimeSource(const media_node &node) TimeSourceObjectManager::GetTimeSource(const media_node &node)
{ {
CALLED();
BAutolock lock(fLock); BAutolock lock(fLock);
// printf("TimeSourceObjectManager::GetTimeSource, node id %ld\n", node.node); // printf("TimeSourceObjectManager::GetTimeSource, node id %ld\n", node.node);
@@ -55,14 +58,14 @@ TimeSourceObjectManager::GetTimeSource(const media_node &node)
if (fSystemTimeSource == 0) { if (fSystemTimeSource == 0) {
media_node clone; media_node clone;
status_t rv; status_t rv;
rv = BMediaRoster::Roster()->GetSystemTimeSource(&clone); // XXX this clone is never released
rv = BMediaRoster::Roster()->GetSystemTimeSource(&clone);
if (rv != B_OK) { if (rv != B_OK) {
FATAL("TimeSourceObjectManager::GetTimeSource, GetSystemTimeSource failed\n"); FATAL("TimeSourceObjectManager::GetTimeSource, GetSystemTimeSource failed\n");
return NULL; return NULL;
} }
fSystemTimeSourceID = clone.node; fSystemTimeSource = new SystemTimeSourceObject(clone);
fSystemTimeSource = new SystemTimeSourceObject(fSystemTimeSourceID); fSystemTimeSourceID = fSystemTimeSource->ID();
ASSERT(fSystemTimeSourceID == fSystemTimeSource->ID());
} }
if (node.node == fSystemTimeSourceID) if (node.node == fSystemTimeSourceID)
@@ -82,7 +85,7 @@ TimeSourceObjectManager::GetTimeSource(const media_node &node)
} }
BTimeSource *ts; BTimeSource *ts;
ts = new TimeSourceObject(clone.node); ts = new TimeSourceObject(clone);
fMap->Insert(clone.node, ts); fMap->Insert(clone.node, ts);
return ts; return ts;
} }
@@ -90,6 +93,7 @@ TimeSourceObjectManager::GetTimeSource(const media_node &node)
void void
TimeSourceObjectManager::ObjectDeleted(BTimeSource *timesource) TimeSourceObjectManager::ObjectDeleted(BTimeSource *timesource)
{ {
CALLED();
BAutolock lock(fLock); BAutolock lock(fLock);
// printf("TimeSourceObjectManager::ObjectDeleted, node id %ld\n", timesource->ID()); // printf("TimeSourceObjectManager::ObjectDeleted, node id %ld\n", timesource->ID());
+5
View File
@@ -399,6 +399,7 @@ NodeManager::GetLiveNodes(Stack<live_node_info> *livenodes, int32 maxcount, cons
} }
status_t status_t
NodeManager::GetDormantNodeInfo(dormant_node_info *node_info, const media_node &node) NodeManager::GetDormantNodeInfo(dormant_node_info *node_info, const media_node &node)
{ {
@@ -407,6 +408,10 @@ NodeManager::GetDormantNodeInfo(dormant_node_info *node_info, const media_node &
registered_node *rn; registered_node *rn;
for (fRegisteredNodeMap->Rewind(); fRegisteredNodeMap->GetNext(&rn); ) { for (fRegisteredNodeMap->Rewind(); fRegisteredNodeMap->GetNext(&rn); ) {
if (rn->nodeid == node.node) { if (rn->nodeid == node.node) {
if (rn->addon_id == -1) { // This function must return an error if the node is application owned
TRACE("NodeManager::GetDormantNodeInfo NODE IS APPLICATION OWNED! node %ld, addon_id %ld, addon_flavor_id %ld, name \"%s\"\n", node.node, rn->addon_id, rn->addon_flavor_id, rn->name);
return B_ERROR;
}
ASSERT(node.port == rn->port); ASSERT(node.port == rn->port);
ASSERT(node.kind == rn->kinds); ASSERT(node.kind == rn->kinds);
node_info->addon = rn->addon_id; node_info->addon = rn->addon_id;