[Calling Web SDK] AudioEffects disposes raw stream twice after acquisition failure (1.43.1)
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 70/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- javascript, node.js
- Área
- audio-video-rtc, backend
Línea de trabajo
The report isolates updateAudioEffectsStatusManager in the installed @azure/communication-calling 1.43.1 bundle at node_modules/@azure/communication-calling/dist-esm/sdk.bundle.js; it also mentions the parameterized method in 1.46.1. Read that method’s catch path and common cleanup, then run the supplied reproduce.mjs scenarios. Done means an acquired client is disposed once after acquisition failure and the original acquisition diagnostic is preserved.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Summary
In @azure/communication-calling 1.43.1, the internal AudioEffects method
updateAudioEffectsStatusManager can dispose the same raw-stream client twice
when getMediaStream() rejects. The second disposal throws:
Error: Raw stream client is already disposed
at ...checkDisposed
at ...dispose
at ...updateAudioEffectsStatusManager
This was observed during initialization in an embedded Windows Chromium test
browser when the UI reported unavailable camera/microphone access. Normal call
connection could still succeed after a browser permission response. This is not
a claim of a general call outage or a demonstrated cause of mid-call audio loss.
The original device-acquisition rejection reason/browser build was not captured.
Reproduction and scope
The following Node reproduction executes the unchanged method extracted from
the installed 1.43.1 SDK, with synthetic stream/device collaborators. The raw
stream collaborator models the SDK's non-idempotent disposal guard. This isolates
the method's cleanup control flow; it is not an end-to-end browser/media test.
In an empty directory, install @azure/[email protected], save the
following as reproduce.mjs, then run node reproduce.mjs:
import assert from 'node:assert/strict';
import { readFile } from 'node:fs/promises';
import vm from 'node:vm';
const source = await readFile(
'node_modules/@azure/communication-calling/dist-esm/sdk.bundle.js', 'utf8');
const start = source.indexOf('async updateAudioEffectsStatusManager(){');
const end = source.indexOf('async initializeWasmVqeInStack(', start);
assert.ok(start > 0 && end > start);
const method = source.slice(start, end);
const initialize = vm.runInNewContext(
`(${method.replace('async updateAudioEffectsStatusManager', 'async function')})`,
{
isVdi3Proxy: () => false,
getBrowserInfo: () => ({ engine: 'Chrome' }),
BrowserAudioEffectsHelper: class {},
});
for (const scenario of ['valid-stream', 'acquisition-rejected', 'no-raw-stream']) {
let disposed = false, disposeCalls = 0, settings;
const stream = {
getMediaStream: async () => {
if (scenario === 'acquisition-rejected') {
throw new Error('Synthetic device acquisition failure');
}
return { getAudioTracks: () => [{ getSettings: () => ({
autoGainControl: false, noiseSuppression: false, echoCancellation: false,
}) }] };
},
dispose: () => {
disposeCalls++;
if (disposed) throw new Error('Raw stream client is already disposed');
disposed = true;
},
};
const effects = {
on: () => {}, setActiveEffects: value => { settings = value; },
getActiveEffects: () => settings,
};
const device = {
isWBMediaClient: false, getTsDeviceManager: () => ({}),
getRawDeviceMediaStream: () => {
if (scenario === 'no-raw-stream') throw new Error('Synthetic device absent');
return stream;
},
callStackAudioEffectsStatusManager: effects,
};
let error = null;
try {
await initialize.call({
streamInstance: { canStartEffects: true, source: { deviceManager: device } },
_logger: { warn: () => {}, debug: () => {} },
});
} catch (caught) { error = caught.message; }
console.log({ scenario, disposeCalls, error });
assert.equal(disposeCalls, scenario === 'valid-stream' ? 1 :
scenario === 'acquisition-rejected' ? 2 : 0);
assert.equal(error, scenario === 'acquisition-rejected' ?
'Raw stream client is already disposed' : null);
}
Actual
| Input | Dispose calls | Error |
|---|---|---|
| Stream acquisition succeeds | 1 | None |
| Stream exists, acquisition rejects | 2 | Raw stream client is already disposed |
| Raw-stream creation throws before a stream exists | 0 | None |
The catch path disposes the client; common code later disposes it again.
Expected
The SDK should clean up each acquired raw-stream client once, preserve the
device-acquisition diagnostic, and not introduce a second cleanup exception.
Version inspection
1.43.1 was exercised as above. Integrity-verified 1.46.1 package source was also
inspected and appears to retain the catch/common duplicate-disposal pattern in
the parameterized method. 1.46.1 was not executed in this reproduction. No
claim is made about 2.x behavior, and no SDK internals have been patched.
Could you confirm the supported fix/version or workaround that does not suppress
errors or bypass browser device permissions?
Reproduction signature: acs-web-audio-effects-double-dispose-1431.
- Lenguaje dominante
- Sin datos de lenguaje
- Estrellas
- 339
- Forks
- 114
- Merge medio
- 36 min
- PR fusionados (30 d)
- 1
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de Azure/Communication
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 20/100
Azure/Communication#600 ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
Azure/Communication#599 · 4 comentarios · 1 reacción ·
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 20/100
Azure/Communication#598 ·
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
Azure/Communication#543 ·
-
Needs: triage :mag:
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
Azure/Communication#447 ·
Todos los issues de Azure/Communication
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
libsdl-org/SDL_mixer#908 ·
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 61/100
crmne/spotifast#1022 · 1 comentario · 1 reacción ·
Los mantenedores suelen responder en 2 días
-
android bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
software-mansion/react-native-audio-api#1358 ·
Los mantenedores suelen responder en 2 días
-
speed argument is silently overridden to 0.3 for any gen_text under 10 bytesPosiblemente ocupada @li-lizhe la tomó hace 1 día. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
-
FLAC: STREAMINFO sample rates above 655350 Hz are rejected ("stream sample rate out of bounds")Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100