Skip to content

Commit e909548

Browse files
fix(simu): wire Companion volume gain into audio output
OpenTxSimulator::setVolumeGain wrote to a field that was never read, so the Companion "Simulator volume gain" preference (0.5-3.0x) had no effect on simulator audio. Add simuSetVolumeGain() and apply the gain in simuQueueAudio with saturation on the int16 samples, so 0.5-1.0x attenuates, 1.0x is unity, and 1.0-3.0x amplifies with clipping at INT16_MIN/MAX (SDL_MixAudioFormat cannot amplify above unity).
1 parent 1d2c590 commit e909548

4 files changed

Lines changed: 26 additions & 3 deletions

File tree

radio/src/targets/simu/opentxsimulator.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -307,8 +307,7 @@ void OpenTxSimulator::setSdPath(const QString & sdPath, const QString & settings
307307

308308
void OpenTxSimulator::setVolumeGain(const int value)
309309
{
310-
QMutexLocker lckr(&m_mtxSettings);
311-
volumeGain = value;
310+
simuSetVolumeGain(value);
312311
}
313312

314313
void OpenTxSimulator::setRadioData(const QByteArray & data)

radio/src/targets/simu/opentxsimulator.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,6 @@ class DLLEXPORT OpenTxSimulator : public SimulatorInterface
116116
QMutex m_mtxRadioData;
117117
QMutex m_mtxSettings;
118118
QMutex m_mtxTbDevices;
119-
int volumeGain;
120119
bool m_resetOutputsData;
121120
bool m_stopRequested;
122121

radio/src/targets/simu/simuaudio.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,37 @@
2929

3030
static SDL_AudioDeviceID _sdl_audio_device = 0;
3131

32+
// Companion-side volume gain, stored as user-facing gain (0.5..3.0x) * 10.
33+
// Default 10 = unity.
34+
static int _volume_gain = 10;
35+
36+
void simuSetVolumeGain(int value)
37+
{
38+
_volume_gain = value;
39+
}
40+
3241
void simuQueueAudio(const uint8_t* data, uint32_t len)
3342
{
3443
#if !defined(SOFTWARE_VOLUME)
3544
int volume = (simuAudioGetVolume() * SDL_MIX_MAXVOLUME ) / VOLUME_LEVEL_MAX;
3645
SDL_MixAudioFormat((uint8_t*)data, data, AUDIO_FMT, len, volume);
3746
#endif
3847

48+
int gain = _volume_gain;
49+
if (gain != 10) {
50+
// SDL_MixAudioFormat cannot amplify above unity, so apply the
51+
// Companion gain manually with saturation to support the full
52+
// 0.5..3.0x UI range.
53+
auto* samples = (int16_t*)data;
54+
uint32_t n = len / sizeof(int16_t);
55+
for (uint32_t i = 0; i < n; ++i) {
56+
int32_t s = ((int32_t)samples[i] * gain) / 10;
57+
if (s > INT16_MAX) s = INT16_MAX;
58+
else if (s < INT16_MIN) s = INT16_MIN;
59+
samples[i] = (int16_t)s;
60+
}
61+
}
62+
3963
SDL_QueueAudio(_sdl_audio_device, data, len);
4064
}
4165

radio/src/targets/simu/simuaudio.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,4 @@ bool simuAudioInit();
2727
void simuAudioDeInit();
2828
void simuQueueAudio(const uint8_t* data, uint32_t len);
2929
int simuAudioGetVolume();
30+
void simuSetVolumeGain(int value);

0 commit comments

Comments
 (0)