From e7ffe4ab0b56c21842772b79af097fb37327cc71 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Mon, 27 Oct 2014 09:32:07 +0100 Subject: [PATCH] aac: only present AAC setting when available AAC-ELD 22/32/44/48kHz can be used if echo canceller is disabled. AAC 16kHz is always available. --- src/org/linphone/SettingsFragment.java | 60 ++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 4 deletions(-) diff --git a/src/org/linphone/SettingsFragment.java b/src/org/linphone/SettingsFragment.java index e3e4ec3c8..62344d085 100644 --- a/src/org/linphone/SettingsFragment.java +++ b/src/org/linphone/SettingsFragment.java @@ -60,6 +60,7 @@ public class SettingsFragment extends PreferencesListFragment implements EcCalib private LinphonePreferences mPrefs; private Handler mHandler = new Handler(); private TunnelConfig tunnelConfig; + private List aacCheckboxPreferences = new ArrayList(); public SettingsFragment() { super(R.xml.preferences); @@ -423,14 +424,21 @@ public class SettingsFragment extends PreferencesListFragment implements EcCalib PreferenceCategory codecs = (PreferenceCategory) findPreference(getString(R.string.pref_codecs_key)); codecs.removeAll(); + aacCheckboxPreferences.clear(); + LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); + boolean aecEnabled = lc.isEchoCancellationEnabled(); + for (final PayloadType pt : lc.getAudioCodecs()) { CheckBoxPreference codec = new CheckBoxPreference(LinphoneService.instance()); codec.setTitle(pt.getMime()); + codec.setSummary(pt.getRate() + " Hz"); + codec.setChecked(lc.isPayloadTypeEnabled(pt)); + /* Special case */ if (pt.getMime().equals("mpeg4-generic")) { + /* Make sure AAC is disabled for Android < 4.1 */ if (android.os.Build.VERSION.SDK_INT < 16) { - /* Make sure AAC is disabled */ try { lc.enablePayloadType(pt, false); } catch (LinphoneCoreException e) { @@ -439,12 +447,22 @@ public class SettingsFragment extends PreferencesListFragment implements EcCalib continue; } else { codec.setTitle("AAC-ELD"); + + /* AAC 16kHz is always authorized. Other sample rates are + * usable if and only if echo canceller is disabled. + * So we store the checkbox to be able to gray them out + * in the aec-preference listener. + */ + if (pt.getRate() != 16000) { + aacCheckboxPreferences.add(codec); + + if (aecEnabled) { + disableAACPayload(lc, pt, codec); + } + } } } - codec.setSummary(pt.getRate() + " Hz"); - codec.setChecked(lc.isPayloadTypeEnabled(pt)); - codec.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { @@ -481,12 +499,46 @@ public class SettingsFragment extends PreferencesListFragment implements EcCalib bitrateLimit.setValue(String.valueOf(mPrefs.getCodecBitrateLimit())); } + private void disableAACPayload(LinphoneCore lc, PayloadType pt, CheckBoxPreference codec) { + codec.setEnabled(false); + codec.setChecked(false); + try { + lc.enablePayloadType(pt, false); + } catch (LinphoneCoreException e) { + e.printStackTrace(); + } + } + private void setAudioPreferencesListener() { findPreference(getString(R.string.pref_echo_cancellation_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { boolean enabled = (Boolean) newValue; mPrefs.setEchoCancellation(enabled); + + LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull(); + + if (lc != null) { + /* Update UI */ + for (CheckBoxPreference pref : aacCheckboxPreferences) { + /* gray-out button if echo-canceller is enabled */ + pref.setEnabled(!enabled); + /* and disable codec as-well */ + pref.setChecked(false); + } + /* Disable AAC (except 16kHz) if AEC is enabled */ + if (enabled) { + for (final PayloadType pt : lc.getAudioCodecs()) { + if (pt.getMime().equals("mpeg4-generic") && pt.getRate() != 16000) { + try { + lc.enablePayloadType(pt, false); + } catch (LinphoneCoreException exc) { + exc.printStackTrace(); + } + } + } + } + } return true; } });