From 57be8949a83614860d050d6ed7a702ffdef321a9 Mon Sep 17 00:00:00 2001 From: Daniel Vasquez Date: Tue, 28 Nov 2017 23:00:04 -0500 Subject: [PATCH 1/2] Sound: Flar2 Sound Control: Add per-channel headphone controls Adapted from https://github.com/Kamin4ri/KernelAdiutor/commit/ac4eb2d56cbca040cf5142d9ccc7e6e0ae7c5ea1 --- .../fragments/kernel/SoundFragment.java | 87 +++++++++++++++++-- .../utils/kernel/sound/Sound.java | 54 +++++++++--- app/src/main/res/values/strings.xml | 5 ++ 3 files changed, 124 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/com/grarak/kerneladiutor/fragments/kernel/SoundFragment.java b/app/src/main/java/com/grarak/kerneladiutor/fragments/kernel/SoundFragment.java index b3d8d4aae..7e73e1594 100755 --- a/app/src/main/java/com/grarak/kerneladiutor/fragments/kernel/SoundFragment.java +++ b/app/src/main/java/com/grarak/kerneladiutor/fragments/kernel/SoundFragment.java @@ -22,7 +22,9 @@ import com.grarak.kerneladiutor.R; import com.grarak.kerneladiutor.fragments.ApplyOnBootFragment; import com.grarak.kerneladiutor.fragments.RecyclerViewFragment; +import com.grarak.kerneladiutor.utils.Prefs; import com.grarak.kerneladiutor.utils.kernel.sound.Sound; +import com.grarak.kerneladiutor.views.recyclerview.CardView; import com.grarak.kerneladiutor.views.recyclerview.RecyclerViewItem; import com.grarak.kerneladiutor.views.recyclerview.SeekBarView; import com.grarak.kerneladiutor.views.recyclerview.SwitchView; @@ -67,7 +69,7 @@ protected void addItems(List items) { } if (Sound.hasMicrophoneFlar()) { microphoneFlarInit(items); - } + } if (Sound.hasHeadphonePowerAmpGain()) { headphonePowerAmpGainInit(items); } @@ -303,25 +305,92 @@ public void onMove(SeekBarView seekBarView, int position, String value) { private void headphoneFlarInit(List items) { - TitleView title = new TitleView(); - title.setText(getString(R.string.sound_control)); + final CardView hpFlarCard = new CardView(getActivity()); + hpFlarCard.setTitle(getString(R.string.headphone_gain)); + + if (!(Prefs.getBoolean("headphoneflar_perchannel", false, getActivity()))) + Prefs.saveBoolean("headphoneflar_perchannel", false, getActivity()); - SeekBarView headphoneFlar = new SeekBarView(); - headphoneFlar.setTitle(getString(R.string.headphone_gain)); + final SwitchView perChannel = new SwitchView(); + perChannel.setTitle(getString(R.string.per_channel_controls)); + perChannel.setSummary(getString(R.string.per_channel_controls_summary)); + perChannel.setChecked(Prefs.getBoolean("headphoneflar_perchannel", false, getActivity())); + hpFlarCard.addItem(perChannel); + + final SeekBarView headphoneFlar = new SeekBarView(); + headphoneFlar.setTitle(getString(R.string.all_channels)); headphoneFlar.setItems(Sound.getHeadphoneFlarLimits()); - headphoneFlar.setProgress(Sound.getHeadphoneFlarLimits().indexOf(Sound.getHeadphoneFlar())); + headphoneFlar.setProgress(Sound.getHeadphoneFlarLimits().indexOf(Sound.getHeadphoneFlar("all"))); headphoneFlar.setOnSeekBarListener(new SeekBarView.OnSeekBarListener() { @Override public void onStop(SeekBarView seekBarView, int position, String value) { - Sound.setHeadphoneFlar(value, getActivity()); + Sound.setHeadphoneFlar("all", value, getActivity()); + } + + @Override + public void onMove(SeekBarView seekBarView, int position, String value) { + } + }); + + final SeekBarView headphoneFlarLeft = new SeekBarView(); + headphoneFlarLeft.setTitle(getString(R.string.left_channel)); + headphoneFlarLeft.setItems(Sound.getHeadphoneFlarLimits()); + headphoneFlarLeft.setProgress(Sound.getHeadphoneFlarLimits().indexOf(Sound.getHeadphoneFlar("left"))); + headphoneFlarLeft.setOnSeekBarListener(new SeekBarView.OnSeekBarListener() { + @Override + public void onStop(SeekBarView seekBarView, int position, String value) { + Sound.setHeadphoneFlar("left", value, getActivity()); + } + + @Override + public void onMove(SeekBarView seekBarView, int position, String value) { + } + }); + + final SeekBarView headphoneFlarRight = new SeekBarView(); + headphoneFlarRight.setTitle(getString(R.string.right_channel)); + headphoneFlarRight.setItems(Sound.getHeadphoneFlarLimits()); + headphoneFlarRight.setProgress(Sound.getHeadphoneFlarLimits().indexOf(Sound.getHeadphoneFlar("right"))); + headphoneFlarRight.setOnSeekBarListener(new SeekBarView.OnSeekBarListener() { + @Override + public void onStop(SeekBarView seekBarView, int position, String value) { + Sound.setHeadphoneFlar("right", value, getActivity()); } @Override public void onMove(SeekBarView seekBarView, int position, String value) { } }); - items.add(title); - items.add(headphoneFlar); + + class SeekBarManager { + public void showPerChannelSeekbars (boolean enable) { + if (enable == true) { + hpFlarCard.removeItem(headphoneFlar); + hpFlarCard.addItem(headphoneFlarLeft); + hpFlarCard.addItem(headphoneFlarRight); + } else { + hpFlarCard.removeItem(headphoneFlarLeft); + hpFlarCard.removeItem(headphoneFlarRight); + hpFlarCard.addItem(headphoneFlar); + } + } + } + + final SeekBarManager manager = new SeekBarManager(); + if (Prefs.getBoolean("headphoneflar_perchannel", false, getActivity()) == true) { + manager.showPerChannelSeekbars(true); + } else { + manager.showPerChannelSeekbars(false); + } + perChannel.addOnSwitchListener(new SwitchView.OnSwitchListener() { + @Override + public void onChanged(SwitchView switchview, boolean isChecked) { + Prefs.saveBoolean("headphoneflar_perchannel", isChecked, getActivity()); + manager.showPerChannelSeekbars(isChecked); + } + }); + + items.add(hpFlarCard); } private void microphoneFlarInit(List items) { diff --git a/app/src/main/java/com/grarak/kerneladiutor/utils/kernel/sound/Sound.java b/app/src/main/java/com/grarak/kerneladiutor/utils/kernel/sound/Sound.java index 772929ee4..eaa2bfa76 100755 --- a/app/src/main/java/com/grarak/kerneladiutor/utils/kernel/sound/Sound.java +++ b/app/src/main/java/com/grarak/kerneladiutor/utils/kernel/sound/Sound.java @@ -378,12 +378,12 @@ public static boolean supported() { || hasMicrophoneFlar(); } - private static long getChecksum(int a, int b) { - return (Integer.MAX_VALUE * 2L + 1L) ^ (a + b); + private static int getChecksum(int arg0, int arg1) { + return 0xff & (Integer.MAX_VALUE ^ (arg0 & 0xff) + (arg1 & 0xff)); } private static void fauxRun(String value, String path, String id, Context context) { - long checksum = value.contains(" ") ? + int checksum = value.contains(" ") ? getChecksum(Utils.strToInt(value.split(" ")[0]), Utils.strToInt(value.split(" ")[1])) : getChecksum(Utils.strToInt(value), 0); @@ -395,20 +395,48 @@ private static void run(String command, String id, Context context) { Control.runSetting(command, ApplyOnBootFragment.SOUND, id, context); } - public static void setHeadphoneFlar(String value, Context context) { + public static void setHeadphoneFlar(String channel, String value, Context context) { int newGain = Utils.strToInt(value); - if (newGain >= -40 && newGain <= 20) { - fauxRun(value + " " + value, HEADPHONE_FLAR, HEADPHONE_FLAR, context); + switch (channel) { + case "all": + if (newGain >= -40 && newGain <= 20) { + fauxRun(value + " " + value, HEADPHONE_FLAR, HEADPHONE_FLAR, context); + } + break; + case "left": + String currentGainLeft = getHeadphoneFlar("right"); + if (newGain >= -40 && newGain <= 20) { + fauxRun(value + " " + currentGainLeft, HEADPHONE_FLAR, HEADPHONE_FLAR, context); + } + break; + case "right": + String currentGainRight = getHeadphoneFlar("left"); + if (newGain >= -40 && newGain <= 20) { + fauxRun(value + " " + currentGainRight, HEADPHONE_FLAR, HEADPHONE_FLAR, context); + } + break; } } - public static String getHeadphoneFlar() { - String value = Utils.readFile(HEADPHONE_FLAR); - int gain = Utils.strToInt(value.contains(" ") ? value.split(" ")[0] : value); - if (gain >= 0 && gain <= 20) { - return String.valueOf(gain); - } else if (gain >= 216 && gain <= 255) { - return String.valueOf(gain - 256); + public static String getHeadphoneFlar(String channel) { + String[] values = Utils.readFile(HEADPHONE_FLAR).split(" "); + int gainLeft = Utils.strToInt(values[0]), + gainRight = Utils.strToInt(values[1]); + switch (channel) { + case "all": + case "left": + if (gainLeft >= 0 && gainLeft <= 20) { + return String.valueOf(gainLeft); + } else if (gainLeft >= 216 && gainLeft <= 255) { + return String.valueOf(gainLeft - 256); + } + break; + case "right": + if (gainRight >= 0 && gainRight <= 20) { + return String.valueOf(gainRight); + } else if (gainRight >= 216 && gainRight <= 255) { + return String.valueOf(gainRight - 256); + } } return ""; } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b438fd1c9..bbc055a2c 100755 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -551,6 +551,11 @@ Prevent modifications to microphone gains Microphone Gain Volume Gain + Per-channel controls + Use different gain values for each channel + All Channels + Left Channel + Right Channel Level From d8d5b1bbcc22c7df5c915b589f1d15cf6a85fc53 Mon Sep 17 00:00:00 2001 From: Kamin4ri Date: Tue, 28 Nov 2017 00:25:10 -0500 Subject: [PATCH 2/2] Sound: Faux Sound Control: Add per-channel headphone controls Fix and cleanup by @dani020110 --- .../fragments/kernel/SoundFragment.java | 171 ++++++++++++++++-- .../utils/kernel/sound/Sound.java | 96 ++++++++-- 2 files changed, 234 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/com/grarak/kerneladiutor/fragments/kernel/SoundFragment.java b/app/src/main/java/com/grarak/kerneladiutor/fragments/kernel/SoundFragment.java index 7e73e1594..00e54d3f4 100755 --- a/app/src/main/java/com/grarak/kerneladiutor/fragments/kernel/SoundFragment.java +++ b/app/src/main/java/com/grarak/kerneladiutor/fragments/kernel/SoundFragment.java @@ -55,6 +55,9 @@ protected void addItems(List items) { if (Sound.hasHeadphoneGain()) { headphoneGainInit(items); } + if (Sound.hasHeadphonePowerAmpGain()) { + headphonePowerAmpGainInit(items); + } if (Sound.hasHandsetMicrophoneGain()) { handsetMicrophoneGainInit(items); } @@ -70,9 +73,6 @@ protected void addItems(List items) { if (Sound.hasMicrophoneFlar()) { microphoneFlarInit(items); } - if (Sound.hasHeadphonePowerAmpGain()) { - headphonePowerAmpGainInit(items); - } if (Sound.hasHeadphoneTpaGain()) { headphoneTpaGainInit(items); } @@ -119,14 +119,41 @@ public void onChanged(SwitchView switchView, boolean isChecked) { } private void headphoneGainInit(List items) { - SeekBarView headphoneGain = new SeekBarView(); - headphoneGain.setTitle(getString(R.string.headphone_gain)); + final CardView hpGainCard = new CardView(getActivity()); + hpGainCard.setTitle(getString(R.string.headphone_gain)); + + if (!(Prefs.getBoolean("fauxsound_perchannel_headphone_gain", false, getActivity()))) + Prefs.saveBoolean("fauxsound_perchannel_headphone_gain", false, getActivity()); + + final SwitchView perChannel = new SwitchView(); + perChannel.setTitle(getString(R.string.per_channel_controls)); + perChannel.setSummary(getString(R.string.per_channel_controls_summary)); + perChannel.setChecked(Prefs.getBoolean("fauxsound_perchannel_headphone_gain", false, getActivity())); + hpGainCard.addItem(perChannel); + + final SeekBarView headphoneGain = new SeekBarView(); + headphoneGain.setTitle(getString(R.string.all_channels)); headphoneGain.setItems(Sound.getHeadphoneGainLimits()); - headphoneGain.setProgress(Sound.getHeadphoneGainLimits().indexOf(Sound.getHeadphoneGain())); + headphoneGain.setProgress(Sound.getHeadphoneGainLimits().indexOf(Sound.getHeadphoneGain("all"))); headphoneGain.setOnSeekBarListener(new SeekBarView.OnSeekBarListener() { @Override public void onStop(SeekBarView seekBarView, int position, String value) { - Sound.setHeadphoneGain(value, getActivity()); + Sound.setHeadphoneGain("all", value, getActivity()); + } + + @Override + public void onMove(SeekBarView seekBarView, int position, String value) { + } + }); + + final SeekBarView headphoneGainLeft = new SeekBarView(); + headphoneGainLeft.setTitle(getString(R.string.left_channel)); + headphoneGainLeft.setItems(Sound.getHeadphoneGainLimits()); + headphoneGainLeft.setProgress(Sound.getHeadphoneGainLimits().indexOf(Sound.getHeadphoneGain("left"))); + headphoneGainLeft.setOnSeekBarListener(new SeekBarView.OnSeekBarListener() { + @Override + public void onStop(SeekBarView seekBarView, int position, String value) { + Sound.setHeadphoneGain("left", value, getActivity()); } @Override @@ -134,7 +161,50 @@ public void onMove(SeekBarView seekBarView, int position, String value) { } }); - items.add(headphoneGain); + final SeekBarView headphoneGainRight = new SeekBarView(); + headphoneGainRight.setTitle(getString(R.string.right_channel)); + headphoneGainRight.setItems(Sound.getHeadphoneGainLimits()); + headphoneGainRight.setProgress(Sound.getHeadphoneGainLimits().indexOf(Sound.getHeadphoneGain("right"))); + headphoneGainRight.setOnSeekBarListener(new SeekBarView.OnSeekBarListener() { + @Override + public void onStop(SeekBarView seekBarView, int position, String value) { + Sound.setHeadphoneGain("right", value, getActivity()); + } + + @Override + public void onMove(SeekBarView seekBarView, int position, String value) { + } + }); + + class SeekBarManager { + public void showPerChannelSeekbars (boolean enable) { + if (enable == true) { + hpGainCard.removeItem(headphoneGain); + hpGainCard.addItem(headphoneGainLeft); + hpGainCard.addItem(headphoneGainRight); + } else { + hpGainCard.removeItem(headphoneGainLeft); + hpGainCard.removeItem(headphoneGainRight); + hpGainCard.addItem(headphoneGain); + } + } + } + + final SeekBarManager manager = new SeekBarManager(); + if (Prefs.getBoolean("fauxsound_perchannel_headphone_gain", false, getActivity()) == true) { + manager.showPerChannelSeekbars(true); + } else { + manager.showPerChannelSeekbars(false); + } + perChannel.addOnSwitchListener(new SwitchView.OnSwitchListener() { + @Override + public void onChanged(SwitchView switchview, boolean isChecked) { + Prefs.saveBoolean("fauxsound_perchannel_headphone_gain", isChecked, getActivity()); + manager.showPerChannelSeekbars(isChecked); + } + }); + + items.add(hpGainCard); } private void handsetMicrophoneGainInit(List items) { @@ -196,15 +266,56 @@ public void onMove(SeekBarView seekBarView, int position, String value) { } private void headphonePowerAmpGainInit(List items) { - SeekBarView headphonePowerAmpGain = new SeekBarView(); - headphonePowerAmpGain.setTitle(getString(R.string.headphone_poweramp_gain)); - headphonePowerAmpGain.setItems(Sound.getHeadphonePowerAmpGainLimits()); - headphonePowerAmpGain.setProgress(Sound.getHeadphonePowerAmpGainLimits() - .indexOf(Sound.getHeadphonePowerAmpGain())); - headphonePowerAmpGain.setOnSeekBarListener(new SeekBarView.OnSeekBarListener() { + final CardView hpPAGainCard = new CardView(getActivity()); + hpPAGainCard.setTitle(getString(R.string.headphone_poweramp_gain)); + + if (!(Prefs.getBoolean("fauxsound_perchannel_headphone_pa_gain", false, getActivity()))) + Prefs.saveBoolean("fauxsound_perchannel_headphone_pa_gain", false, getActivity()); + + final SwitchView perChannel = new SwitchView(); + perChannel.setTitle(getString(R.string.per_channel_controls)); + perChannel.setSummary(getString(R.string.per_channel_controls_summary)); + perChannel.setChecked(Prefs.getBoolean("fauxsound_perchannel_headphone_pa_gain", false, getActivity())); + hpPAGainCard.addItem(perChannel); + + final SeekBarView headphonePAGain = new SeekBarView(); + headphonePAGain.setTitle(getString(R.string.all_channels)); + headphonePAGain.setItems(Sound.getHeadphonePowerAmpGainLimits()); + headphonePAGain.setProgress(Sound.getHeadphonePowerAmpGainLimits().indexOf(Sound.getHeadphonePowerAmpGain("all"))); + headphonePAGain.setOnSeekBarListener(new SeekBarView.OnSeekBarListener() { + @Override + public void onStop(SeekBarView seekBarView, int position, String value) { + Sound.setHeadphonePowerAmpGain("all", value, getActivity()); + } + + @Override + public void onMove(SeekBarView seekBarView, int position, String value) { + } + }); + + final SeekBarView headphonePAGainLeft = new SeekBarView(); + headphonePAGainLeft.setTitle(getString(R.string.left_channel)); + headphonePAGainLeft.setItems(Sound.getHeadphonePowerAmpGainLimits()); + headphonePAGainLeft.setProgress(Sound.getHeadphonePowerAmpGainLimits().indexOf(Sound.getHeadphonePowerAmpGain("left"))); + headphonePAGainLeft.setOnSeekBarListener(new SeekBarView.OnSeekBarListener() { + @Override + public void onStop(SeekBarView seekBarView, int position, String value) { + Sound.setHeadphonePowerAmpGain("left", value, getActivity()); + } + + @Override + public void onMove(SeekBarView seekBarView, int position, String value) { + } + }); + + final SeekBarView headphonePAGainRight = new SeekBarView(); + headphonePAGainRight.setTitle(getString(R.string.right_channel)); + headphonePAGainRight.setItems(Sound.getHeadphonePowerAmpGainLimits()); + headphonePAGainRight.setProgress(Sound.getHeadphonePowerAmpGainLimits().indexOf(Sound.getHeadphonePowerAmpGain("right"))); + headphonePAGainRight.setOnSeekBarListener(new SeekBarView.OnSeekBarListener() { @Override public void onStop(SeekBarView seekBarView, int position, String value) { - Sound.setHeadphonePowerAmpGain(value, getActivity()); + Sound.setHeadphonePowerAmpGain("right", value, getActivity()); } @Override @@ -212,7 +323,35 @@ public void onMove(SeekBarView seekBarView, int position, String value) { } }); - items.add(headphonePowerAmpGain); + class SeekBarManager { + public void showPerChannelSeekbars (boolean enable) { + if (enable == true) { + hpPAGainCard.removeItem(headphonePAGain); + hpPAGainCard.addItem(headphonePAGainLeft); + hpPAGainCard.addItem(headphonePAGainRight); + } else { + hpPAGainCard.removeItem(headphonePAGainLeft); + hpPAGainCard.removeItem(headphonePAGainRight); + hpPAGainCard.addItem(headphonePAGain); + } + } + } + + final SeekBarManager manager = new SeekBarManager(); + if (Prefs.getBoolean("fauxsound_perchannel_headphone_pa_gain", false, getActivity()) == true) { + manager.showPerChannelSeekbars(true); + } else { + manager.showPerChannelSeekbars(false); + } + perChannel.addOnSwitchListener(new SwitchView.OnSwitchListener() { + @Override + public void onChanged(SwitchView switchview, boolean isChecked) { + Prefs.saveBoolean("fauxsound_perchannel_headphone_pa_gain", isChecked, getActivity()); + manager.showPerChannelSeekbars(isChecked); + } + }); + + items.add(hpPAGainCard); } private void headphoneTpaGainInit(List items) { diff --git a/app/src/main/java/com/grarak/kerneladiutor/utils/kernel/sound/Sound.java b/app/src/main/java/com/grarak/kerneladiutor/utils/kernel/sound/Sound.java index eaa2bfa76..2beb434df 100755 --- a/app/src/main/java/com/grarak/kerneladiutor/utils/kernel/sound/Sound.java +++ b/app/src/main/java/com/grarak/kerneladiutor/utils/kernel/sound/Sound.java @@ -145,13 +145,35 @@ public static boolean hasLockOutputGain() { return Utils.existFile(LOCK_OUTPUT_GAIN); } - public static void setHeadphonePowerAmpGain(String value, Context context) { + public static void setHeadphonePowerAmpGain(String channel, String value, Context context) { value = String.valueOf(38 - Utils.strToInt(value)); - fauxRun(value + " " + value, HEADPHONE_POWERAMP_GAIN, HEADPHONE_POWERAMP_GAIN, context); + switch (channel) { + case "all": + fauxRun(value + " " + value, HEADPHONE_POWERAMP_GAIN, HEADPHONE_POWERAMP_GAIN, context); + break; + case "left": + String currentGainRight = getHeadphonePowerAmpGain("right"); + fauxRun(value + " " + currentGainRight, HEADPHONE_POWERAMP_GAIN, HEADPHONE_POWERAMP_GAIN, context); + break; + case "right": + String currentGainLeft = getHeadphonePowerAmpGain("left"); + fauxRun(currentGainLeft + " " + value, HEADPHONE_POWERAMP_GAIN, HEADPHONE_POWERAMP_GAIN, context); + break; + } } - public static String getHeadphonePowerAmpGain() { - return String.valueOf(38 - Utils.strToInt(Utils.readFile(HEADPHONE_POWERAMP_GAIN).split(" ")[0])); + public static String getHeadphonePowerAmpGain(String channel) { + String[] values = Utils.readFile(HEADPHONE_POWERAMP_GAIN).split(" "); + String gainLeft = String.valueOf(38 - Utils.strToInt(values[0])), + gainRight = String.valueOf(38 - Utils.strToInt(values[1])); + switch (channel) { + case "all": + case "left": + return gainLeft; + case "right": + return gainRight; + } + return ""; } public static List getHeadphonePowerAmpGainLimits() { @@ -317,23 +339,63 @@ public static boolean hasHandsetMicrophoneGain() { return Utils.existFile(HANDSET_MICROPHONE_GAIN); } - public static void setHeadphoneGain(String value, Context context) { + public static void setHeadphoneGain(String channel, String value, Context context) { int newGain = Utils.strToInt(value); - if (newGain >= 0 && newGain <= 20) { - fauxRun(value + " " + value, HEADPHONE_GAIN, HEADPHONE_GAIN, context); - } else if (newGain <= -1 && newGain >= -30) { - value = String.valueOf(newGain + 256); - fauxRun(value + " " + value, HEADPHONE_GAIN, HEADPHONE_GAIN, context); + switch (channel) { + case "all": + if (newGain >= 0 && newGain <= 20) { + // Zero / 1 to 20 (positive gain range) + fauxRun(value + " " + value, HEADPHONE_GAIN, HEADPHONE_GAIN, context); + } else if (newGain <= -1 && newGain >= -30) { + // -1 to -30 (negative gain range) + value = String.valueOf(newGain + 256); + fauxRun(value + " " + value, HEADPHONE_GAIN, HEADPHONE_GAIN, context); + } + break; + case "left": + String currentGainRight = getHeadphoneGain("right"); + if (newGain >= 0 && newGain <= 20) { + // Zero / 1 to 20 (positive gain range) + fauxRun(value + " " + currentGainRight, HEADPHONE_GAIN, HEADPHONE_GAIN, context); + } else if (newGain <= -1 && newGain >= -30) { + // -1 to -30 (negative gain range) + value = String.valueOf(newGain + 256); + fauxRun(value + " " + currentGainRight, HEADPHONE_GAIN, HEADPHONE_GAIN, context); + } + break; + case "right": + String currentGainLeft = getHeadphoneGain("left"); + if (newGain >= 0 && newGain <= 20) { + // Zero / 1 to 20 (positive gain range) + fauxRun(currentGainLeft + " " + value, HEADPHONE_GAIN, HEADPHONE_GAIN, context); + } else if (newGain <= -1 && newGain >= -30) { + // -1 to -30 (negative gain range) + value = String.valueOf(newGain + 256); + fauxRun(currentGainLeft + " " + value, HEADPHONE_GAIN, HEADPHONE_GAIN, context); + } + break; } } - public static String getHeadphoneGain() { - String value = Utils.readFile(HEADPHONE_GAIN); - int gain = Utils.strToInt(value.contains(" ") ? value.split(" ")[0] : value); - if (gain >= 0 && gain <= 20) { - return String.valueOf(gain); - } else if (gain >= 226 && gain <= 255) { - return String.valueOf(gain - 256); + public static String getHeadphoneGain(String channel) { + String[] values = Utils.readFile(HEADPHONE_GAIN).split(" "); + int gainLeft = Utils.strToInt(values[0]), + gainRight = Utils.strToInt(values[1]); + switch (channel) { + case "all": + case "left": + if (gainLeft >= 0 && gainLeft <= 20) { + return String.valueOf(gainLeft); + } else if (gainLeft >= 226 && gainLeft <= 255) { + return String.valueOf(gainLeft - 256); + } + break; + case "right": + if (gainRight >= 0 && gainRight <= 20) { + return String.valueOf(gainRight); + } else if (gainRight >= 226 && gainRight <= 255) { + return String.valueOf(gainRight - 256); + } } return ""; }