AudioManager.disableSystemSoundsAsync() returns STATUS_PERMISSION_DENIED (-9)

SDK Version: v0.23
React Native Version: RN0.72


Description:

We would like to suppress D-pad / navigation click sounds on our overlay during playback, it seems like the navigation sounds are interfering with audio playback and causing discontinuity between the audio and video tracks.

@amazon-devices/keplerscript-audio-lib documents AudioManager.disableSystemSoundsAsync() / enableSystemSoundsAsync() as the way to do this. The method-level JSDoc for disableSystemSoundsAsync() does not list a required privilege, does not say the API is system-app-only, and does not document -9 / STATUS_PERMISSION_DENIED as a return value. Documented returns are only:

  • 0 STATUS_NO_ERROR
  • -5 STATUS_DEAD_OBJECT
  • -8 STATUS_INVALID_OPERATION

The library README also lists “System sound management” as a feature for React Native for Vega apps, and setup only asks for audio services (com.amazon.audio.control, com.amazon.audio.stream, com.amazon.audio.system) — not com.amazon.audio.privilege.settings.control.

Other AudioManager methods (e.g. setVolumeAsync, disableUsageAsync) do explicitly say they require com.amazon.audio.privilege.settings.control and are restricted to Kepler system applications.

At runtime, disableSystemSoundsAsync() still returns -9 (STATUS_PERMISSION_DENIED) for our app, both before and after declaring that privilege in manifest.toml and doing a clean rebuild/reinstall.

This looks like a docs vs native ACL mismatch: the method is published as a public app API, but the OS treats it like the privileged/system-only volume APIs.

Package / library versions:

  • @amazon-devices/keplerscript-audio-lib: 2.0.17

Docs:

Steps to reproduce:

  1. Create / use a third-party Vega TV app (not a Kepler system app).
  2. Add "@amazon-devices/keplerscript-audio-lib": "^2.0.17".
  3. In manifest.toml, declare:
[[wants.service]]

id = "com.amazon.audio.system"

[[wants.service]]

id = "com.amazon.audio.stream"

[[wants.service]]

id = "com.amazon.audio.control"

[[needs.privilege]]

id = "com.amazon.audio.privilege.settings.control"
  1. Call:
import { AudioManager, AudioStatus } from '@amazon-devices/keplerscript-audio-lib';

const status = await AudioManager.disableSystemSoundsAsync();

console.log(status);
  1. Clean rebuild, reinstall, and launch on a Vega / Fire TV Vega device.

Expected:

Per method JSDoc, disableSystemSoundsAsync() resolves to STATUS_NO_ERROR (0) for a third-party app that declared the documented audio services. System / navigation click sounds are suppressed until enableSystemSoundsAsync().

If the API is intentionally system-app-only, the method JSDoc and README should say so (same warning as setVolumeAsync) and should document -9.

Actual:

[disableSystemSoundsAsync] status:  -9

-9 is AudioStatus.STATUS_PERMISSION_DENIED. Navigation click sounds still play. Same result with and without com.amazon.audio.privilege.settings.control in the manifest.

Device: Fire TV Vega Select 4k

Ask:

  1. Is disableSystemSoundsAsync() intended for third-party apps? If yes, please fix native permission so declaring the audio services (and privilege, if required) actually grants it.
  2. If it is system-app-only, please update the method docs and README so they match setVolumeAsync, and document -9.
  3. If third-party apps cannot use this API, is there a supported way to disable navigation / D-pad click sounds for a screen (e.g. during video playback)?

Hi @Jon_Page,

Thank you for your question about AudioManager.disableSystemSoundsAsync() and the system sound behavior during playback.

Our team is looking into it and will provide an update as soon as we have more information.

Thanks for helping us improve the Vega platform.

Warm regards,
Aishwarya

Hi @Jon_Page,

AudioManager.disableSystemSoundsAsync() is a system-app-only API and is not available for third-party apps. This is why you’re receiving the -9 return value.

We are working on updating the documentation to better reflect this. Unfortunately, there’s no supported alternative for 3P apps to suppress navigation sounds at this time.

We recommend ensuring your media player has proper audio focus during playback, which should help reduce system sound interference.

Warm regards,
Aishwarya

A few clarifications on the audio-focus recommendation:

  1. Use case. We are not trying to steal volume from another app. We want to suppress D-pad / navigation click sounds while video is playing underneath. Those clicks sit on top of program audio and are the problem.

  2. What we already do. Playback goes through @amazon-devices/react-native-w3cmedia (HTMLMediaElement / Kepler video). That player requests media audio focus internally on play and exposes audiofocusgranted / audiofocuspaused / audiofocuslost. We do not also call AudioFocusManager / AudioFocusSession ourselves.

  3. Question. Is that player-owned USAGE_MEDIA focus what you mean by “proper audio focus,” or do we still need an explicit AudioFocusSession.requestAudioFocusAsync() alongside it?

  4. Does holding media focus actually duck or suppress navigation / system click sounds, or only other media / notification streams? In our testing, clicks still play during playback. If focus does not affect those sounds, we want to set the right expectation internally: there is no 3rd party way to mute them today.

Thanks again for the confirmation and the doc update.

Hi @Jon_Page,

Thank you for the detailed follow-up. Here’s what I can confirm:

  1. Audio Focus
    The player-owned USAGE_MEDIA focus from @amazon-devices/react-native-w3cmedia is sufficient. You do not need an explicit AudioFocusSession.requestAudioFocusAsync() alongside it - though you can manage focus yourself if you want more granular control beyond the w3cmedia events.

  2. Navigation Click Sounds
    Holding media focus does not suppress navigation/system click sounds. Key clicks are mixed with the active media stream - this is expected platform behavior and not something audio focus controls.

  3. Confirmed: No Supported Audio API for 3P Apps
    There is no supported Audio API method for third-party apps to mute navigation click sounds today. Your testing is correct.

  4. Possible Alternative
    You may be able to override key events at the React/Vega layer to prevent the click sound from firing during playback. This would be handled outside of the Audio APIs.

Feel free to reach back to me if you have any questions!

Warm regards,
Aishwarya