In-call volume: the vocproc refuses VSS_IVOLUME_CMD_SET_STEP without a registered volume calibration table
scope: soc:msm8998 · severity: finding · confidence: proven · subsystem: audio
The question — the loudspeaker in a call is audible but far quieter than Android’s, with the amplifier’s DAC gain already at 15/15. Where is the rest of the volume?
The answer — a call has two gains in series and this port only has the second:
modem -> CVP vocproc [RX volume] -> AFE port -> MI2S -> TAS2557 [DAC gain] not implemented 0-15, the only one we hadAndroid’s in-call slider drives the first: downstream’s Voice Rx Gain
(msm-pcm-voice-v2.c:420) calls voc_set_rx_vol_step(), which sends
VSS_IVOLUME_CMD_SET_STEP (0x000112C2, direction = VSS_IVOLUME_DIRECTION_RX,
{u16 direction; u32 value; u16 ramp_duration_ms} __packed) to the CVP.
Implemented and measured on a live carrier call: the ADSP refuses it.
qcom-q6voice: 0x000112c2 rejected: 0x1 (ADSP_EFAILED)Steps 25, 50 and 100, all rejected, call unaffected. The command’s own
documentation says why: the step selects “the best match index in the
registered volume calibration table”, and nothing in mainline registers one
– downstream sends VSS_IVOCPROC_CMD_REGISTER_VOL_CALIBRATION_DATA out of
ACDB first. EFAILED rather than EBADPARAM or EUNSUPPORTED is the useful
part: the opcode and the payload are right, and the table is what is missing.
So in-call loudness is blocked on calibration data, not on the command.
What this rules out —
- “Send the command Android sends and the call gets louder.” Measured, and it does not: the DSP refuses it outright.
- “The loudspeaker is quiet because the port doesn’t use the vendor’s
firmware configurations.” It does –
_s2and_s3are Google’s own, decoded fromtas2557s_PG21_uCDSP.bin, the pairmixer_paths_tavil_taimenselects for handset and speaker-mono. The gap is the DSP’s gain, not the amp’s tuning. - “Turn the amplifier up.” It was at 15/15 during the whole measurement. That ceiling IS the symptom.
How it was established — Voice Rx Gain added to q6voice, stepped
0/25/50/100 during a live call while the profile stayed Voice Call (Speaker)
and the amp stayed at 15. Every step logged its rejection. What would overturn
it: registering a volume calibration table and getting a different answer –
which is exactly the next experiment, and the reason to keep the control.
