media_server: No need to call Roster() every time

This commit is contained in:
Dario Casalinuovo
2015-08-28 18:27:16 +02:00
parent 1c3d7e0c68
commit 5d8765c0af
2 changed files with 47 additions and 37 deletions
+45 -37
View File
@@ -11,7 +11,6 @@
#include <File.h> #include <File.h>
#include <FindDirectory.h> #include <FindDirectory.h>
#include <MediaNode.h> #include <MediaNode.h>
#include <MediaRoster.h>
#include <OS.h> #include <OS.h>
#include <Path.h> #include <Path.h>
#include <TimeSource.h> #include <TimeSource.h>
@@ -46,7 +45,8 @@ const char *kDefaultManagerSettingsFile = "MDefaultManager";
DefaultManager::DefaultManager() DefaultManager::DefaultManager()
: fMixerConnected(false), :
fMixerConnected(false),
fPhysicalVideoOut(-1), fPhysicalVideoOut(-1),
fPhysicalVideoIn(-1), fPhysicalVideoIn(-1),
fPhysicalAudioOut(-1), fPhysicalAudioOut(-1),
@@ -57,7 +57,8 @@ DefaultManager::DefaultManager()
fPhysicalAudioOutInputID(0), fPhysicalAudioOutInputID(0),
fRescanThread(-1), fRescanThread(-1),
fRescanRequested(0), fRescanRequested(0),
fRescanLock("rescan default manager") fRescanLock("rescan default manager"),
fRoster(NULL)
{ {
strcpy(fPhysicalAudioOutInputName, "default"); strcpy(fPhysicalAudioOutInputName, "default");
fBeginHeader[0] = 0xab00150b; fBeginHeader[0] = 0xab00150b;
@@ -66,6 +67,10 @@ DefaultManager::DefaultManager()
fEndHeader[0] = 0x7465726d; fEndHeader[0] = 0x7465726d;
fEndHeader[1] = 0x6d666c67; fEndHeader[1] = 0x6d666c67;
fEndHeader[2] = 0x00000002; fEndHeader[2] = 0x00000002;
fRoster = BMediaRoster::Roster();
if (fRoster == NULL)
TRACE("DefaultManager: The roster is NULL\n");
} }
@@ -393,7 +398,7 @@ DefaultManager::_RescanThread()
// Connect the mixer and physical audio out (soundcard) // Connect the mixer and physical audio out (soundcard)
if (!fMixerConnected && fAudioMixer != -1 && fPhysicalAudioOut != -1) { if (!fMixerConnected && fAudioMixer != -1 && fPhysicalAudioOut != -1) {
fMixerConnected = B_OK == _ConnectMixerToOutput(); fMixerConnected = _ConnectMixerToOutput() == B_OK;
if (!fMixerConnected) if (!fMixerConnected)
TRACE("DefaultManager: failed to connect mixer and " TRACE("DefaultManager: failed to connect mixer and "
"soundcard\n"); "soundcard\n");
@@ -455,7 +460,7 @@ DefaultManager::_FindPhysical(volatile media_node_id *id, uint32 default_type,
memset(&format, 0, sizeof(format)); memset(&format, 0, sizeof(format));
format.type = type; format.type = type;
count = MAX_NODE_INFOS; count = MAX_NODE_INFOS;
rv = BMediaRoster::Roster()->GetLiveNodes(&info[0], &count, rv = fRoster->GetLiveNodes(&info[0], &count,
isInput ? NULL : &format, isInput ? &format : NULL, NULL, isInput ? NULL : &format, isInput ? &format : NULL, NULL,
isInput ? B_BUFFER_PRODUCER | B_PHYSICAL_INPUT isInput ? B_BUFFER_PRODUCER | B_PHYSICAL_INPUT
: B_BUFFER_CONSUMER | B_PHYSICAL_OUTPUT); : B_BUFFER_CONSUMER | B_PHYSICAL_OUTPUT);
@@ -493,7 +498,7 @@ DefaultManager::_FindPhysical(volatile media_node_id *id, uint32 default_type,
} }
if (msg) { // we have a default info msg if (msg) { // we have a default info msg
dormant_node_info dninfo; dormant_node_info dninfo;
if (BMediaRoster::Roster()->GetDormantNodeFor(info[i].node, if (fRoster->GetDormantNodeFor(info[i].node,
&dninfo) != B_OK) { &dninfo) != B_OK) {
ERROR("Couldn't GetDormantNodeFor\n"); ERROR("Couldn't GetDormantNodeFor\n");
continue; continue;
@@ -533,17 +538,17 @@ DefaultManager::_FindTimeSource()
*/ */
if (fPhysicalAudioOut != -1) { if (fPhysicalAudioOut != -1) {
media_node clone; media_node clone;
if (B_OK == BMediaRoster::Roster()->GetNodeFor(fPhysicalAudioOut, if (fRoster->GetNodeFor(fPhysicalAudioOut,
&clone)) { &clone) == B_OK) {
if (clone.kind & B_TIME_SOURCE) { if (clone.kind & B_TIME_SOURCE) {
fTimeSource = clone.node; fTimeSource = clone.node;
BMediaRoster::Roster()->StartTimeSource(clone, fRoster->StartTimeSource(clone,
system_time() + 1000); system_time() + 1000);
BMediaRoster::Roster()->ReleaseNode(clone); fRoster->ReleaseNode(clone);
TRACE("Default DAC timesource created!\n"); TRACE("Default DAC timesource created!\n");
return; return;
} }
BMediaRoster::Roster()->ReleaseNode(clone); fRoster->ReleaseNode(clone);
} else { } else {
TRACE("Default DAC is not a timesource!\n"); TRACE("Default DAC is not a timesource!\n");
} }
@@ -556,7 +561,7 @@ DefaultManager::_FindTimeSource()
memset(&input, 0, sizeof(input)); memset(&input, 0, sizeof(input));
input.type = B_MEDIA_RAW_AUDIO; input.type = B_MEDIA_RAW_AUDIO;
count = MAX_NODE_INFOS; count = MAX_NODE_INFOS;
rv = BMediaRoster::Roster()->GetLiveNodes(&info[0], &count, &input, NULL, NULL, rv = fRoster->GetLiveNodes(&info[0], &count, &input, NULL, NULL,
B_TIME_SOURCE | B_PHYSICAL_OUTPUT); B_TIME_SOURCE | B_PHYSICAL_OUTPUT);
if (rv == B_OK && count >= 1) { if (rv == B_OK && count >= 1) {
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
@@ -573,7 +578,7 @@ DefaultManager::_FindTimeSource()
continue; continue;
TRACE("Default DAC timesource \"%s\" created!\n", info[i].name); TRACE("Default DAC timesource \"%s\" created!\n", info[i].name);
fTimeSource = info[i].node.node; fTimeSource = info[i].node.node;
BMediaRoster::Roster()->StartTimeSource(info[i].node, fRoster->StartTimeSource(info[i].node,
system_time() + 1000); system_time() + 1000);
return; return;
} }
@@ -593,8 +598,11 @@ DefaultManager::_FindAudioMixer()
int32 count; int32 count;
status_t rv; status_t rv;
if (fRoster == NULL)
fRoster = BMediaRoster::Roster();
count = 1; count = 1;
rv = BMediaRoster::Roster()->GetLiveNodes(&info, &count, NULL, NULL, NULL, rv = fRoster->GetLiveNodes(&info, &count, NULL, NULL, NULL,
B_BUFFER_PRODUCER | B_BUFFER_CONSUMER | B_SYSTEM_MIXER); B_BUFFER_PRODUCER | B_BUFFER_CONSUMER | B_SYSTEM_MIXER);
if (rv != B_OK || count != 1) { if (rv != B_OK || count != 1) {
TRACE("Couldn't find audio mixer node\n"); TRACE("Couldn't find audio mixer node\n");
@@ -608,7 +616,6 @@ DefaultManager::_FindAudioMixer()
status_t status_t
DefaultManager::_ConnectMixerToOutput() DefaultManager::_ConnectMixerToOutput()
{ {
BMediaRoster *roster;
media_node timesource; media_node timesource;
media_node mixer; media_node mixer;
media_node soundcard; media_node soundcard;
@@ -623,18 +630,19 @@ DefaultManager::_ConnectMixerToOutput()
int32 count; int32 count;
status_t rv; status_t rv;
roster = BMediaRoster::Roster(); if (fRoster == NULL)
fRoster = BMediaRoster::Roster();
rv = roster->GetNodeFor(fPhysicalAudioOut, &soundcard); rv = fRoster->GetNodeFor(fPhysicalAudioOut, &soundcard);
if (rv != B_OK) { if (rv != B_OK) {
TRACE("DefaultManager: failed to find soundcard (physical audio " TRACE("DefaultManager: failed to find soundcard (physical audio "
"output)\n"); "output)\n");
return B_ERROR; return B_ERROR;
} }
rv = roster->GetNodeFor(fAudioMixer, &mixer); rv = fRoster->GetNodeFor(fAudioMixer, &mixer);
if (rv != B_OK) { if (rv != B_OK) {
roster->ReleaseNode(soundcard); fRoster->ReleaseNode(soundcard);
TRACE("DefaultManager: failed to find mixer\n"); TRACE("DefaultManager: failed to find mixer\n");
return B_ERROR; return B_ERROR;
} }
@@ -642,7 +650,7 @@ DefaultManager::_ConnectMixerToOutput()
// we now have the mixer and soundcard nodes, // we now have the mixer and soundcard nodes,
// find a free input/output and connect them // find a free input/output and connect them
rv = roster->GetFreeOutputsFor(mixer, &output, 1, &count, rv = fRoster->GetFreeOutputsFor(mixer, &output, 1, &count,
B_MEDIA_RAW_AUDIO); B_MEDIA_RAW_AUDIO);
if (rv != B_OK || count != 1) { if (rv != B_OK || count != 1) {
TRACE("DefaultManager: can't find free mixer output\n"); TRACE("DefaultManager: can't find free mixer output\n");
@@ -650,7 +658,7 @@ DefaultManager::_ConnectMixerToOutput()
goto finish; goto finish;
} }
rv = roster->GetFreeInputsFor(soundcard, inputs, MAX_INPUT_INFOS, &count, rv = fRoster->GetFreeInputsFor(soundcard, inputs, MAX_INPUT_INFOS, &count,
B_MEDIA_RAW_AUDIO); B_MEDIA_RAW_AUDIO);
if (rv != B_OK || count < 1) { if (rv != B_OK || count < 1) {
TRACE("DefaultManager: can't find free soundcard inputs\n"); TRACE("DefaultManager: can't find free soundcard inputs\n");
@@ -668,7 +676,7 @@ DefaultManager::_ConnectMixerToOutput()
switch (i) { switch (i) {
case 0: case 0:
TRACE("DefaultManager: Trying connect in native format (1)\n"); TRACE("DefaultManager: Trying connect in native format (1)\n");
if (B_OK != roster->GetFormatFor(input, &format)) { if (fRoster->GetFormatFor(input, &format) != B_OK) {
ERROR("DefaultManager: GetFormatFor failed\n"); ERROR("DefaultManager: GetFormatFor failed\n");
continue; continue;
} }
@@ -706,7 +714,7 @@ DefaultManager::_ConnectMixerToOutput()
case 4: case 4:
// BeOS R5 multiaudio node bug workaround // BeOS R5 multiaudio node bug workaround
TRACE("DefaultManager: Trying connect in native format (2)\n"); TRACE("DefaultManager: Trying connect in native format (2)\n");
if (B_OK != roster->GetFormatFor(input, &format)) { if (fRoster->GetFormatFor(input, &format) != B_OK) {
ERROR("DefaultManager: GetFormatFor failed\n"); ERROR("DefaultManager: GetFormatFor failed\n");
continue; continue;
} }
@@ -718,7 +726,7 @@ DefaultManager::_ConnectMixerToOutput()
break; break;
} }
rv = roster->Connect(output.source, input.destination, &format, rv = fRoster->Connect(output.source, input.destination, &format,
&newoutput, &newinput); &newoutput, &newinput);
if (rv == B_OK) if (rv == B_OK)
break; break;
@@ -728,25 +736,25 @@ DefaultManager::_ConnectMixerToOutput()
goto finish; goto finish;
} }
roster->SetRunModeNode(mixer, BMediaNode::B_INCREASE_LATENCY); fRoster->SetRunModeNode(mixer, BMediaNode::B_INCREASE_LATENCY);
roster->SetRunModeNode(soundcard, BMediaNode::B_RECORDING); fRoster->SetRunModeNode(soundcard, BMediaNode::B_RECORDING);
roster->GetTimeSource(&timesource); fRoster->GetTimeSource(&timesource);
roster->SetTimeSourceFor(mixer.node, timesource.node); fRoster->SetTimeSourceFor(mixer.node, timesource.node);
roster->SetTimeSourceFor(soundcard.node, timesource.node); fRoster->SetTimeSourceFor(soundcard.node, timesource.node);
roster->PrerollNode(mixer); fRoster->PrerollNode(mixer);
roster->PrerollNode(soundcard); fRoster->PrerollNode(soundcard);
ts = roster->MakeTimeSourceFor(mixer); ts = fRoster->MakeTimeSourceFor(mixer);
start_at = ts->Now() + 50000; start_at = ts->Now() + 50000;
roster->StartNode(mixer, start_at); fRoster->StartNode(mixer, start_at);
roster->StartNode(soundcard, start_at); fRoster->StartNode(soundcard, start_at);
ts->Release(); ts->Release();
finish: finish:
roster->ReleaseNode(mixer); fRoster->ReleaseNode(mixer);
roster->ReleaseNode(soundcard); fRoster->ReleaseNode(soundcard);
roster->ReleaseNode(timesource); fRoster->ReleaseNode(timesource);
return rv; return rv;
} }
+2
View File
@@ -21,6 +21,7 @@
#include "DataExchange.h" #include "DataExchange.h"
#include <Autolock.h> #include <Autolock.h>
#include <MediaRoster.h>
#include <Message.h> #include <Message.h>
class NodeManager; class NodeManager;
@@ -76,6 +77,7 @@ private:
thread_id fRescanThread; thread_id fRescanThread;
int32 fRescanRequested; int32 fRescanRequested;
BLocker fRescanLock; BLocker fRescanLock;
BMediaRoster* fRoster;
}; };
#endif // _DEFAULT_MANAGER_H #endif // _DEFAULT_MANAGER_H