@@ -1002,7 +1002,7 @@ protected: | |||
CARLA_SAFE_ASSERT_RETURN(fIsRunning,); | |||
CARLA_SAFE_ASSERT_RETURN(fUiServer.isOk(),); | |||
const EngineOptions& options(getOptions()); | |||
const EngineOptions& options(pData->options); | |||
const CarlaMutexLocker cml(fUiServer.getWriteLock()); | |||
std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_PROCESS_MODE); | |||
@@ -1270,13 +1270,6 @@ protected: | |||
{ | |||
const PendingRtEventsRunner prt(this); | |||
if (pData->curPluginCount == 0 && ! kIsPatchbay) | |||
{ | |||
FloatVectorOperations::copy(outBuffer[0], inBuffer[0], static_cast<int>(frames)); | |||
FloatVectorOperations::copy(outBuffer[1], inBuffer[1], static_cast<int>(frames)); | |||
return; | |||
} | |||
// --------------------------------------------------------------- | |||
// Time Info | |||
@@ -1303,6 +1296,16 @@ protected: | |||
pData->timeInfo.bbt.beatsPerMinute = timeInfo->bbt.beatsPerMinute; | |||
} | |||
// --------------------------------------------------------------- | |||
// Do nothing if no plugins and rack mode | |||
if (pData->curPluginCount == 0 && ! kIsPatchbay) | |||
{ | |||
FloatVectorOperations::copy(outBuffer[0], inBuffer[0], static_cast<int>(frames)); | |||
FloatVectorOperations::copy(outBuffer[1], inBuffer[1], static_cast<int>(frames)); | |||
return; | |||
} | |||
// --------------------------------------------------------------- | |||
// initialize events | |||
@@ -1451,9 +1454,29 @@ protected: | |||
return; | |||
{ | |||
const EngineTimeInfo& timeInfo(pData->timeInfo); | |||
const CarlaMutexLocker cml(fUiServer.getWriteLock()); | |||
const ScopedLocale csl; | |||
// send transport | |||
fUiServer.writeAndFixMsg("transport"); | |||
fUiServer.writeAndFixMsg(bool2str(timeInfo.playing)); | |||
if (timeInfo.valid & EngineTimeInfo::kValidBBT) | |||
{ | |||
std::sprintf(fTmpBuf, P_UINT64 ":%i:%i:%i\n", timeInfo.frame, timeInfo.bbt.bar, timeInfo.bbt.beat, timeInfo.bbt.tick); | |||
fUiServer.writeMsg(fTmpBuf); | |||
std::sprintf(fTmpBuf, "%f\n", timeInfo.bbt.beatsPerMinute); | |||
fUiServer.writeMsg(fTmpBuf); | |||
} | |||
else | |||
{ | |||
std::sprintf(fTmpBuf, P_UINT64 ":0:0:0\n", timeInfo.frame); | |||
fUiServer.writeMsg(fTmpBuf); | |||
fUiServer.writeMsg("0.0\n"); | |||
} | |||
// send peaks and param outputs for all plugins | |||
for (uint i=0; i < pData->curPluginCount; ++i) | |||
{ | |||
const EnginePluginData& plugData(pData->plugins[i]); | |||
@@ -3204,6 +3204,16 @@ class CarlaHostPlugin(CarlaHostMeta): | |||
self.fSupportedFileExts = fileexts | |||
self.fMaxPluginNumber = maxnum | |||
def _set_transport(self, playing, frame, bar, beat, tick, bpm): | |||
self.fTransportInfo = { | |||
"playing": playing, | |||
"frame": frame, | |||
"bar": bar, | |||
"beat": beat, | |||
"tick": tick, | |||
"bpm": bpm | |||
} | |||
def _add(self, pluginId): | |||
if len(self.fPluginsInfo) != pluginId: | |||
return | |||
@@ -58,7 +58,7 @@ class CarlaPanelTime(QDialog): | |||
self.fLastTransportFrame = 0 | |||
self.fLastTransportState = False | |||
self.fSampleRate = host.get_sample_rate() if host.is_engine_running() else 0.0 | |||
self.fSampleRate = 0.0 | |||
#if view == TRANSPORT_VIEW_HMS: | |||
#self.fCurTransportView = TRANSPORT_VIEW_HMS | |||
@@ -90,17 +90,12 @@ class CarlaPanelTime(QDialog): | |||
host.EngineStartedCallback.connect(self.slot_handleEngineStartedCallback) | |||
host.SampleRateChangedCallback.connect(self.slot_handleSampleRateChangedCallback) | |||
# ---------------------------------------------------------------------------------------------------- | |||
# Final setup | |||
self.refreshTransport(True) | |||
# -------------------------------------------------------------------------------------------------------- | |||
# Button actions | |||
@pyqtSlot(bool) | |||
def slot_transportPlayPause(self, toggled): | |||
if not self.host.is_engine_running(): | |||
if self.host.isPlugin or not self.host.is_engine_running(): | |||
return | |||
if toggled: | |||
@@ -112,7 +107,7 @@ class CarlaPanelTime(QDialog): | |||
@pyqtSlot() | |||
def slot_transportStop(self): | |||
if not self.host.is_engine_running(): | |||
if self.host.isPlugin or not self.host.is_engine_running(): | |||
return | |||
self.host.transport_pause() | |||
@@ -122,7 +117,7 @@ class CarlaPanelTime(QDialog): | |||
@pyqtSlot() | |||
def slot_transportBackwards(self): | |||
if not self.host.is_engine_running(): | |||
if self.host.isPlugin or not self.host.is_engine_running(): | |||
return | |||
newFrame = self.host.get_current_transport_frame() - 100000 | |||
@@ -134,7 +129,7 @@ class CarlaPanelTime(QDialog): | |||
@pyqtSlot() | |||
def slot_transportForwards(self): | |||
if self.fSampleRate == 0.0 or not self.host.is_engine_running(): | |||
if self.fSampleRate == 0.0 or self.host.isPlugin or not self.host.is_engine_running(): | |||
return | |||
newFrame = self.host.get_current_transport_frame() + int(self.fSampleRate*2.5) | |||
@@ -331,6 +331,12 @@ class CarlaMiniW(ExternalUI, HostWindow): | |||
srate = float(self.readlineblock()) | |||
self.host.fSampleRate = srate | |||
elif msg == "transport": | |||
playing = bool(self.readlineblock() == "true") | |||
frame, bar, beat, tick = [int(i) for i in self.readlineblock().split(":")] | |||
bpm = float(self.readlineblock()) | |||
self.host._set_transport(playing, frame, bar, beat, tick, bpm) | |||
elif msg == "error": | |||
error = self.readlineblock().replace("\r", "\n") | |||
engineCallback(self.host, ENGINE_CALLBACK_ERROR, 0, 0, 0, 0.0, error) | |||