diff --git a/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java b/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java index 7168775e2..98012fc1c 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java @@ -173,6 +173,7 @@ protected void onCreate(Bundle savedInstanceState) { mPermissionDelegate = new PermissionDelegate(this, this); mAudioEngine = new AudioEngine(this, new VRAudioTheme()); + mAudioEngine.setEnabled(SettingsStore.getInstance(this).isAudioEnabled()); mAudioEngine.preloadAsync(() -> { Log.i(LOGTAG, "AudioEngine sounds preloaded!"); // mAudioEngine.playSound(AudioEngine.Sound.AMBIENT, true); diff --git a/app/src/common/shared/org/mozilla/vrbrowser/audio/AudioEngine.java b/app/src/common/shared/org/mozilla/vrbrowser/audio/AudioEngine.java index 743e237b2..dbc1bdf8a 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/audio/AudioEngine.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/audio/AudioEngine.java @@ -19,6 +19,7 @@ public class AudioEngine { private ConcurrentHashMap mSourceIds; private float mMasterVolume = 1.0f; private static ConcurrentHashMap mEngines = new ConcurrentHashMap<>(); + private boolean mEnabled; private static final String LOGTAG = "VRB"; public enum SoundType { @@ -61,9 +62,14 @@ public AudioEngine(Context aContext, AudioTheme aTheme) { mEngine = new GvrAudioEngine(aContext, GvrAudioEngine.RenderingMode.BINAURAL_HIGH_QUALITY); mSourceIds = new ConcurrentHashMap<>(); mEngines.put(aContext, this); + mEnabled = true; } - public void preload() { + public void setEnabled(boolean enabled) { + mEnabled = enabled; + } + + private void preload() { for (Sound sound: Sound.values()) { if (sound.getType() == SoundType.FIELD) { // Ambisonic soundfields do *not* need to be preloaded @@ -84,16 +90,18 @@ public void preloadAsync() { // Perform preloading in a separate thread in order to avoid blocking the main thread public void preloadAsync(final Runnable aCallback) { - Thread thread = new Thread(new Runnable(){ - @Override - public void run(){ - preload(); - if (aCallback != null) { - ((Activity)mContext).runOnUiThread(aCallback); + if (mEnabled) { + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + preload(); + if (aCallback != null) { + ((Activity) mContext).runOnUiThread(aCallback); + } } - } - }); - thread.start(); + }); + thread.start(); + } } public void release() { @@ -125,10 +133,12 @@ public void update() { } public void playSound(Sound aSound) { - playSound(aSound, false); + if (mEnabled) { + playSound(aSound, false); + } } - public void playSound(Sound aSound, boolean aLoopEnabled) { + private void playSound(Sound aSound, boolean aLoopEnabled) { String path = mTheme.getPath(aSound); if (path == null || path.length() == 0) { return; @@ -140,22 +150,24 @@ public void playSound(Sound aSound, boolean aLoopEnabled) { } } - public void playSound(int aSourceId, boolean aLoopEnabled) { + private void playSound(int aSourceId, boolean aLoopEnabled) { mEngine.playSound(aSourceId, aLoopEnabled); } public void pauseSound(Sound aSound) { - Integer sourceId = findSourceId(aSound); - if (sourceId != null) { - pauseSound(sourceId); + if (mEnabled) { + Integer sourceId = findSourceId(aSound); + if (sourceId != null) { + pauseSound(sourceId); + } } } - public void pauseSound(int aSourceId) { + private void pauseSound(int aSourceId) { mEngine.pauseSound(aSourceId); } - public void resumeSound(Sound aSound) { + private void resumeSound(Sound aSound) { Integer sourceId = findSourceId(aSound); if (sourceId != null) { resumeSound(sourceId); @@ -163,10 +175,12 @@ public void resumeSound(Sound aSound) { } public void resumeSound(int aSourceId) { - mEngine.stopSound(aSourceId); + if (mEnabled) { + mEngine.stopSound(aSourceId); + } } - public void setSoundPosition(Sound aSound, float x, float y, float z) { + private void setSoundPosition(Sound aSound, float x, float y, float z) { if (aSound.getType() != SoundType.OBJECT) { Log.e(LOGTAG, "Sound position can only be set for SoundType.Object!"); return; @@ -178,10 +192,12 @@ public void setSoundPosition(Sound aSound, float x, float y, float z) { } public void setSoundPosition(int aSoundObjectId, float x, float y, float z) { - mEngine.setSoundObjectPosition(aSoundObjectId, x, y, z); + if (mEnabled) { + mEngine.setSoundObjectPosition(aSoundObjectId, x, y, z); + } } - public void setSoundVolume(Sound aSound, float aVolume) { + private void setSoundVolume(Sound aSound, float aVolume) { Integer sourceId = findSourceId(aSound); if (sourceId != null) { setSoundVolume(sourceId, aVolume); @@ -189,15 +205,17 @@ public void setSoundVolume(Sound aSound, float aVolume) { } public void setSoundVolume(int aSourceId, float aVolume) { - mEngine.setSoundVolume(aSourceId, aVolume * mMasterVolume); + if (mEnabled) { + mEngine.setSoundVolume(aSourceId, aVolume * mMasterVolume); + } } - public void setMasterVolume(float aMasterVolume) { + private void setMasterVolume(float aMasterVolume) { mMasterVolume = aMasterVolume; } - public int createSound(SoundType aType, String path) { + private int createSound(SoundType aType, String path) { mEngine.preloadSoundFile(path); int sourceId = GvrAudioEngine.INVALID_ID; switch (aType) { @@ -213,11 +231,11 @@ public int createSound(SoundType aType, String path) { return sourceId; } - public void preloadFile(String path) { + private void preloadFile(String path) { mEngine.preloadSoundFile(path); } - public void unloadFile(String path) { + private void unloadFile(String path) { mEngine.unloadSoundFile(path); } diff --git a/app/src/common/shared/org/mozilla/vrbrowser/browser/SettingsStore.java b/app/src/common/shared/org/mozilla/vrbrowser/browser/SettingsStore.java index 7f1334ad1..00d11c96f 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/browser/SettingsStore.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/browser/SettingsStore.java @@ -54,6 +54,7 @@ SettingsStore getInstance(final @NonNull Context aContext) { public final static float BROWSER_WORLD_WIDTH_DEFAULT = 4.0f; public final static float BROWSER_WORLD_HEIGHT_DEFAULT = 2.25f; public final static int MSAA_DEFAULT_LEVEL = 1; + public final static boolean AUDIO_ENABLED = false; // Enable telemetry by default (opt-out). private final static boolean enableCrashReportingByDefault = false; @@ -320,6 +321,16 @@ public boolean getLayersEnabled() { return false; } + public boolean isAudioEnabled() { + return mPrefs.getBoolean(mContext.getString(R.string.settings_key_audio), AUDIO_ENABLED); + } + + public void setAudioEnabled(boolean isEnabled) { + SharedPreferences.Editor editor = mPrefs.edit(); + editor.putBoolean(mContext.getString(R.string.settings_key_audio), isEnabled); + editor.commit(); + } + public String getVoiceSearchLanguage() { String language = mPrefs.getString( mContext.getString(R.string.settings_key_voice_search_language), null); diff --git a/app/src/main/res/values/non_L10n.xml b/app/src/main/res/values/non_L10n.xml index 4a3cb807f..5d6312313 100644 --- a/app/src/main/res/values/non_L10n.xml +++ b/app/src/main/res/values/non_L10n.xml @@ -21,6 +21,7 @@ settings_env settings_pointer_color settings_msaa + settings_audio settings_voice_search_language https://support.mozilla.org/kb/private-mode-firefox-reality settings_browser_world_width