applyAudioCodecPreferences method
Applies audio codec preferences to the peer connection's audio transceiver. This method must be called before creating an offer or answer to ensure the preferred codecs are negotiated in the correct order.
peerConnection
The RTCPeerConnection instance to apply preferences to
preferredCodecs
List of preferred audio codec maps in order of preference
Implementation
Future<void> applyAudioCodecPreferences(
RTCPeerConnection peerConnection,
List<Map<String, dynamic>>? preferredCodecs,
) async {
if (preferredCodecs == null || preferredCodecs.isEmpty) {
GlobalLogger().d(
'Peer :: ApplyPreferredCodec :: No codec preferences provided, using defaults',
);
return;
}
try {
GlobalLogger().d(
'Peer :: ApplyPreferredCodec :: Attempting to apply ${preferredCodecs.length} codec preferences',
);
// Use CodecUtils to find the audio transceiver
final audioTransceiver =
await CodecUtils.findAudioTransceiver(peerConnection);
if (audioTransceiver == null) {
GlobalLogger().w(
'Peer :: ApplyPreferredCodec :: No audio transceiver found, cannot apply codec preferences',
);
return;
}
GlobalLogger().d(
'Peer :: ApplyPreferredCodec :: Audio transceiver found, converting codec maps to capabilities',
);
// Convert codec maps to capabilities
final codecCapabilities =
CodecUtils.convertAudioCodecMapsToCapabilities(preferredCodecs);
if (codecCapabilities.isEmpty) {
GlobalLogger().w(
'Peer :: No valid codec capabilities created, using defaults',
);
return;
}
GlobalLogger().d(
'Peer :: ApplyPreferredCodec :: Applying ${codecCapabilities.length} codec capabilities to transceiver',
);
// Apply codec preferences to transceiver
await audioTransceiver.setCodecPreferences(codecCapabilities);
GlobalLogger().d(
'Peer :: Successfully applied codec preferences. Order: ${codecCapabilities.map((c) => c.mimeType).toList()}',
);
} catch (e) {
GlobalLogger().e(
'Peer :: Error applying codec preferences: $e',
);
}
}