Commit 269e28be authored by sletz's avatar sletz
Browse files

Checking in the server to avoid calling the clients if no callback are registered.

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@1491 0c269be4-1314-0410-8aa9-9f06e86f4224
parent cf05be16
......@@ -2,6 +2,14 @@
Jackdmp changes log
---------------------------
2007-06-09 Stephane Letz <letz@grame.fr>
* Checking in the server to avoid calling the clients if no callback are registered.
2007-06-08 Stephane Letz <letz@grame.fr>
* New JackNotication.h header in preparation for callback checking in the server.
2007-05-29 Stephane Letz <letz@grame.fr>
* Add "callback exiting" and "jack_frame_time" tests in jack_test.
......
......@@ -135,23 +135,6 @@ class JackNotifyChannelInterface
virtual void ClientNotify(int refnum, const char* name, int notify, int sync, int value, int* result)
{}
/*
enum NotificationType {
kAddClient = 0,
kRemoveClient = 1,
kActivateClient = 2,
kXRunCallback = 3,
kGraphOrderCallback = 4,
kBufferSizeCallback = 5,
kStartFreewheel = 6,
kStopFreewheel = 7,
kPortRegistrationOn = 8,
kPortRegistrationOff = 9,
kZombifyClient = 10,
kDeadClient = 11,
kMaxType
};
*/
};
/*!
......
......@@ -175,7 +175,7 @@ int JackClient::ClientNotify(int refnum, const char* name, int notify, int sync,
res = fGraphOrder(fGraphOrderArg);
break;
case kStartFreewheel:
case kStartFreewheelCallback:
JackLog("JackClient::kStartFreewheel\n");
SetupDriverSync(true);
fThread->DropRealTime();
......@@ -183,7 +183,7 @@ int JackClient::ClientNotify(int refnum, const char* name, int notify, int sync,
fFreewheel(1, fFreewheelArg);
break;
case kStopFreewheel:
case kStopFreewheelCallback:
JackLog("JackClient::kStopFreewheel\n");
SetupDriverSync(false);
if (fFreewheel)
......@@ -191,13 +191,13 @@ int JackClient::ClientNotify(int refnum, const char* name, int notify, int sync,
fThread->AcquireRealTime();
break;
case kPortRegistrationOn:
case kPortRegistrationOnCallback:
JackLog("JackClient::kPortRegistrationOn port_index = %ld\n", value);
if (fPortRegistration)
fPortRegistration(value, 1, fPortRegistrationArg);
break;
case kPortRegistrationOff:
case kPortRegistrationOffCallback:
JackLog("JackClient::kPortRegistrationOff port_index = %ld \n", value);
if (fPortRegistration)
fPortRegistration(value, 0, fPortRegistrationArg);
......@@ -732,6 +732,7 @@ int JackClient::SetXRunCallback(JackXRunCallback callback, void *arg)
jack_error("You cannot set callbacks on an active client");
return -1;
} else {
GetClientControl()->fCallback[kXRunCallback] = (callback != NULL);
fXrunArg = arg;
fXrun = callback;
return 0;
......@@ -758,6 +759,7 @@ int JackClient::SetGraphOrderCallback(JackGraphOrderCallback callback, void *arg
jack_error("You cannot set callbacks on an active client");
return -1;
} else {
GetClientControl()->fCallback[kGraphOrderCallback] = (callback != NULL);
fGraphOrder = callback;
fGraphOrderArg = arg;
return 0;
......@@ -770,6 +772,7 @@ int JackClient::SetBufferSizeCallback(JackBufferSizeCallback callback, void *arg
jack_error("You cannot set callbacks on an active client");
return -1;
} else {
GetClientControl()->fCallback[kBufferSizeCallback] = (callback != NULL);
fBufferSizeArg = arg;
fBufferSize = callback;
return 0;
......@@ -782,7 +785,8 @@ int JackClient::SetClientRegistrationCallback(JackClientRegistrationCallback cal
jack_error("You cannot set callbacks on an active client");
return -1;
} else {
fPortRegistrationArg = arg;
// kAddClient and kRemoveClient notifications must be delivered by the server in any case
fClientRegistrationArg = arg;
fClientRegistration = callback;
return 0;
}
......@@ -794,6 +798,8 @@ int JackClient::SetFreewheelCallback(JackFreewheelCallback callback, void *arg)
jack_error("You cannot set callbacks on an active client");
return -1;
} else {
GetClientControl()->fCallback[kStartFreewheelCallback] = (callback != NULL);
GetClientControl()->fCallback[kStopFreewheelCallback] = (callback != NULL);
fFreewheelArg = arg;
fFreewheel = callback;
return 0;
......@@ -806,6 +812,8 @@ int JackClient::SetPortRegistrationCallback(JackPortRegistrationCallback callbac
jack_error("You cannot set callbacks on an active client");
return -1;
} else {
GetClientControl()->fCallback[kPortRegistrationOnCallback] = (callback != NULL);
GetClientControl()->fCallback[kPortRegistrationOffCallback] = (callback != NULL);
fPortRegistrationArg = arg;
fPortRegistration = callback;
return 0;
......
......@@ -248,7 +248,7 @@ void JackEngine::NotifyClient(int refnum, int event, int sync, int value)
{
JackClientInterface* client = fClientTable[refnum];
// The client may be notified by the RT thread while closing
if (client) {
if (client && client->GetClientControl()->fCallback[event]) {
if (client->ClientNotify(refnum, client->GetClientControl()->fName, event, sync, value) < 0)
jack_error("NotifyClient fails name = %s event = %ld = val = %ld", client->GetClientControl()->fName, event, value);
} else {
......@@ -260,7 +260,7 @@ void JackEngine::NotifyClients(int event, int sync, int value)
{
for (int i = 0; i < CLIENT_NUM; i++) {
JackClientInterface* client = fClientTable[i];
if (client && (client->ClientNotify(i, client->GetClientControl()->fName, event, sync, value) < 0)) {
if (client && client->GetClientControl()->fCallback[event] && (client->ClientNotify(i, client->GetClientControl()->fName, event, sync, value) < 0)) {
jack_error("NotifyClient fails name = %s event = %ld = val = %ld", client->GetClientControl()->fName, event, value);
}
}
......@@ -327,12 +327,12 @@ void JackEngine::NotifyBufferSize(jack_nframes_t nframes)
void JackEngine::NotifyFreewheel(bool onoff)
{
fEngineControl->fRealTime = !onoff;
NotifyClients((onoff ? kStartFreewheel : kStopFreewheel), true, 0);
NotifyClients((onoff ? kStartFreewheelCallback : kStopFreewheelCallback), true, 0);
}
void JackEngine::NotifyPortRegistation(jack_port_id_t port_index, bool onoff)
{
NotifyClients((onoff ? kPortRegistrationOn : kPortRegistrationOff), false, port_index);
NotifyClients((onoff ? kPortRegistrationOnCallback : kPortRegistrationOffCallback), false, port_index);
}
void JackEngine::NotifyActivate(int refnum)
......
......@@ -29,10 +29,10 @@ namespace Jack
kXRunCallback = 3,
kGraphOrderCallback = 4,
kBufferSizeCallback = 5,
kStartFreewheel = 6,
kStopFreewheel = 7,
kPortRegistrationOn = 8,
kPortRegistrationOff = 9,
kStartFreewheelCallback = 6,
kStopFreewheelCallback = 7,
kPortRegistrationOnCallback = 8,
kPortRegistrationOffCallback = 9,
kZombifyClient = 10,
kDeadClient = 11,
kMaxNotification
......
......@@ -39,9 +39,7 @@ namespace Jack
struct JackRequest
{
public:
typedef enum {
enum RequestType {
kRegisterPort = 1,
kUnRegisterPort = 2,
kConnectPorts = 3,
......@@ -65,7 +63,7 @@ public:
kDisconnectNamePorts = 25,
kNotification = 26
} RequestType;
};
RequestType fType;
......
......@@ -23,6 +23,7 @@ This program is free software; you can redistribute it and/or modify
#include "JackServer.h"
#include "JackMachThread.h"
#include "JackEngine.h"
#include "JackNotification.h"
using namespace std;
......@@ -114,7 +115,7 @@ void JackMachServerChannel::KillClient(mach_port_t private_port)
JackLog("JackMachServerChannel::KillClient\n");
int refnum = fClientTable[private_port];
assert(refnum > 0);
fServer->Notify(refnum, JackNotifyChannelInterface::kDeadClient, 0);
fServer->Notify(refnum, kDeadClient, 0);
fClientTable.erase(private_port);
// Hum, hum....
......
......@@ -492,6 +492,7 @@
4B9B815C08AFA45000D05A28 /* JackRequest.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackRequest.h; path = ../common/JackRequest.h; sourceTree = SOURCE_ROOT; };
4BA577BC08BF8BE200F82DE1 /* testSynchroClient.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = testSynchroClient.cpp; path = ../tests/testSynchroClient.cpp; sourceTree = SOURCE_ROOT; };
4BA577FB08BF8E4600F82DE1 /* testSynchroServer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = testSynchroServer.cpp; path = ../tests/testSynchroServer.cpp; sourceTree = SOURCE_ROOT; };
4BB371D40C1AD85A0050C1E4 /* JackNotification.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackNotification.h; path = ../common/JackNotification.h; sourceTree = SOURCE_ROOT; };
4BBD13CC08C71EB40079F7FF /* testSynchroServerClient.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = testSynchroServerClient.cpp; path = ../tests/testSynchroServerClient.cpp; sourceTree = SOURCE_ROOT; };
4BC216880A444BDE00BDA09F /* JackServerGlobals.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackServerGlobals.cpp; path = ../common/JackServerGlobals.cpp; sourceTree = SOURCE_ROOT; };
4BC2168D0A444BED00BDA09F /* JackServerGlobals.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackServerGlobals.h; path = ../common/JackServerGlobals.h; sourceTree = SOURCE_ROOT; };
......@@ -1026,6 +1027,7 @@
4BA550FF05E2423600569492 /* Channels */ = {
isa = PBXGroup;
children = (
4BB371D40C1AD85A0050C1E4 /* JackNotification.h */,
4BF8D1AF0834EEC400C94B91 /* JackChannel.h */,
4BF8D1B30834EED500C94B91 /* JackInternalClientChannel.h */,
4BFB299908AF452300D450D4 /* Socket */,
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment