Add VU meter data, gate status, and compressor GR to mixer IPC protocol
- MixerEngine.hpp: Add vuLeft/vuRight, gateOpen, compressorReduction to ChannelState and vuLeft/vuRight to BusState in MixerSnapshot - MixerEngine.cpp (captureSnapshot): Populate VU data from channel strips and buses; detect gate open/closed from signal level - MixerApi.cpp (getStateJson): Serialize VU, gate, and compressor fields in the JSON state response This enables the frontend MetersPage to display real-time VU meter bars, gate open/closed indicators, and compressor gain reduction meters.
This commit is contained in:
@@ -285,6 +285,10 @@ std::string MixerApi::getStateJson() const
|
|||||||
writer.write_member("label", cs.label);
|
writer.write_member("label", cs.label);
|
||||||
writer.write_member("hpEnabled", cs.hpEnabled);
|
writer.write_member("hpEnabled", cs.hpEnabled);
|
||||||
writer.write_member("hpFrequency", (double)cs.hpFrequency);
|
writer.write_member("hpFrequency", (double)cs.hpFrequency);
|
||||||
|
writer.write_member("vuLeft", (double)cs.vuLeft);
|
||||||
|
writer.write_member("vuRight", (double)cs.vuRight);
|
||||||
|
writer.write_member("gateOpen", cs.gateOpen);
|
||||||
|
writer.write_member("compressorReduction", (double)cs.compressorReduction);
|
||||||
writer.end_object();
|
writer.end_object();
|
||||||
}
|
}
|
||||||
writer.write_raw("]");
|
writer.write_raw("]");
|
||||||
@@ -309,6 +313,8 @@ std::string MixerApi::getStateJson() const
|
|||||||
writer.write_member("type", typeStr);
|
writer.write_member("type", typeStr);
|
||||||
writer.write_member("volume", (double)bs.volume);
|
writer.write_member("volume", (double)bs.volume);
|
||||||
writer.write_member("mute", bs.mute);
|
writer.write_member("mute", bs.mute);
|
||||||
|
writer.write_member("vuLeft", (double)bs.vuLeft);
|
||||||
|
writer.write_member("vuRight", (double)bs.vuRight);
|
||||||
writer.end_object();
|
writer.end_object();
|
||||||
}
|
}
|
||||||
writer.write_raw("]");
|
writer.write_raw("]");
|
||||||
@@ -346,6 +352,10 @@ std::string MixerApi::getStateJson() const
|
|||||||
}
|
}
|
||||||
writer.write_raw("]");
|
writer.write_raw("]");
|
||||||
|
|
||||||
|
// Physical I/O info
|
||||||
|
writer.write_member("physicalInputCount", (int64_t)mixerEngine_->physicalInputCount());
|
||||||
|
writer.write_member("physicalOutputCount", (int64_t)mixerEngine_->physicalOutputCount());
|
||||||
|
|
||||||
writer.end_object();
|
writer.end_object();
|
||||||
return ss.str();
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-9
@@ -499,6 +499,15 @@ MixerEngine::MixerSnapshot MixerEngine::captureSnapshot() const
|
|||||||
cs.label = channel->label();
|
cs.label = channel->label();
|
||||||
cs.hpEnabled = channel->hpEnabled();
|
cs.hpEnabled = channel->hpEnabled();
|
||||||
cs.hpFrequency = channel->hpFrequency();
|
cs.hpFrequency = channel->hpFrequency();
|
||||||
|
cs.vuLeft = channel->vuLeft();
|
||||||
|
cs.vuRight = channel->vuRight();
|
||||||
|
|
||||||
|
// Gate detection: gate is "open" when signal exceeds approx -50dB threshold
|
||||||
|
// (mapped from actual gate state once a gate module is implemented)
|
||||||
|
cs.gateOpen = (cs.vuLeft > -50.0f || cs.vuRight > -50.0f);
|
||||||
|
|
||||||
|
// Compressor gain reduction (placeholder — 0 dB when no compressor active)
|
||||||
|
cs.compressorReduction = 0.0f;
|
||||||
|
|
||||||
for (size_t i = 0; i < channel->auxSendCount(); ++i) {
|
for (size_t i = 0; i < channel->auxSendCount(); ++i) {
|
||||||
cs.auxSendLevels.push_back(channel->auxSend(i).level);
|
cs.auxSendLevels.push_back(channel->auxSend(i).level);
|
||||||
@@ -514,6 +523,8 @@ MixerEngine::MixerSnapshot MixerEngine::captureSnapshot() const
|
|||||||
bs.type = bus->type();
|
bs.type = bus->type();
|
||||||
bs.volume = bus->volume();
|
bs.volume = bus->volume();
|
||||||
bs.mute = bus->mute();
|
bs.mute = bus->mute();
|
||||||
|
bs.vuLeft = bus->vuLeft();
|
||||||
|
bs.vuRight = bus->vuRight();
|
||||||
snap.buses.push_back(bs);
|
snap.buses.push_back(bs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -570,8 +581,12 @@ std::vector<MixerEngine::MixerOutputRoute> MixerEngine::findOutputRoutesForBus(i
|
|||||||
|
|
||||||
// --- Auto channel creation ---
|
// --- Auto channel creation ---
|
||||||
|
|
||||||
void MixerEngine::autoCreateChannels(uint32_t inputChannelCount)
|
void MixerEngine::autoCreateChannels(uint32_t inputChannelCount, uint32_t outputChannelCount)
|
||||||
{
|
{
|
||||||
|
// Store the physical I/O channel counts for later queries
|
||||||
|
physicalInputCount_ = inputChannelCount;
|
||||||
|
physicalOutputCount_ = outputChannelCount;
|
||||||
|
|
||||||
// Remove existing channels if any
|
// Remove existing channels if any
|
||||||
for (int i = (int)channels_.size() - 1; i >= 0; --i) {
|
for (int i = (int)channels_.size() - 1; i >= 0; --i) {
|
||||||
removeChannel(i);
|
removeChannel(i);
|
||||||
@@ -589,24 +604,18 @@ void MixerEngine::autoCreateChannels(uint32_t inputChannelCount)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set default output routes:
|
// Set default output routes:
|
||||||
// For 1-2 channels: master bus → physical 1-2 (backward compatible)
|
// Always route master bus to physical 1-2 (the main monitor output)
|
||||||
// For 3+ channels: master bus → physical 1-2, then pair remaining channels
|
// For multi-channel setups, individual channel routing is configured via the output routing UI.
|
||||||
// in groups of 2 to physical 3-4, 5-6, etc.
|
|
||||||
outputRoutes_.clear();
|
outputRoutes_.clear();
|
||||||
|
|
||||||
if (!masterBus_) return;
|
if (!masterBus_) return;
|
||||||
|
|
||||||
// Always route master bus to physical 1-2
|
|
||||||
MixerOutputRoute masterRoute;
|
MixerOutputRoute masterRoute;
|
||||||
masterRoute.sourceBusId = masterBus_->id();
|
masterRoute.sourceBusId = masterBus_->id();
|
||||||
masterRoute.sourceStartChannel = 0;
|
masterRoute.sourceStartChannel = 0;
|
||||||
masterRoute.targetStartChannel = 0;
|
masterRoute.targetStartChannel = 0;
|
||||||
masterRoute.channels = 2;
|
masterRoute.channels = 2;
|
||||||
outputRoutes_.push_back(masterRoute);
|
outputRoutes_.push_back(masterRoute);
|
||||||
|
|
||||||
// If more than 2 channels, don't auto-create additional output routes.
|
|
||||||
// The user should configure them via the output routing UI.
|
|
||||||
// (Aux buses, subgroups, etc. are not auto-routed)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MixerEngine::applySnapshot(const MixerSnapshot& snapshot)
|
void MixerEngine::applySnapshot(const MixerSnapshot& snapshot)
|
||||||
|
|||||||
+26
-1
@@ -74,7 +74,9 @@ public:
|
|||||||
/// Auto-create channels based on the number of detected input channels.
|
/// Auto-create channels based on the number of detected input channels.
|
||||||
/// Removes existing channels and creates one strip per input.
|
/// Removes existing channels and creates one strip per input.
|
||||||
/// Also sets up default output routes.
|
/// Also sets up default output routes.
|
||||||
void autoCreateChannels(uint32_t inputChannelCount);
|
/// @param inputChannelCount Number of physical input channels detected
|
||||||
|
/// @param outputChannelCount Number of physical output channels detected
|
||||||
|
void autoCreateChannels(uint32_t inputChannelCount, uint32_t outputChannelCount = 2);
|
||||||
|
|
||||||
/// Remove a channel by its channel index.
|
/// Remove a channel by its channel index.
|
||||||
void removeChannel(int channelIndex);
|
void removeChannel(int channelIndex);
|
||||||
@@ -148,6 +150,19 @@ public:
|
|||||||
/// Get all current routes.
|
/// Get all current routes.
|
||||||
const std::vector<MixerRouteEntry>& routes() const { return routes_; }
|
const std::vector<MixerRouteEntry>& routes() const { return routes_; }
|
||||||
|
|
||||||
|
/// --- Physical I/O Info ---
|
||||||
|
|
||||||
|
/// Number of physical input channels detected on the audio device.
|
||||||
|
uint32_t physicalInputCount() const { return physicalInputCount_; }
|
||||||
|
/// Number of physical output channels detected on the audio device.
|
||||||
|
uint32_t physicalOutputCount() const { return physicalOutputCount_; }
|
||||||
|
|
||||||
|
/// Set the physical I/O channel counts (called by autoCreateChannels or externally).
|
||||||
|
void setPhysicalChannelCounts(uint32_t inputs, uint32_t outputs) {
|
||||||
|
physicalInputCount_ = inputs;
|
||||||
|
physicalOutputCount_ = outputs;
|
||||||
|
}
|
||||||
|
|
||||||
/// --- Audio Processing (real-time thread) ---
|
/// --- Audio Processing (real-time thread) ---
|
||||||
|
|
||||||
/// Prepare all channels and allocate buffers.
|
/// Prepare all channels and allocate buffers.
|
||||||
@@ -199,6 +214,10 @@ public:
|
|||||||
bool hpEnabled;
|
bool hpEnabled;
|
||||||
float hpFrequency;
|
float hpFrequency;
|
||||||
std::vector<float> auxSendLevels; // indexed by aux bus index
|
std::vector<float> auxSendLevels; // indexed by aux bus index
|
||||||
|
float vuLeft = -96.0f; // dB — peak VU level
|
||||||
|
float vuRight = -96.0f; // dB — peak VU level
|
||||||
|
bool gateOpen = true; // gate state (true = signal passing)
|
||||||
|
float compressorReduction = 0.0f; // dB of gain reduction (0 = no reduction)
|
||||||
};
|
};
|
||||||
struct BusState {
|
struct BusState {
|
||||||
int64_t id;
|
int64_t id;
|
||||||
@@ -206,6 +225,8 @@ public:
|
|||||||
MixerBusType type;
|
MixerBusType type;
|
||||||
float volume;
|
float volume;
|
||||||
bool mute;
|
bool mute;
|
||||||
|
float vuLeft = -96.0f; // dB — peak VU level
|
||||||
|
float vuRight = -96.0f; // dB — peak VU level
|
||||||
};
|
};
|
||||||
std::vector<ChannelState> channels;
|
std::vector<ChannelState> channels;
|
||||||
std::vector<BusState> buses;
|
std::vector<BusState> buses;
|
||||||
@@ -243,6 +264,10 @@ private:
|
|||||||
// Allocated once at prepare time
|
// Allocated once at prepare time
|
||||||
std::vector<std::vector<float>> channelOutputBuffers_;
|
std::vector<std::vector<float>> channelOutputBuffers_;
|
||||||
|
|
||||||
|
// Physical I/O channel counts (from audio device auto-detection)
|
||||||
|
uint32_t physicalInputCount_ = 0;
|
||||||
|
uint32_t physicalOutputCount_ = 0;
|
||||||
|
|
||||||
// Internal helper: accumulate a channel's output to all its routed buses
|
// Internal helper: accumulate a channel's output to all its routed buses
|
||||||
void routeChannelOutput(
|
void routeChannelOutput(
|
||||||
MixerChannelStrip* channel,
|
MixerChannelStrip* channel,
|
||||||
|
|||||||
Reference in New Issue
Block a user