Author: korli Date: 2010-05-03 00:35:18 +0200 (Mon, 03 May 2010) New Revision: 36588 Changeset: http://dev.haiku-os.org/changeset/36588/haiku Modified: haiku/trunk/src/servers/media/BufferManager.h haiku/trunk/src/servers/media/DefaultManager.cpp haiku/trunk/src/servers/media/DefaultManager.h haiku/trunk/src/servers/media/MediaFilesManager.h haiku/trunk/src/servers/media/NotificationManager.h Log: * style cleanup * DefaultManager: added a lock around rescan thread start and exit: this should fix the possible race condition spotted by Ingo. Modified: haiku/trunk/src/servers/media/BufferManager.h =================================================================== --- haiku/trunk/src/servers/media/BufferManager.h 2010-05-02 18:00:20 UTC (rev 36587) +++ haiku/trunk/src/servers/media/BufferManager.h 2010-05-02 22:35:18 UTC (rev 36588) @@ -3,8 +3,9 @@ * Copyright 2009, Axel Dörfler, axeld@xxxxxxxxxxxxxxxxx * Distributed under the terms of the MIT License. */ +#ifndef _BUFFER_MANAGER_H +#define _BUFFER_MANAGER_H - #include <set> #include <Locker.h> @@ -110,3 +111,4 @@ SourceInfoMap fSourceInfoMap; }; +#endif // _BUFFER_MANAGER_H Modified: haiku/trunk/src/servers/media/DefaultManager.cpp =================================================================== --- haiku/trunk/src/servers/media/DefaultManager.cpp 2010-05-02 18:00:20 UTC (rev 36587) +++ haiku/trunk/src/servers/media/DefaultManager.cpp 2010-05-02 22:35:18 UTC (rev 36588) @@ -55,8 +55,9 @@ fTimeSource(-1), fAudioMixer(-1), fPhysicalAudioOutInputID(0), - fThreadId(-1), - fRescanRequested(0) + fRescanThread(-1), + fRescanRequested(0), + fRescanLock("rescan default manager") { strcpy(fPhysicalAudioOutInputName, "default"); fBeginHeader[0] = 0xab00150b; @@ -95,7 +96,7 @@ TRACE("0x%08lx %ld\n", fBeginHeader[1], fBeginHeader[1]); TRACE("0x%08lx %ld\n", fBeginHeader[2], fBeginHeader[2]); if (file.Read(&category_count, sizeof(uint32)) < (int32)sizeof(uint32)) { - fprintf(stderr, + fprintf(stderr, "DefaultManager::LoadState() failed to read category_count\n"); return B_ERROR; } @@ -105,12 +106,12 @@ uint32 msg_header; uint32 default_type; if (file.Read(&msg_header, sizeof(uint32)) < (int32)sizeof(uint32)) { - fprintf(stderr, + fprintf(stderr, "DefaultManager::LoadState() failed to read msg_header\n"); return B_ERROR; } if (file.Read(&default_type, sizeof(uint32)) < (int32)sizeof(uint32)) { - fprintf(stderr, + fprintf(stderr, "DefaultManager::LoadState() failed to read default_type\n"); return B_ERROR; } @@ -121,11 +122,11 @@ fprintf(stderr, "DefaultManager::LoadState() failed to unflatten\n"); } if (file.Read(fEndHeader, sizeof(uint32)*3) < (int32)sizeof(uint32)*3) { - fprintf(stderr, + fprintf(stderr, "DefaultManager::LoadState() failed to read fEndHeader\n"); return B_ERROR; } - + TRACE("LoadState returns B_OK\n"); return B_OK; } @@ -144,14 +145,14 @@ if ((err = create_directory(path.Path(), 0755)) != B_OK) return err; path.Append(kDefaultManagerSettingsFile); - + uint32 default_types[] = {kMsgTypeVideoIn, kMsgTypeVideoOut, kMsgTypeAudioIn, kMsgTypeAudioOut}; media_node_id media_node_ids[] = {fPhysicalVideoIn, fPhysicalVideoOut, fPhysicalAudioIn, fPhysicalAudioOut}; for (uint32 i = 0; i < sizeof(default_types) / sizeof(default_types[0]); i++) { - + // we call the node manager to have more infos about nodes dormant_node_info info; media_node node; @@ -328,13 +329,14 @@ status_t DefaultManager::Rescan() { + BAutolock locker(fRescanLock); atomic_add(&fRescanRequested, 1); - if (fThreadId < 0) { - fThreadId = spawn_thread(rescan_thread, "rescan defaults", + if (fRescanThread < 0) { + fRescanThread = spawn_thread(rescan_thread, "rescan defaults", B_NORMAL_PRIORITY - 2, this); - resume_thread(fThreadId); + resume_thread(fRescanThread); } - + return B_OK; } @@ -342,50 +344,54 @@ int32 DefaultManager::rescan_thread(void *arg) { - reinterpret_cast<DefaultManager *>(arg)->RescanThread(); + reinterpret_cast<DefaultManager *>(arg)->_RescanThread(); return 0; } void -DefaultManager::RescanThread() +DefaultManager::_RescanThread() { - TRACE("DefaultManager::RescanThread() enter\n"); - + TRACE("DefaultManager::_RescanThread() enter\n"); + + BAutolock locker(fRescanLock); + while (atomic_and(&fRescanRequested, 0) != 0) { + locker.Unlock(); + // We do not search for the system time source, // it should already exist ASSERT(fSystemTimeSource != -1); - + if (fPhysicalVideoOut == -1) { - FindPhysical(&fPhysicalVideoOut, kMsgTypeVideoOut, false, + _FindPhysical(&fPhysicalVideoOut, kMsgTypeVideoOut, false, B_MEDIA_RAW_VIDEO); - FindPhysical(&fPhysicalVideoOut, kMsgTypeVideoOut, false, + _FindPhysical(&fPhysicalVideoOut, kMsgTypeVideoOut, false, B_MEDIA_ENCODED_VIDEO); } if (fPhysicalVideoIn == -1) { - FindPhysical(&fPhysicalVideoIn, kMsgTypeVideoIn, true, + _FindPhysical(&fPhysicalVideoIn, kMsgTypeVideoIn, true, B_MEDIA_RAW_VIDEO); - FindPhysical(&fPhysicalVideoIn, kMsgTypeVideoIn, true, + _FindPhysical(&fPhysicalVideoIn, kMsgTypeVideoIn, true, B_MEDIA_ENCODED_VIDEO); } if (fPhysicalAudioOut == -1) - FindPhysical(&fPhysicalAudioOut, kMsgTypeAudioOut, false, + _FindPhysical(&fPhysicalAudioOut, kMsgTypeAudioOut, false, B_MEDIA_RAW_AUDIO); if (fPhysicalAudioIn == -1) - FindPhysical(&fPhysicalAudioIn, kMsgTypeAudioIn, true, + _FindPhysical(&fPhysicalAudioIn, kMsgTypeAudioIn, true, B_MEDIA_RAW_AUDIO); if (fAudioMixer == -1) - FindAudioMixer(); - + _FindAudioMixer(); + // The normal time source is searched for after the // Physical Audio Out has been created. if (fTimeSource == -1) - FindTimeSource(); - + _FindTimeSource(); + // Connect the mixer and physical audio out (soundcard) if (!fMixerConnected && fAudioMixer != -1 && fPhysicalAudioOut != -1) { - fMixerConnected = B_OK == ConnectMixerToOutput(); + fMixerConnected = B_OK == _ConnectMixerToOutput(); if (!fMixerConnected) ERROR("DefaultManager: failed to connect mixer and" "soundcard\n"); @@ -393,22 +399,24 @@ ERROR("DefaultManager: Did not try to connect mixer and" "soundcard\n"); } - + if (fMixerConnected) { add_on_server_rescan_finished_notify_command cmd; SendToAddOnServer(ADD_ON_SERVER_RESCAN_FINISHED_NOTIFY, &cmd, sizeof(cmd)); } + + locker.Lock(); } - - fThreadId = -1; - TRACE("DefaultManager::RescanThread() leave\n"); + fRescanThread = -1; + + TRACE("DefaultManager::_RescanThread() leave\n"); } void -DefaultManager::FindPhysical(volatile media_node_id *id, uint32 default_type, +DefaultManager::_FindPhysical(volatile media_node_id *id, uint32 default_type, bool isInput, media_type type) { live_node_info info[MAX_NODE_INFOS]; @@ -419,7 +427,7 @@ BPath msgPath; dormant_node_info msgDninfo; int32 input_id; - bool isAudio = (type == B_MEDIA_RAW_AUDIO) + bool isAudio = (type == B_MEDIA_RAW_AUDIO) || (type == B_MEDIA_ENCODED_AUDIO); for (int32 i = 0; i < fMsgList.CountItems(); i++) { @@ -512,7 +520,7 @@ void -DefaultManager::FindTimeSource() +DefaultManager::_FindTimeSource() { live_node_info info[MAX_NODE_INFOS]; media_format input; /* a physical audio output has a logical data input (DAC)*/ @@ -577,7 +585,7 @@ void -DefaultManager::FindAudioMixer() +DefaultManager::_FindAudioMixer() { live_node_info info; int32 count; @@ -596,7 +604,7 @@ status_t -DefaultManager::ConnectMixerToOutput() +DefaultManager::_ConnectMixerToOutput() { BMediaRoster *roster; media_node timesource; Modified: haiku/trunk/src/servers/media/DefaultManager.h =================================================================== --- haiku/trunk/src/servers/media/DefaultManager.h 2010-05-02 18:00:20 UTC (rev 36587) +++ haiku/trunk/src/servers/media/DefaultManager.h 2010-05-02 22:35:18 UTC (rev 36588) @@ -1,56 +1,81 @@ -/* +/* + * Copyright 2010, Haiku. All rights reserved. + * Distributed under the terms of the MIT license. + * + * Authors: + * Marcus Overhagen + * Jérôme Duval + */ +/* * Copyright 2002, Marcus Overhagen. All rights reserved. * Distributed under the terms of the MIT License. */ +#ifndef _DEFAULT_MANAGER_H +#define _DEFAULT_MANAGER_H + + +/*! Manager for defaults (audio and video, input and output) +*/ + + #include "DataExchange.h" +#include <Autolock.h> #include <Message.h> class NodeManager; -class DefaultManager -{ + +class DefaultManager { public: - DefaultManager(); - ~DefaultManager(); + DefaultManager(); + ~DefaultManager(); - status_t LoadState(); - status_t SaveState(NodeManager *node_manager); + status_t LoadState(); + status_t SaveState(NodeManager *node_manager); - status_t Set(media_node_id nodeid, const char *input_name, int32 input_id, node_type type); - status_t Get(media_node_id *nodeid, char *input_name, int32 *input_id, node_type type); - status_t Rescan(); - - void Dump(); + status_t Set(media_node_id nodeid, + const char *input_name, int32 input_id, + node_type type); + status_t Get(media_node_id *nodeid, char *input_name, + int32 *input_id, node_type type); + status_t Rescan(); - void CleanupTeam(team_id team); + void Dump(); + void CleanupTeam(team_id team); + private: - static int32 rescan_thread(void *arg); - void RescanThread(); + static int32 rescan_thread(void *arg); + void _RescanThread(); - void FindPhysical(volatile media_node_id *id, uint32 default_type, bool isInput, media_type type); - void FindAudioMixer(); - void FindTimeSource(); - - status_t ConnectMixerToOutput(); - + void _FindPhysical(volatile media_node_id *id, + uint32 default_type, bool isInput, + media_type type); + void _FindAudioMixer(); + void _FindTimeSource(); + + status_t _ConnectMixerToOutput(); + private: - volatile bool fMixerConnected; - volatile media_node_id fPhysicalVideoOut; - volatile media_node_id fPhysicalVideoIn; - volatile media_node_id fPhysicalAudioOut; - volatile media_node_id fPhysicalAudioIn; - volatile media_node_id fSystemTimeSource; - volatile media_node_id fTimeSource; - volatile media_node_id fAudioMixer; - volatile int32 fPhysicalAudioOutInputID; - char fPhysicalAudioOutInputName[B_MEDIA_NAME_LENGTH]; - - BList fMsgList; - - uint32 fBeginHeader[3]; - uint32 fEndHeader[3]; - thread_id fThreadId; - vint32 fRescanRequested; + volatile bool fMixerConnected; + volatile media_node_id fPhysicalVideoOut; + volatile media_node_id fPhysicalVideoIn; + volatile media_node_id fPhysicalAudioOut; + volatile media_node_id fPhysicalAudioIn; + volatile media_node_id fSystemTimeSource; + volatile media_node_id fTimeSource; + volatile media_node_id fAudioMixer; + volatile int32 fPhysicalAudioOutInputID; + char fPhysicalAudioOutInputName[B_MEDIA_NAME_LENGTH]; + + BList fMsgList; + + uint32 fBeginHeader[3]; + uint32 fEndHeader[3]; + thread_id fRescanThread; + vint32 fRescanRequested; + BLocker fRescanLock; }; + +#endif // _DEFAULT_MANAGER_H Modified: haiku/trunk/src/servers/media/MediaFilesManager.h =================================================================== --- haiku/trunk/src/servers/media/MediaFilesManager.h 2010-05-02 18:00:20 UTC (rev 36587) +++ haiku/trunk/src/servers/media/MediaFilesManager.h 2010-05-02 22:35:18 UTC (rev 36588) @@ -2,6 +2,8 @@ * Copyright 2003, Jérôme Duval. All rights reserved. * Distributed under the terms of the MIT License. */ +#ifndef _MEDIA_FILES_MANAGER_H +#define _MEDIA_FILES_MANAGER_H #include <map> @@ -12,7 +14,7 @@ #include <MessageRunner.h> #include <String.h> -#include <DataExchange.h> +#include "DataExchange.h" #define MEDIA_FILES_MANAGER_SAVE_TIMER 'mmst' @@ -70,3 +72,5 @@ TypeMap fMap; BMessageRunner* fSaveTimerRunner; }; + +#endif // _MEDIA_FILES_MANAGER_H Modified: haiku/trunk/src/servers/media/NotificationManager.h =================================================================== --- haiku/trunk/src/servers/media/NotificationManager.h 2010-05-02 18:00:20 UTC (rev 36587) +++ haiku/trunk/src/servers/media/NotificationManager.h 2010-05-02 22:35:18 UTC (rev 36588) @@ -1,10 +1,11 @@ -/* +/* * Copyright 2002, Marcus Overhagen. All rights reserved. * Distributed under the terms of the MIT License. */ #ifndef NOTIFICATION_MANAGER_H #define NOTIFICATION_MANAGER_H + #include <Locker.h> #include <MediaNode.h> #include <Messenger.h> @@ -24,9 +25,9 @@ public: NotificationManager(); ~NotificationManager(); - + void Dump(); - + void EnqueueMessage(BMessage* message); void CleanupTeam(team_id team);