private string preferISAC(string sdpDescription)
{
string[] lines = sdpDescription.Split("\n", true);
int mLineIndex = -1;
string isac16kRtpMap = null;
Java.Util.Regex.Pattern isac16kPattern = Java.Util.Regex.Pattern.Compile("^a=rtpmap:(\\d+) ISAC/16000[\r]?$");
for (int i = 0; (i < lines.Length) && (mLineIndex == -1 || isac16kRtpMap == null); ++i)
{
if (lines[i].StartsWith("m=audio "))
{
mLineIndex = i;
continue;
}
Matcher isac16kMatcher = isac16kPattern.Matcher(lines[i]);
if (isac16kMatcher.Matches())
{
isac16kRtpMap = isac16kMatcher.Group(1);
continue;
}
}
if (mLineIndex == -1)
{
Log.Debug(TAG, "No m=audio line, so can't prefer iSAC");
return sdpDescription;
}
if (isac16kRtpMap == null)
{
Log.Debug(TAG, "No ISAC/16000 line, so can't prefer iSAC");
return sdpDescription;
}
string[] origMLineParts = lines[mLineIndex].Split(" ", true);
StringBuilder newMLine = new StringBuilder();
int origPartIndex = 0;
// Format is: m=<media> <port> <proto> <fmt> ...
newMLine.Append(origMLineParts[origPartIndex++]).Append(" ");
newMLine.Append(origMLineParts[origPartIndex++]).Append(" ");
newMLine.Append(origMLineParts[origPartIndex++]).Append(" ");
newMLine.Append(isac16kRtpMap).Append(" ");
for (; origPartIndex < origMLineParts.Length; ++origPartIndex)
{
if (!origMLineParts[origPartIndex].Equals(isac16kRtpMap))
{
newMLine.Append(origMLineParts[origPartIndex]).Append(" ");
}
}
lines[mLineIndex] = newMLine.ToString();
StringBuilder newSdpDescription = new StringBuilder();
foreach (string line in lines)
{
newSdpDescription.Append(line).Append("\n");
}
return newSdpDescription.ToString();
}