diff --git a/headers/private/media/DataExchange.h b/headers/private/media/DataExchange.h index 73a952e7fe..0b5b21d663 100644 --- a/headers/private/media/DataExchange.h +++ b/headers/private/media/DataExchange.h @@ -16,6 +16,8 @@ namespace media { namespace dataexchange { +void InitDataExchange(); + // BMessage based data exchange with the media_server status_t SendToServer(BMessage* msg); status_t QueryServer(BMessage& request, BMessage& reply); diff --git a/src/kits/media/DataExchange.cpp b/src/kits/media/DataExchange.cpp index 4b4c7c633e..478500f406 100644 --- a/src/kits/media/DataExchange.cpp +++ b/src/kits/media/DataExchange.cpp @@ -24,36 +24,13 @@ namespace media { namespace dataexchange { -BMessenger* gMediaServerMessenger; +static BMessenger sMediaServerMessenger; static port_id sMediaServerPort; static port_id sMediaAddonServerPort; static void find_media_server_port(); static void find_media_addon_server_port(); -static BMessenger* -GetMediaServerMessenger() -{ - static BMessenger* messenger = new BMessenger(B_MEDIA_SERVER_SIGNATURE); - return gMediaServerMessenger = messenger; -} - -class initit { -public: - initit() - { - gMediaServerMessenger = 0; - find_media_server_port(); - find_media_addon_server_port(); - } - - ~initit() - { - delete gMediaServerMessenger; - } -}; -initit _initit; - static void find_media_server_port() @@ -80,11 +57,20 @@ find_media_addon_server_port() // #pragma mark - +void +InitDataExchange() +{ + sMediaServerMessenger = BMessenger(B_MEDIA_SERVER_SIGNATURE); + find_media_server_port(); + find_media_addon_server_port(); +} + + //! BMessage based data exchange with the media_server status_t SendToServer(BMessage* msg) { - status_t status = GetMediaServerMessenger()->SendMessage(msg, + status_t status = sMediaServerMessenger.SendMessage(msg, static_cast(NULL), TIMEOUT); if (status != B_OK) { ERROR("SendToServer: SendMessage failed: %s\n", strerror(status)); @@ -97,7 +83,7 @@ SendToServer(BMessage* msg) status_t QueryServer(BMessage& request, BMessage& reply) { - status_t status = GetMediaServerMessenger()->SendMessage(&request, &reply, + status_t status = sMediaServerMessenger.SendMessage(&request, &reply, TIMEOUT, TIMEOUT); if (status != B_OK) { ERROR("QueryServer: SendMessage failed: %s\n", strerror(status)); diff --git a/src/kits/media/DormantNodeManager.cpp b/src/kits/media/DormantNodeManager.cpp index 00cdbdec01..e48a0045d0 100644 --- a/src/kits/media/DormantNodeManager.cpp +++ b/src/kits/media/DormantNodeManager.cpp @@ -66,8 +66,8 @@ namespace BPrivate { namespace media { -static DormantNodeManager sManager; -DormantNodeManager* gDormantNodeManager = &sManager; +DormantNodeManager* gDormantNodeManager; + // initialized by BMediaRoster. DormantNodeManager::DormantNodeManager() diff --git a/src/kits/media/MediaRoster.cpp b/src/kits/media/MediaRoster.cpp index 4bf4094819..6174926f5b 100644 --- a/src/kits/media/MediaRoster.cpp +++ b/src/kits/media/MediaRoster.cpp @@ -69,36 +69,45 @@ char __dont_remove_copyright_from_binary[] = "Copyright (c) 2002-2006 Marcus " #include "TimeSourceObjectManager.h" -namespace BPrivate { namespace media { +namespace BPrivate { +namespace media { -// the BMediaRoster destructor is private, -// but _DefaultDeleter is a friend class of -// the BMediaRoster an thus can delete it -class DefaultDeleter { + +class MediaInitializer { public: - ~DefaultDeleter() + MediaInitializer() { - if (BMediaRoster::sDefaultInstance != NULL) { - BMediaRoster::sDefaultInstance->Lock(); - BMediaRoster::sDefaultInstance->Quit(); + InitDataExchange(); + } + + ~MediaInitializer() + { + if (BMediaRoster::CurrentRoster() != NULL) { + BMediaRoster::CurrentRoster()->Lock(); + BMediaRoster::CurrentRoster()->Quit(); } } }; + } // namespace media } // namespace BPrivate using namespace BPrivate::media; -// DefaultDeleter will delete the BMediaRoster object in it's destructor. -DefaultDeleter _deleter; +static MediaInitializer sInitializer; BMediaRosterEx::BMediaRosterEx(status_t* _error) : BMediaRoster() { + InitDataExchange(); + + gDormantNodeManager = new DormantNodeManager; + gTimeSourceObjectManager = new TimeSourceObjectManager; + // register this application with the media server server_register_app_request request; server_register_app_reply reply; @@ -3145,6 +3154,9 @@ BMediaRoster::~BMediaRoster() { CALLED(); + delete gTimeSourceObjectManager; + delete gDormantNodeManager; + // unregister this application with the media server server_unregister_app_request request; server_unregister_app_reply reply; @@ -3163,7 +3175,7 @@ BMediaRoster::~BMediaRoster() // #pragma mark - private BMediaRoster -// deprecated call +//! Deprecated call. status_t BMediaRoster::SetOutputBuffersFor(const media_source& output, BBufferGroup* group, bool willReclaim) @@ -3174,15 +3186,15 @@ BMediaRoster::SetOutputBuffersFor(const media_source& output, } -/* FBC reserved virtuals */ -status_t BMediaRoster::_Reserved_MediaRoster_0(void *) { return B_ERROR; } -status_t BMediaRoster::_Reserved_MediaRoster_1(void *) { return B_ERROR; } -status_t BMediaRoster::_Reserved_MediaRoster_2(void *) { return B_ERROR; } -status_t BMediaRoster::_Reserved_MediaRoster_3(void *) { return B_ERROR; } -status_t BMediaRoster::_Reserved_MediaRoster_4(void *) { return B_ERROR; } -status_t BMediaRoster::_Reserved_MediaRoster_5(void *) { return B_ERROR; } -status_t BMediaRoster::_Reserved_MediaRoster_6(void *) { return B_ERROR; } -status_t BMediaRoster::_Reserved_MediaRoster_7(void *) { return B_ERROR; } +// FBC reserved virtuals +status_t BMediaRoster::_Reserved_MediaRoster_0(void*) { return B_ERROR; } +status_t BMediaRoster::_Reserved_MediaRoster_1(void*) { return B_ERROR; } +status_t BMediaRoster::_Reserved_MediaRoster_2(void*) { return B_ERROR; } +status_t BMediaRoster::_Reserved_MediaRoster_3(void*) { return B_ERROR; } +status_t BMediaRoster::_Reserved_MediaRoster_4(void*) { return B_ERROR; } +status_t BMediaRoster::_Reserved_MediaRoster_5(void*) { return B_ERROR; } +status_t BMediaRoster::_Reserved_MediaRoster_6(void*) { return B_ERROR; } +status_t BMediaRoster::_Reserved_MediaRoster_7(void*) { return B_ERROR; } BMediaRoster::BMediaRoster() diff --git a/src/kits/media/TimeSourceObjectManager.cpp b/src/kits/media/TimeSourceObjectManager.cpp index e934eb7cb3..ce0f61004d 100644 --- a/src/kits/media/TimeSourceObjectManager.cpp +++ b/src/kits/media/TimeSourceObjectManager.cpp @@ -26,8 +26,8 @@ namespace BPrivate { namespace media { -static TimeSourceObjectManager sManager; -TimeSourceObjectManager* gTimeSourceObjectManager = &sManager; +TimeSourceObjectManager* gTimeSourceObjectManager; + // initialized by BMediaRoster. TimeSourceObjectManager::TimeSourceObjectManager()