diff --git a/src/app/features/call/CallSoundboard.tsx b/src/app/features/call/CallSoundboard.tsx index beadcc115..7c30203e0 100644 --- a/src/app/features/call/CallSoundboard.tsx +++ b/src/app/features/call/CallSoundboard.tsx @@ -50,6 +50,14 @@ type FlatClip = { * A management toggle reveals the pack editors (personal + this room, if * permitted). Space-wide packs are managed from Space settings. */ +/** [EC#13, EC#47] Why the fork refused to play a clip, for the user. */ +export const soundboardRefusalText = (reason: string | undefined): string => { + if (reason === 'muted') return 'Unmute your microphone to play a soundboard clip.'; + if (reason === 'not_permitted') + return "The soundboard isn't available in this voice channel (only microphone audio is allowed here)."; + return 'Could not play that clip.'; +}; + export function CallSoundboard({ callEmbed }: CallSoundboardProps) { const mx = useMatrixClient(); const { room } = callEmbed; @@ -122,13 +130,10 @@ export function CallSoundboard({ callEmbed }: CallSoundboardProps) { .catch(() => undefined); const result = await callEmbed.control.injectAudio(url, vol, clipBytes); if (!result.played) { - // [EC#13] Refused fork-side (only reason today: local mic muted) — + // [EC#13, EC#47] Refused fork-side (mic muted, or the room's token + // only allows the microphone source, as in audio-only rooms) — // don't play it locally either, or the user would think it went out. - setError( - result.reason === 'muted' - ? 'Unmute your microphone to play a soundboard clip.' - : 'Could not play that clip.', - ); + setError(soundboardRefusalText(result.reason)); done(); return; }