From f441a1e2cec24cabb799632ff3603b095b2e33b9 Mon Sep 17 00:00:00 2001 From: Dario Casalinuovo Date: Thu, 7 Apr 2016 15:57:45 +0200 Subject: [PATCH] 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. --- src/kits/media/Controllable.cpp | 12 +++++++++++- src/kits/media/DefaultMediaTheme.cpp | 4 ++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/kits/media/Controllable.cpp b/src/kits/media/Controllable.cpp index d2e505a21e..6c722245e5 100644 --- a/src/kits/media/Controllable.cpp +++ b/src/kits/media/Controllable.cpp @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -233,7 +234,16 @@ BControllable::HandleMessage(int32 message, const void* data, size_t size) 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); request.SendReply(B_OK, &reply, sizeof(reply)); return B_OK; diff --git a/src/kits/media/DefaultMediaTheme.cpp b/src/kits/media/DefaultMediaTheme.cpp index 529be6c566..3994e63382 100644 --- a/src/kits/media/DefaultMediaTheme.cpp +++ b/src/kits/media/DefaultMediaTheme.cpp @@ -650,7 +650,7 @@ ContinuousMessageFilter::Filter(BMessage *message, BHandler **target) "channels\n", fControl->Name(), fParameter.CountChannels()); if (fParameter.SetValue((void *)value, sizeof(value), - system_time()) < B_OK) { + -1) < B_OK) { ERROR("ContinuousMessageFilter::Filter: Could not set parameter " "value for %p\n", &fParameter); 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); - 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); return B_DISPATCH_MESSAGE; }