BControllable: Fix real_time and perf_time mismatch
* It caused parameters to change with delay, because the event has been enqueued in the event queue with real time. * Please don't rely on system_time. * Fixes #5106.
This commit is contained in:
@@ -39,6 +39,7 @@
|
|||||||
#include <OS.h>
|
#include <OS.h>
|
||||||
#include <ParameterWeb.h>
|
#include <ParameterWeb.h>
|
||||||
#include <Roster.h>
|
#include <Roster.h>
|
||||||
|
#include <TimeSource.h>
|
||||||
|
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <DataExchange.h>
|
#include <DataExchange.h>
|
||||||
@@ -233,7 +234,16 @@ BControllable::HandleMessage(int32 message, const void* data, size_t size)
|
|||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
SetParameterValue(request.parameter_id, request.when,
|
// NOTE: This is not very fair, but the alternative
|
||||||
|
// would have been to mess with friends classes and
|
||||||
|
// member variables.
|
||||||
|
bigtime_t perfTime = 0;
|
||||||
|
if (request.when == -1)
|
||||||
|
perfTime = TimeSource()->Now();
|
||||||
|
else
|
||||||
|
perfTime = request.when;
|
||||||
|
|
||||||
|
SetParameterValue(request.parameter_id, perfTime,
|
||||||
transfer.Data(), request.size);
|
transfer.Data(), request.size);
|
||||||
request.SendReply(B_OK, &reply, sizeof(reply));
|
request.SendReply(B_OK, &reply, sizeof(reply));
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|||||||
@@ -650,7 +650,7 @@ ContinuousMessageFilter::Filter(BMessage *message, BHandler **target)
|
|||||||
"channels\n", fControl->Name(), fParameter.CountChannels());
|
"channels\n", fControl->Name(), fParameter.CountChannels());
|
||||||
|
|
||||||
if (fParameter.SetValue((void *)value, sizeof(value),
|
if (fParameter.SetValue((void *)value, sizeof(value),
|
||||||
system_time()) < B_OK) {
|
-1) < B_OK) {
|
||||||
ERROR("ContinuousMessageFilter::Filter: Could not set parameter "
|
ERROR("ContinuousMessageFilter::Filter: Could not set parameter "
|
||||||
"value for %p\n", &fParameter);
|
"value for %p\n", &fParameter);
|
||||||
return B_DISPATCH_MESSAGE;
|
return B_DISPATCH_MESSAGE;
|
||||||
@@ -760,7 +760,7 @@ DiscreteMessageFilter::Filter(BMessage *message, BHandler **target)
|
|||||||
|
|
||||||
TRACE("DiscreteMessageFilter::Filter: update view %s, value = %ld\n", control->Name(), value);
|
TRACE("DiscreteMessageFilter::Filter: update view %s, value = %ld\n", control->Name(), value);
|
||||||
|
|
||||||
if (fParameter.SetValue((void *)&value, sizeof(value), system_time()) < B_OK) {
|
if (fParameter.SetValue((void *)&value, sizeof(value), -1) < B_OK) {
|
||||||
ERROR("DiscreteMessageFilter::Filter: Could not set parameter value for %p\n", &fParameter);
|
ERROR("DiscreteMessageFilter::Filter: Could not set parameter value for %p\n", &fParameter);
|
||||||
return B_DISPATCH_MESSAGE;
|
return B_DISPATCH_MESSAGE;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user