Skip to content

Commit

Permalink
feat(upgrade): 3.4.1
Browse files Browse the repository at this point in the history
  • Loading branch information
RoJoHub committed Apr 23, 2021
1 parent 284f947 commit 11cef0f
Show file tree
Hide file tree
Showing 18 changed files with 337 additions and 96 deletions.
2 changes: 1 addition & 1 deletion android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -50,5 +50,5 @@ android {

dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${safeExtGet('kotlin_version', '1.3.72')}"
implementation "io.agora.rtc:full-sdk:3.3.2"
implementation "io.agora.rtc:full-sdk:3.4.1"
}
22 changes: 15 additions & 7 deletions android/src/main/java/io/agora/rtc/base/Annotations.java
Original file line number Diff line number Diff line change
Expand Up @@ -98,13 +98,20 @@ public class Annotations {
}

@IntDef({
Constants.MEDIA_ENGINE_AUDIO_ERROR_MIXING_OPEN,
Constants.MEDIA_ENGINE_AUDIO_ERROR_MIXING_TOO_FREQUENT,
Constants.MEDIA_ENGINE_AUDIO_EVENT_MIXING_INTERRUPTED_EOF,
AgoraAudioMixingErrorCode.MEDIA_ENGINE_AUDIO_ERROR_OK,
})
@Retention(RetentionPolicy.SOURCE)
public @interface AgoraAudioMixingErrorCode {
Constants.AUDIO_MIXING_REASON_CAN_NOT_OPEN,
Constants.AUDIO_MIXING_REASON_TOO_FREQUENT_CALL,
Constants.AUDIO_MIXING_REASON_INTERRUPTED_EOF,
Constants.AUDIO_MIXING_REASON_STARTED_BY_USER,
Constants.AUDIO_MIXING_REASON_ONE_LOOP_COMPLETED,
Constants.AUDIO_MIXING_REASON_START_NEW_LOOP,
Constants.AUDIO_MIXING_REASON_ALL_LOOPS_COMPLETED,
Constants.AUDIO_MIXING_REASON_STOPPED_BY_USER,
Constants.AUDIO_MIXING_REASON_PAUSED_BY_USER,
Constants.AUDIO_MIXING_REASON_RESUMED_BY_USER,
AgoraAudioMixingReason.MEDIA_ENGINE_AUDIO_ERROR_OK,
})
@Retention(RetentionPolicy.SOURCE)
public @interface AgoraAudioMixingReason {
int MEDIA_ENGINE_AUDIO_ERROR_OK = 0;
}

Expand Down Expand Up @@ -534,6 +541,7 @@ public class Annotations {
Constants.LOCAL_VIDEO_STREAM_ERROR_DEVICE_BUSY,
Constants.LOCAL_VIDEO_STREAM_ERROR_CAPTURE_FAILURE,
Constants.LOCAL_VIDEO_STREAM_ERROR_ENCODE_FAILURE,
Constants.LOCAL_VIDEO_STREAM_ERROR_DEVICE_NOT_FOUND
})
@Retention(RetentionPolicy.SOURCE)
public @interface AgoraLocalVideoStreamError {
Expand Down
19 changes: 19 additions & 0 deletions android/src/main/java/io/agora/rtc/base/BeanCovertor.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package io.agora.rtc.base

import android.graphics.Color
import io.agora.rtc.RtcEngineConfig
import io.agora.rtc.audio.AgoraRhythmPlayerConfig
import io.agora.rtc.audio.AudioRecordingConfiguration
import io.agora.rtc.internal.EncryptionConfig
import io.agora.rtc.internal.LastmileProbeConfig
import io.agora.rtc.live.LiveInjectStreamConfig
Expand Down Expand Up @@ -160,6 +162,14 @@ fun mapToLiveInjectStreamConfig(map: Map<*, *>): LiveInjectStreamConfig {
}
}

fun mapToRhythmPlayerConfig(map: Map<*, *>): AgoraRhythmPlayerConfig {
return AgoraRhythmPlayerConfig().apply {
(map["beatsPerMeasure"] as? Number)?.let { beatsPerMeasure = it.toInt() }
(map["beatsPerMinute"] as? Number)?.let { beatsPerMinute = it.toInt() }
(map["publish"] as? Boolean)?.let { publish = it }
}
}

fun mapToCameraCapturerConfiguration(map: Map<*, *>): CameraCapturerConfiguration {
return CameraCapturerConfiguration(
intToCapturerOutputPreference((map["preference"] as Number).toInt()),
Expand All @@ -186,6 +196,15 @@ fun mapToRtcEngineConfig(map: Map<*, *>): RtcEngineConfig {
}
}

fun mapToAudioRecordingConfiguration(map: Map<*, *>): AudioRecordingConfiguration {
return AudioRecordingConfiguration().apply {
(map["filePath"] as? String)?.let { filePath = it }
(map["quality"] as? Number)?.let { recordingQuality = it.toInt() }
(map["recordingPosition"] as? Number)?.let { recordingPosition = it.toInt() }
(map["sampleRate"] as? Number)?.let { recordingSampleRate = it.toInt() }
}
}

fun mapToEncryptionConfig(map: Map<*, *>): EncryptionConfig {
return EncryptionConfig().apply {
(map["encryptionMode"] as? Number)?.let { encryptionMode = intToEncryptionMode(it.toInt()) }
Expand Down
57 changes: 55 additions & 2 deletions android/src/main/java/io/agora/rtc/base/RtcEngine.kt
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,12 @@ class IRtcEngine {
fun setDefaultMuteAllRemoteAudioStreams(params: Map<String, *>, callback: Callback)

fun enableAudioVolumeIndication(params: Map<String, *>, callback: Callback)

fun startRhythmPlayer(params: Map<String, *>,callback: Callback)

fun stopRhythmPlayer(callback: Callback)

fun configRhythmPlayer(params: Map<String, *>,callback: Callback)
}

interface RtcVideoInterface {
Expand Down Expand Up @@ -149,7 +155,7 @@ class IRtcEngine {

fun getAudioMixingPublishVolume(callback: Callback)

fun getAudioMixingDuration(callback: Callback)
fun getAudioMixingDuration(params: Map<String, *>, callback: Callback)

fun getAudioMixingCurrentPosition(callback: Callback)

Expand All @@ -167,6 +173,12 @@ class IRtcEngine {

fun playEffect(params: Map<String, *>, callback: Callback)

fun setEffectPosition(params: Map<String, *>, callback: Callback)

fun getEffectDuration(params: Map<String, *>, callback: Callback)

fun getEffectCurrentPosition(params: Map<String, *>, callback: Callback)

fun stopEffect(params: Map<String, *>, callback: Callback)

fun stopAllEffects(callback: Callback)
Expand Down Expand Up @@ -563,6 +575,17 @@ class RtcEngineManager(
override fun enableAudioVolumeIndication(params: Map<String, *>, callback: Callback) {
callback.code(engine?.enableAudioVolumeIndication((params["interval"] as Number).toInt(), (params["smooth"] as Number).toInt(), params["report_vad"] as Boolean))
}
override fun startRhythmPlayer(params: Map<String, *>,callback: Callback){
callback.code(engine?.audioEffectManager?.startRhythmPlayer(params["sound1"] as String, params["sound2"] as String,mapToRhythmPlayerConfig(params["config"] as Map<*, *>)))
}

override fun stopRhythmPlayer(callback: Callback){
callback.code(engine?.audioEffectManager?.stopRhythmPlayer())
}

override fun configRhythmPlayer(params: Map<String, *>,callback: Callback){
callback.code(engine?.audioEffectManager?.configRhythmPlayer(mapToRhythmPlayerConfig(params as Map<*, *>)))
}

override fun enableVideo(callback: Callback) {
callback.code(engine?.enableVideo())
Expand Down Expand Up @@ -613,6 +636,10 @@ class RtcEngineManager(
}

override fun startAudioMixing(params: Map<String, *>, callback: Callback) {
(params["startPos"] as? Number)?.let { startPos ->
callback.code(engine?.startAudioMixing(params["filePath"] as String, params["loopback"] as Boolean, params["replace"] as Boolean, (params["cycle"] as Number).toInt(), startPos.toInt()))
return@startAudioMixing
}
callback.code(engine?.startAudioMixing(params["filePath"] as String, params["loopback"] as Boolean, params["replace"] as Boolean, (params["cycle"] as Number).toInt()))
}

Expand Down Expand Up @@ -648,7 +675,11 @@ class RtcEngineManager(
callback.code(engine?.audioMixingPublishVolume) { it }
}

override fun getAudioMixingDuration(callback: Callback) {
override fun getAudioMixingDuration(params: Map<String, *>, callback: Callback) {
(params["filePath"] as? String)?.let { file ->
callback.code(engine?.getAudioMixingDuration(file)){ it }
return@getAudioMixingDuration
}
callback.code(engine?.audioMixingDuration) { it }
}

Expand Down Expand Up @@ -677,9 +708,27 @@ class RtcEngineManager(
}

override fun playEffect(params: Map<String, *>, callback: Callback) {
(params["startPos"] as? Number)?.let { startPos ->
callback.code(engine?.audioEffectManager?.playEffect((params["soundId"] as Number).toInt(), params["filePath"] as String, (params["loopCount"] as Number).toInt(), (params["pitch"] as Number).toDouble(), (params["pan"] as Number).toDouble(), (params["gain"] as Number).toDouble(), params["publish"] as Boolean, startPos.toInt()))
return@playEffect
}
callback.code(engine?.audioEffectManager?.playEffect((params["soundId"] as Number).toInt(), params["filePath"] as String, (params["loopCount"] as Number).toInt(), (params["pitch"] as Number).toDouble(), (params["pan"] as Number).toDouble(), (params["gain"] as Number).toDouble(), params["publish"] as Boolean))
}

override fun setEffectPosition(params: Map<String, *>, callback: Callback){
callback.code(engine?.audioEffectManager?.setEffectPosition((params["soundId"] as Number).toInt(), (params["pos"] as Number).toInt()))
}

override fun getEffectDuration(params: Map<String, *>, callback: Callback){
callback.code(engine?.audioEffectManager?.getEffectDuration(params["filePath"] as String)){
it
}
}

override fun getEffectCurrentPosition(params: Map<String, *>, callback: Callback){
callback.code(engine?.audioEffectManager?.getEffectCurrentPosition((params["soundId"] as Number).toInt())){ it }
}

override fun stopEffect(params: Map<String, *>, callback: Callback) {
callback.code(engine?.audioEffectManager?.stopEffect((params["soundId"] as Number).toInt()))
}
Expand Down Expand Up @@ -912,6 +961,10 @@ class RtcEngineManager(
}

override fun startAudioRecording(params: Map<String, *>, callback: Callback) {
(params["recordingPosition"] as? Number)?.let {
callback.code(engine?.startAudioRecording(mapToAudioRecordingConfiguration(params)))
return@startAudioRecording
}
callback.code(engine?.startAudioRecording(params["filePath"] as String, (params["sampleRate"] as Number).toInt(), (params["quality"] as Number).toInt()))
}

Expand Down
4 changes: 2 additions & 2 deletions android/src/main/java/io/agora/rtc/base/RtcEngineEvent.kt
Original file line number Diff line number Diff line change
Expand Up @@ -360,8 +360,8 @@ class RtcEngineEventHandler(
callback(RtcEngineEvents.AudioMixingFinished)
}

override fun onAudioMixingStateChanged(@Annotations.AgoraAudioMixingStateCode state: Int, @Annotations.AgoraAudioMixingErrorCode errorCode: Int) {
callback(RtcEngineEvents.AudioMixingStateChanged, state, errorCode)
override fun onAudioMixingStateChanged(@Annotations.AgoraAudioMixingStateCode state: Int, @Annotations.AgoraAudioMixingReason reasonCode: Int) {
callback(RtcEngineEvents.AudioMixingStateChanged, state, reasonCode)
}

override fun onAudioEffectFinished(soundId: Int) {
Expand Down
76 changes: 15 additions & 61 deletions example/ios/Podfile
Original file line number Diff line number Diff line change
Expand Up @@ -10,78 +10,32 @@ project 'Runner', {
'Release' => :release,
}

def parse_KV_file(file, separator='=')
file_abs_path = File.expand_path(file)
if !File.exists? file_abs_path
return [];
def flutter_root
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
unless File.exist?(generated_xcode_build_settings_path)
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
end
generated_key_values = {}
skip_line_start_symbols = ["#", "/"]
File.foreach(file_abs_path) do |line|
next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ }
plugin = line.split(pattern=separator)
if plugin.length == 2
podname = plugin[0].strip()
path = plugin[1].strip()
podpath = File.expand_path("#{path}", file_abs_path)
generated_key_values[podname] = podpath
else
puts "Invalid plugin specification: #{line}"
end

File.foreach(generated_xcode_build_settings_path) do |line|
matches = line.match(/FLUTTER_ROOT\=(.*)/)
return matches[1].strip if matches
end
generated_key_values
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
end

require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)

flutter_ios_podfile_setup

target 'Runner' do
use_frameworks!
use_modular_headers!

# Flutter Pod

copied_flutter_dir = File.join(__dir__, 'Flutter')
copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework')
copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec')
unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path)
# Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet.
# That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration.
# CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist.

generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig')
unless File.exist?(generated_xcode_build_settings_path)
raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first"
end
generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path)
cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR'];

unless File.exist?(copied_framework_path)
FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir)
end
unless File.exist?(copied_podspec_path)
FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir)
end
end

# Keep pod path relative so it can be checked into Podfile.lock.
pod 'Flutter', :path => 'Flutter'

# Plugin Pods

# Prepare symlinks folder. We use symlinks to avoid having Podfile.lock
# referring to absolute paths on developers' machines.
system('rm -rf .symlinks')
system('mkdir -p .symlinks/plugins')
plugin_pods = parse_KV_file('../.flutter-plugins')
plugin_pods.each do |name, path|
symlink = File.join('.symlinks', 'plugins', name)
File.symlink(path, symlink)
pod name, :path => File.join(symlink, 'ios')
end
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end

post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['ENABLE_BITCODE'] = 'NO'
end
flutter_additional_ios_build_settings(target)
end
end

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

35 changes: 35 additions & 0 deletions ios/Classes/Base/BeanCovertor.swift
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,27 @@ func mapToRtcEngineConfig(_ map: Dictionary<String, Any>) -> AgoraRtcEngineConfi
return config
}

func mapToAudioRecordingConfiguration(_ map: Dictionary<String, Any>) -> AgoraAudioRecordingConfiguration {
let config = AgoraAudioRecordingConfiguration()
if let filePath = map["filePath"] as? String {
config.filePath = filePath
}
if let recordingQuality = map["quality"] as? NSNumber {
if let recordingQuality = AgoraAudioRecordingQuality.init(rawValue: recordingQuality.intValue) {
config.recordingQuality = recordingQuality
}
}
if let recordingPosition = map["recordingPosition"] as? NSNumber {
if let recordingPosition = AgoraAudioRecordingPosition.init(rawValue: recordingPosition.intValue) {
config.recordingPosition = recordingPosition
}
}
if let recordingSampleRate = map["sampleRate"] as? NSNumber {
config.recordingSampleRate = recordingSampleRate.intValue
}
return config
}

func mapToEncryptionConfig(_ map: Dictionary<String, Any>) -> AgoraEncryptionConfig {
let config = AgoraEncryptionConfig()
if let encryptionMode = map["encryptionMode"] as? NSNumber {
Expand All @@ -332,6 +353,20 @@ func mapToEncryptionConfig(_ map: Dictionary<String, Any>) -> AgoraEncryptionCon
return config
}

func mapToRhythmPlayerConfig(_ map: Dictionary<String, Any>) -> AgoraRtcRhythmPlayerConfig {
let config = AgoraRtcRhythmPlayerConfig()
if let beatsPerMeasure = map["beatsPerMeasure"] as? NSNumber {
config.beatsPerMeasure = beatsPerMeasure.uintValue;
}
if let beatsPerMinute = map["beatsPerMinute"] as? NSNumber {
config.beatsPerMinute = beatsPerMinute.uintValue;
}
if let publish = map["publish"] as? NSNumber {
config.publish = publish.boolValue;
}
return config
}

func mapToClientRoleOptions(_ map: Dictionary<String, Any>) -> AgoraClientRoleOptions {
let options = AgoraClientRoleOptions()
if let audienceLatencyLevel = map["audienceLatencyLevel"] as? NSNumber {
Expand Down
Loading

0 comments on commit 11cef0f

Please sign in to comment.