[Linux] setExternalAudioSource succeeds end-to-end (onMicStartSend fires, send() returns SDKERR_SUCCESS) but injected audio never reaches other participants

Meeting SDK Type and Version

Meeting SDK for Linux v7.0.5.3527, running headless in Docker (Ubuntu 22.04, Xvfb + PulseAudio virtual devices)

Description
Trying to send synthesized audio into a meeting via the virtual mic API (IZoomSDKAudioRawDataHelper::setExternalAudioSource / IZoomSDKVirtualAudioMicEvent / IZoomSDKAudioRawDataSender::send). Every step of the API sequence reports success, but the audio never actually reaches other participants.

Error?
No error at any point. GetZoomLastError() returns nullptr throughout. Every relevant call returns SDKERR_SUCCESS.

Troubleshooting Routes

  • Confirmed unmuted via UnMuteAudio() (SDKERR_SUCCESS) and visually confirmed unmuted in the Zoom client’s participant list
  • Tried Host, Co-Host, and “Allow Recording on Computer” permissions individually - no difference in outcome
  • Found that onMicStartSend never fires until CanStartRawRecording()/StartRawRecording() succeed first - recording permission appears to be a prerequisite for the send pipeline to activate at all
  • Replaced a flat sine tone with an amplitude-modulated (~4Hz tremolo) tone in case Zoom’s noise suppression/VAD was filtering out a non-speech-like signal - no change
  • Tested in both the main session and inside a breakout room - same result in both
  • Searched the forum extensively (raw data license deprecation threads, permission requirement threads) - nothing matches this exact symptom

How To Reproduce

  1. Authenticate via JWT (SDKAuth), join with SDK_UT_WITHOUT_LOGIN
  2. JoinVoip()SDKERR_SUCCESS
  3. UnMuteAudio(myUserId)SDKERR_SUCCESS
  4. Host grants Host/Co-Host/local recording permission
  5. CanStartRawRecording()SDKERR_SUCCESS, StartRawRecording()SDKERR_SUCCESS
  6. GetAudioRawdataHelper()->setExternalAudioSource(this)SDKERR_SUCCESS
  7. onMicInitialize(pSender) fires
  8. onMicStartSend() fires
  9. send() called every 20ms with valid 16-bit PCM, 32000Hz, mono, for 30+ seconds continuously - every call SDKERR_SUCCESS
  10. Result: bot’s participant tile never shows the “speaking” indicator; a human participant in the same session hears nothing

Separately: ISettingService::GetAudioSettings() returns nullptr in this same environment - is IAudioSettingContext supported on Linux?

(I checked the two similar topics Discourse suggested - “Not receiving audio on AudioRawData interface if the SDK doesn’t detect a microphone…” and “Send Raw Audio using Windows Meeting SDK” - neither matches this: the first is about the receive path, and the second is about onMicStartSend not firing reliably, whereas in my case onMicStartSend fires reliably and send() succeeds continuously with zero errors, but never reaches other participants.)

@noarani you do not need canstartrecording for this

I’ve done this instead

Configure audio before join
→ Join meeting
→ MEETING_STATUS_INMEETING
→ setExternalAudioSource()
→ JoinVoip()/UnMuteAudio()
→ onMicInitialize()
→ onMicStartSend()
→ send()

Take a look at this sample