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.
This commit is contained in:
parent
13519c5387
commit
e7ffe4ab0b
1 changed files with 56 additions and 4 deletions
|
@ -60,6 +60,7 @@ public class SettingsFragment extends PreferencesListFragment implements EcCalib
|
||||||
private LinphonePreferences mPrefs;
|
private LinphonePreferences mPrefs;
|
||||||
private Handler mHandler = new Handler();
|
private Handler mHandler = new Handler();
|
||||||
private TunnelConfig tunnelConfig;
|
private TunnelConfig tunnelConfig;
|
||||||
|
private List<CheckBoxPreference> aacCheckboxPreferences = new ArrayList<CheckBoxPreference>();
|
||||||
|
|
||||||
public SettingsFragment() {
|
public SettingsFragment() {
|
||||||
super(R.xml.preferences);
|
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));
|
PreferenceCategory codecs = (PreferenceCategory) findPreference(getString(R.string.pref_codecs_key));
|
||||||
codecs.removeAll();
|
codecs.removeAll();
|
||||||
|
|
||||||
|
aacCheckboxPreferences.clear();
|
||||||
|
|
||||||
LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
|
LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
|
||||||
|
boolean aecEnabled = lc.isEchoCancellationEnabled();
|
||||||
|
|
||||||
for (final PayloadType pt : lc.getAudioCodecs()) {
|
for (final PayloadType pt : lc.getAudioCodecs()) {
|
||||||
CheckBoxPreference codec = new CheckBoxPreference(LinphoneService.instance());
|
CheckBoxPreference codec = new CheckBoxPreference(LinphoneService.instance());
|
||||||
codec.setTitle(pt.getMime());
|
codec.setTitle(pt.getMime());
|
||||||
|
codec.setSummary(pt.getRate() + " Hz");
|
||||||
|
codec.setChecked(lc.isPayloadTypeEnabled(pt));
|
||||||
|
|
||||||
/* Special case */
|
/* Special case */
|
||||||
if (pt.getMime().equals("mpeg4-generic")) {
|
if (pt.getMime().equals("mpeg4-generic")) {
|
||||||
|
/* Make sure AAC is disabled for Android < 4.1 */
|
||||||
if (android.os.Build.VERSION.SDK_INT < 16) {
|
if (android.os.Build.VERSION.SDK_INT < 16) {
|
||||||
/* Make sure AAC is disabled */
|
|
||||||
try {
|
try {
|
||||||
lc.enablePayloadType(pt, false);
|
lc.enablePayloadType(pt, false);
|
||||||
} catch (LinphoneCoreException e) {
|
} catch (LinphoneCoreException e) {
|
||||||
|
@ -439,11 +447,21 @@ public class SettingsFragment extends PreferencesListFragment implements EcCalib
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
codec.setTitle("AAC-ELD");
|
codec.setTitle("AAC-ELD");
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
codec.setSummary(pt.getRate() + " Hz");
|
/* AAC 16kHz is always authorized. Other sample rates are
|
||||||
codec.setChecked(lc.isPayloadTypeEnabled(pt));
|
* 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.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
|
codec.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -481,12 +499,46 @@ public class SettingsFragment extends PreferencesListFragment implements EcCalib
|
||||||
bitrateLimit.setValue(String.valueOf(mPrefs.getCodecBitrateLimit()));
|
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() {
|
private void setAudioPreferencesListener() {
|
||||||
findPreference(getString(R.string.pref_echo_cancellation_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
|
findPreference(getString(R.string.pref_echo_cancellation_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||||
boolean enabled = (Boolean) newValue;
|
boolean enabled = (Boolean) newValue;
|
||||||
mPrefs.setEchoCancellation(enabled);
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue