fix
This commit is contained in:
parent
f6d877403f
commit
f3021f7588
|
@ -27,6 +27,7 @@ import cn.migu.tsg.MRTCVideoFrame
|
||||||
import cn.migu.tsg.OnMRTCSDKListener
|
import cn.migu.tsg.OnMRTCSDKListener
|
||||||
import cn.migu.tsg.RoomListener
|
import cn.migu.tsg.RoomListener
|
||||||
import com.example.mrtcdemo.ui.theme.MRTCDemoTheme
|
import com.example.mrtcdemo.ui.theme.MRTCDemoTheme
|
||||||
|
import kotlin.concurrent.thread
|
||||||
|
|
||||||
class MainActivity : ComponentActivity() {
|
class MainActivity : ComponentActivity() {
|
||||||
// 权限请求回调
|
// 权限请求回调
|
||||||
|
@ -96,7 +97,7 @@ class MainActivity : ComponentActivity() {
|
||||||
println("MRTCDEBUG ==================================")
|
println("MRTCDEBUG ==================================")
|
||||||
println("MRTCDEBUG streamId=$streamId, userId=$userId")
|
println("MRTCDEBUG streamId=$streamId, userId=$userId")
|
||||||
println("MRTCDEBUG frame, channel=${frame.channel}, length=${frame.length}, sampleRate=${frame.sampleRate}")
|
println("MRTCDEBUG frame, channel=${frame.channel}, length=${frame.length}, sampleRate=${frame.sampleRate}")
|
||||||
println(frame.audioBuffer)
|
println(frame.audioBuffer.toString())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private val sdkListener_ = object : OnMRTCSDKListener {
|
private val sdkListener_ = object : OnMRTCSDKListener {
|
||||||
|
@ -107,11 +108,11 @@ class MainActivity : ComponentActivity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onRTMRoom(p0: Int, p1: Int) {
|
override fun onRTMRoom(p0: Int, p1: Int) {
|
||||||
println("MRTCDEBUG onRTMRoom()")
|
TODO("Not yet implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onProducer(p0: Int, p1: MRTCAdapter.MRTCProducerInfo?) {
|
override fun onProducer(p0: Int, p1: MRTCAdapter.MRTCProducerInfo?) {
|
||||||
println("MRTCDEBUG onProducer()")
|
TODO("Not yet implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onConsumer(msgId: Int, roomId: String?, peerId: String?, p3: Any?) {
|
override fun onConsumer(msgId: Int, roomId: String?, peerId: String?, p3: Any?) {
|
||||||
|
@ -134,47 +135,47 @@ class MainActivity : ComponentActivity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCustomData(p0: MRTCAdapter.MRTCCustomData?) {
|
override fun onCustomData(p0: MRTCAdapter.MRTCCustomData?) {
|
||||||
println("MRTCDEBUG onCustomData()")
|
TODO("Not yet implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDataProducer(p0: Int, p1: Int) {
|
override fun onDataProducer(p0: Int, p1: Int) {
|
||||||
println("MRTCDEBUG onDataProducer()")
|
TODO("Not yet implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDataConsumer(p0: Int, p1: Int) {
|
override fun onDataConsumer(p0: Int, p1: Int) {
|
||||||
println("MRTCDEBUG onDataConsumer()")
|
TODO("Not yet implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onMessager(p0: String?, p1: String?, p2: String?, p3: String?) {
|
override fun onMessager(p0: String?, p1: String?, p2: String?, p3: String?) {
|
||||||
println("MRTCDEBUG onMessager()")
|
TODO("Not yet implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onRender(p0: String?, p1: String?, p2: Int, p3: Int, p4: MRTCVideoFrame?) {
|
override fun onRender(p0: String?, p1: String?, p2: Int, p3: Int, p4: MRTCVideoFrame?) {
|
||||||
println("MRTCDEBUG onRender()")
|
TODO("Not yet implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onScreenShot(p0: Bitmap?) {
|
override fun onScreenShot(p0: Bitmap?) {
|
||||||
println("MRTCDEBUG onScreenShot()")
|
TODO("Not yet implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onLocalAudioStats(p0: MRTCAdapter.MRTCLocalAudioStats?) {
|
override fun onLocalAudioStats(p0: MRTCAdapter.MRTCLocalAudioStats?) {
|
||||||
println("MRTCDEBUG onLocalAudioStats()")
|
TODO("Not yet implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onLocalVideoStats(p0: MRTCAdapter.MRTCLocalVideoStats?) {
|
override fun onLocalVideoStats(p0: MRTCAdapter.MRTCLocalVideoStats?) {
|
||||||
println("MRTCDEBUG onLocalVideoStats()")
|
TODO("Not yet implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onRemoteAudioStats(p0: MRTCAdapter.MRTCRemoteAudioStats?) {
|
override fun onRemoteAudioStats(p0: MRTCAdapter.MRTCRemoteAudioStats?) {
|
||||||
println("MRTCDEBUG onRemoteAudioStats()")
|
TODO("Not yet implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onRemoteVideoStats(p0: MRTCAdapter.MRTCRemoteVideoStats?) {
|
override fun onRemoteVideoStats(p0: MRTCAdapter.MRTCRemoteVideoStats?) {
|
||||||
println("MRTCDEBUG onRemoteVideoStats()")
|
TODO("Not yet implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onSoundLevelUpdate(p0: String?, p1: String?, p2: Int, p3: Int, p4: Int) {
|
override fun onSoundLevelUpdate(p0: String?, p1: String?, p2: Int, p3: Int, p4: Int) {
|
||||||
println("MRTCDEBUG onSoundLevelUpdate()")
|
TODO("Not yet implemented")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -182,32 +183,35 @@ class MainActivity : ComponentActivity() {
|
||||||
println("MRTCDEBUG initMRTCEngine=======================")
|
println("MRTCDEBUG initMRTCEngine=======================")
|
||||||
|
|
||||||
val config = MRTCAdapter.Config().apply {
|
val config = MRTCAdapter.Config().apply {
|
||||||
|
// 设置必要参数(根据SDK文档补充)
|
||||||
applicationId = applicationId_
|
applicationId = applicationId_
|
||||||
mAppSecrectKey = mAppSecrectKey_
|
mAppSecrectKey = mAppSecrectKey_
|
||||||
domain = domain_
|
domain = domain_
|
||||||
mPort = mPort_
|
mPort = mPort_
|
||||||
}
|
}
|
||||||
var roomListener = RoomListener()
|
|
||||||
roomListener.setOnDorySDKListener(sdkListener_)
|
RoomListener().setOnDorySDKListener(sdkListener_)
|
||||||
//MRTCEngine.setSDKLogDirectory("/Users/wangjiyu/StudioProjects/Log")
|
|
||||||
var ret1 = MRTCEngine.getDefault().init(config, this)
|
val ret1 = MRTCEngine.getDefault().init(config, this)
|
||||||
if (ret1 != 0) {
|
if (ret1 != 0) {
|
||||||
println("MRTCDEBUG RTCContext::instance().init() failed, ret:$ret1")
|
println("MRTCDEBUG RTCContext::instance().init() failed, ret:$ret1")
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MRTCEngine.getDefault().registerListener(MRTCAdapter.MRTCListenerType.TYPE_LISTENER_ROOM)
|
||||||
|
MRTCEngine.getDefault().registerListener(MRTCAdapter.MRTCListenerType.TYPE_LISTENER_CONSUMER)
|
||||||
|
MRTCEngine.getDefault().registerReceivedMicAudioFrameListener(audioListener_)
|
||||||
|
|
||||||
MRTCEngine.getDefault().setUserInfo(srcUserId_,srcDisplayName_,srcRoomId_)
|
MRTCEngine.getDefault().setUserInfo(srcUserId_,srcDisplayName_,srcRoomId_)
|
||||||
var loginConfig = MRTCAdapter.LoginConfigParams().apply {
|
val loginConfig = MRTCAdapter.LoginConfigParams().apply {
|
||||||
mAppId = applicationId_
|
mAppId = applicationId_
|
||||||
mAppSecrectKey = mAppSecrectKey_
|
mAppSecrectKey = mAppSecrectKey_
|
||||||
}
|
}
|
||||||
MRTCEngine.getDefault().registerListener(MRTCAdapter.MRTCListenerType.TYPE_LISTENER_ROOM)
|
val ret2 = MRTCEngine.getDefault().joinRoom(loginConfig)
|
||||||
MRTCEngine.getDefault().registerListener(MRTCAdapter.MRTCListenerType.TYPE_LISTENER_CONSUMER)
|
|
||||||
var ret2 = MRTCEngine.getDefault().joinRoom(loginConfig)
|
|
||||||
if (ret2 != 0) {
|
if (ret2 != 0) {
|
||||||
println("MRTCDEBUG RTCContext::instance().joinRoom() failed, ret:$ret2")
|
println("MRTCDEBUG RTCContext::instance().joinRoom() failed, ret:$ret2")
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
MRTCEngine.getDefault().registerReceivedMicAudioFrameListener(audioListener_)
|
|
||||||
println("MRTCDEBUG init succ")
|
println("MRTCDEBUG init succ")
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@ -280,15 +284,16 @@ class MainActivity : ComponentActivity() {
|
||||||
println("MRTCDEBUG init fail, ret:$ret1")
|
println("MRTCDEBUG init fail, ret:$ret1")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
thread {
|
||||||
var ret2 = initSendMRTCEngine()
|
var ret2 = initSendMRTCEngine()
|
||||||
if (!ret2) {
|
if (!ret2) {
|
||||||
println("MRTCDEBUG initSend fail, ret:$ret2")
|
println("MRTCDEBUG initSend fail, ret:$ret2")
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
thread {
|
||||||
var ret3 = initRecvMRTCEngine()
|
var ret3 = initRecvMRTCEngine()
|
||||||
if (!ret3) {
|
if (!ret3) {
|
||||||
println("MRTCDEBUG initRecv fail, ret:$ret3")
|
println("MRTCDEBUG initRecv fail, ret:$ret3")
|
||||||
return
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val data: ByteArray = "Hello".toByteArray(Charsets.UTF_8)
|
val data: ByteArray = "Hello".toByteArray(Charsets.UTF_8)
|
||||||
|
@ -299,12 +304,12 @@ class MainActivity : ComponentActivity() {
|
||||||
|
|
||||||
var ret4 = sendCustomAudioData(data, dataLength)
|
var ret4 = sendCustomAudioData(data, dataLength)
|
||||||
if (!ret4) {
|
if (!ret4) {
|
||||||
println("MRTCDEBUG send fail, ret:$ret3")
|
println("MRTCDEBUG send fail, ret:$ret4")
|
||||||
return
|
|
||||||
}
|
}
|
||||||
Thread.sleep(3000)
|
Thread.sleep(3000)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -317,6 +322,7 @@ class MainActivity : ComponentActivity() {
|
||||||
text = if (isSDKReady.value) "Hello $name! (SDK Ready)" else "Loading SDK1...",
|
text = if (isSDKReady.value) "Hello $name! (SDK Ready)" else "Loading SDK1...",
|
||||||
modifier = modifier
|
modifier = modifier
|
||||||
)
|
)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Preview(showBackground = true)
|
@Preview(showBackground = true)
|
||||||
|
@ -328,4 +334,3 @@ class MainActivity : ComponentActivity() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,331 @@
|
||||||
|
package com.example.mrtcdemo
|
||||||
|
|
||||||
|
import android.Manifest
|
||||||
|
import android.app.Activity
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.res.AssetManager
|
||||||
|
import android.graphics.Bitmap
|
||||||
|
import android.os.Bundle
|
||||||
|
import androidx.activity.ComponentActivity
|
||||||
|
import androidx.activity.compose.setContent
|
||||||
|
import androidx.activity.enableEdgeToEdge
|
||||||
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
|
import androidx.compose.foundation.layout.padding
|
||||||
|
import androidx.compose.material3.Scaffold
|
||||||
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
|
import androidx.compose.runtime.mutableStateOf
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.platform.LocalContext
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import cn.migu.tsg.MRTCEngine
|
||||||
|
import cn.migu.tsg.MRTCAdapter
|
||||||
|
import cn.migu.tsg.MRTCVideoFrame
|
||||||
|
import cn.migu.tsg.OnMRTCSDKListener
|
||||||
|
import cn.migu.tsg.RoomListener
|
||||||
|
import com.example.mrtcdemo.ui.theme.MRTCDemoTheme
|
||||||
|
|
||||||
|
class MainActivity : ComponentActivity() {
|
||||||
|
// 权限请求回调
|
||||||
|
private val permissionLauncher = registerForActivityResult(
|
||||||
|
ActivityResultContracts.RequestMultiplePermissions()
|
||||||
|
) { permissions ->
|
||||||
|
if (permissions.all { it.value }) {
|
||||||
|
// 所有权限已授予,开始加载SDK
|
||||||
|
} else {
|
||||||
|
// 处理权限被拒绝的情况
|
||||||
|
showToast("权限被拒绝,功能将受限")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
enableEdgeToEdge()
|
||||||
|
|
||||||
|
// 请求必要权限
|
||||||
|
requestPermissions()
|
||||||
|
|
||||||
|
setContent {
|
||||||
|
MRTCDemoTheme {
|
||||||
|
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
|
||||||
|
Greeting(
|
||||||
|
name = "Android",
|
||||||
|
modifier = Modifier.padding(innerPadding)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun requestPermissions() {
|
||||||
|
permissionLauncher.launch(
|
||||||
|
arrayOf(
|
||||||
|
Manifest.permission.READ_EXTERNAL_STORAGE,
|
||||||
|
Manifest.permission.WRITE_EXTERNAL_STORAGE,
|
||||||
|
Manifest.permission.INTERNET,
|
||||||
|
Manifest.permission.RECORD_AUDIO
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
var applicationId_ = "1357389261426393088"
|
||||||
|
var mAppSecrectKey_ = "gytr3qrrznsgac2lbdchfg0l4ltqx4x3nf4my0yt1dbx7riz1gnnsnhblrlc2j4o1lx4vdu495lifv8s7jyrmfxtq9lif9rusxnur5smdn5cjopstxp5dim7p52xrezp"
|
||||||
|
var domain_ = "rtc.migu.cn"
|
||||||
|
var mPort_ = 34443
|
||||||
|
var srcUserId_ = "srcUser12"
|
||||||
|
var destUserId_ = "destUser12"
|
||||||
|
|
||||||
|
var srcDisplayName_ = "srcDisplayName12"
|
||||||
|
var destDisplayName_ = "destDisplayName12"
|
||||||
|
var srcRoomId_ = "srcRoom12"
|
||||||
|
var destRoomId_ = srcRoomId_
|
||||||
|
var srcChannelIndex_ = 46
|
||||||
|
var destChannelIndex_ = 47
|
||||||
|
var sampleRate_ = 16000
|
||||||
|
var channelNum_ = 1
|
||||||
|
var isOnRoom_ = false
|
||||||
|
var isOnConsumer_ = false
|
||||||
|
|
||||||
|
|
||||||
|
private val audioListener_ = object : MRTCAdapter.MRTCAudioProcessListener {
|
||||||
|
override fun onReceiveRawAudioFrame(streamId: String, userId: String, frame: MRTCAdapter.MRTCAudioFrame) {
|
||||||
|
// 在这里处理原始音频帧
|
||||||
|
println("MRTCDEBUG ==================================")
|
||||||
|
println("MRTCDEBUG streamId=$streamId, userId=$userId")
|
||||||
|
println("MRTCDEBUG frame, channel=${frame.channel}, length=${frame.length}, sampleRate=${frame.sampleRate}")
|
||||||
|
println(frame.audioBuffer)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private val sdkListener_ = object : OnMRTCSDKListener {
|
||||||
|
override fun onRoom(type: Int, roomInfo: MRTCAdapter.MRTCRoomInfo) {
|
||||||
|
println("MRTCDEBUG 房间状态变化: type=$type, roomId=${roomInfo.roomId}")
|
||||||
|
println("MRTCDEBUG RTCContext::onRoom()")
|
||||||
|
isOnRoom_ = true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onRTMRoom(p0: Int, p1: Int) {
|
||||||
|
println("MRTCDEBUG onRTMRoom()")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onProducer(p0: Int, p1: MRTCAdapter.MRTCProducerInfo?) {
|
||||||
|
println("MRTCDEBUG onProducer()")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onConsumer(msgId: Int, roomId: String?, peerId: String?, p3: Any?) {
|
||||||
|
println("MRTCDEBUG onConsumer, msgId:$msgId, roomId:$roomId, peerId:$peerId")
|
||||||
|
isOnConsumer_ = true
|
||||||
|
MRTCEngine.getDefault().registerSoundLevelListener(MRTCAdapter.MRTCAudioSourceType.TYPE_AUDIO_SOURCE_CUSTOM,
|
||||||
|
roomId, peerId, srcChannelIndex_)
|
||||||
|
var ret = MRTCEngine.getDefault().muteAudio(roomId, peerId, MRTCAdapter.MRTCAudioSourceType.TYPE_AUDIO_SOURCE_CUSTOM.type,
|
||||||
|
false, srcChannelIndex_)
|
||||||
|
if (ret != 0) {
|
||||||
|
println("MRTCDEBUG RTCContext::instance().muteAudio() failed, ret:$ret")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
println("MRTCDEBUG init recv succ")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun callBackMessage(code: Int, msg: String) {
|
||||||
|
println("MRTCDEBUG callBackMessage: [$code] $msg")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCustomData(p0: MRTCAdapter.MRTCCustomData?) {
|
||||||
|
println("MRTCDEBUG onCustomData()")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDataProducer(p0: Int, p1: Int) {
|
||||||
|
println("MRTCDEBUG onDataProducer()")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDataConsumer(p0: Int, p1: Int) {
|
||||||
|
println("MRTCDEBUG onDataConsumer()")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onMessager(p0: String?, p1: String?, p2: String?, p3: String?) {
|
||||||
|
println("MRTCDEBUG onMessager()")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onRender(p0: String?, p1: String?, p2: Int, p3: Int, p4: MRTCVideoFrame?) {
|
||||||
|
println("MRTCDEBUG onRender()")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onScreenShot(p0: Bitmap?) {
|
||||||
|
println("MRTCDEBUG onScreenShot()")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onLocalAudioStats(p0: MRTCAdapter.MRTCLocalAudioStats?) {
|
||||||
|
println("MRTCDEBUG onLocalAudioStats()")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onLocalVideoStats(p0: MRTCAdapter.MRTCLocalVideoStats?) {
|
||||||
|
println("MRTCDEBUG onLocalVideoStats()")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onRemoteAudioStats(p0: MRTCAdapter.MRTCRemoteAudioStats?) {
|
||||||
|
println("MRTCDEBUG onRemoteAudioStats()")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onRemoteVideoStats(p0: MRTCAdapter.MRTCRemoteVideoStats?) {
|
||||||
|
println("MRTCDEBUG onRemoteVideoStats()")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onSoundLevelUpdate(p0: String?, p1: String?, p2: Int, p3: Int, p4: Int) {
|
||||||
|
println("MRTCDEBUG onSoundLevelUpdate()")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun initMRTCEngine() : Boolean {
|
||||||
|
println("MRTCDEBUG initMRTCEngine=======================")
|
||||||
|
|
||||||
|
val config = MRTCAdapter.Config().apply {
|
||||||
|
applicationId = applicationId_
|
||||||
|
mAppSecrectKey = mAppSecrectKey_
|
||||||
|
domain = domain_
|
||||||
|
mPort = mPort_
|
||||||
|
}
|
||||||
|
var roomListener = RoomListener()
|
||||||
|
roomListener.setOnDorySDKListener(sdkListener_)
|
||||||
|
//MRTCEngine.setSDKLogDirectory("/Users/wangjiyu/StudioProjects/Log")
|
||||||
|
var ret1 = MRTCEngine.getDefault().init(config, this)
|
||||||
|
if (ret1 != 0) {
|
||||||
|
println("MRTCDEBUG RTCContext::instance().init() failed, ret:$ret1")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
MRTCEngine.getDefault().setUserInfo(srcUserId_,srcDisplayName_,srcRoomId_)
|
||||||
|
var loginConfig = MRTCAdapter.LoginConfigParams().apply {
|
||||||
|
mAppId = applicationId_
|
||||||
|
mAppSecrectKey = mAppSecrectKey_
|
||||||
|
}
|
||||||
|
MRTCEngine.getDefault().registerListener(MRTCAdapter.MRTCListenerType.TYPE_LISTENER_ROOM)
|
||||||
|
MRTCEngine.getDefault().registerListener(MRTCAdapter.MRTCListenerType.TYPE_LISTENER_CONSUMER)
|
||||||
|
var ret2 = MRTCEngine.getDefault().joinRoom(loginConfig)
|
||||||
|
if (ret2 != 0) {
|
||||||
|
println("MRTCDEBUG RTCContext::instance().joinRoom() failed, ret:$ret2")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
MRTCEngine.getDefault().registerReceivedMicAudioFrameListener(audioListener_)
|
||||||
|
println("MRTCDEBUG init succ")
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun initSendMRTCEngine() : Boolean {
|
||||||
|
while (!isOnRoom_)
|
||||||
|
{
|
||||||
|
println("MRTCDEBUG wait for OnRoom")
|
||||||
|
Thread.sleep(3000)
|
||||||
|
}
|
||||||
|
|
||||||
|
println("MRTCDEBUG initSendMRTCEngine=======================")
|
||||||
|
val option = MRTCAdapter.MRTCAudioOption().apply {
|
||||||
|
// 修改需要自定义的参数
|
||||||
|
sampleRate = sampleRate_
|
||||||
|
channel = 1 // 改为立体声
|
||||||
|
channelIndex = destChannelIndex_
|
||||||
|
echoCancellation = true // 开启回声消除
|
||||||
|
}
|
||||||
|
var ret = MRTCEngine.getDefault().startCustomAudio(option)
|
||||||
|
if (ret != 0) {
|
||||||
|
println("MRTCDEBUG startCustomAudio fail, ret:$ret")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
println("MRTCDEBUG init send succ")
|
||||||
|
return true
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun initRecvMRTCEngine() : Boolean {
|
||||||
|
println("MRTCDEBUG initRecvMRTCEngine=======================")
|
||||||
|
while (!isOnConsumer_)
|
||||||
|
{
|
||||||
|
println("MRTCDEBUG wait for OnConsumer")
|
||||||
|
Thread.sleep(3000)
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun sendCustomAudioData(data :ByteArray, dataLength :Int) : Boolean {
|
||||||
|
while(!isOnRoom_) {
|
||||||
|
println("MRTCDEBUG wait for room and multi room before send")
|
||||||
|
Thread.sleep(3000)
|
||||||
|
}
|
||||||
|
if (data == null) {
|
||||||
|
println("MRTCDEBUG customData is null")
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
println("MRTCDEBUG sendAudioData=======================")
|
||||||
|
MRTCEngine.getDefault().sendCustomAudioData(data, sampleRate_, channelNum_, dataLength)
|
||||||
|
return true
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun showToast(message: String) {
|
||||||
|
// 实现Toast显示
|
||||||
|
println("MRTCDEBUG showToast: $message")
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun Greeting(name: String, modifier: Modifier = Modifier) {
|
||||||
|
val context = LocalContext.current
|
||||||
|
val isSDKReady = remember { mutableStateOf(false) }
|
||||||
|
var ret1 = initMRTCEngine()
|
||||||
|
if (!ret1) {
|
||||||
|
println("MRTCDEBUG init fail, ret:$ret1")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var ret2 = initSendMRTCEngine()
|
||||||
|
if (!ret2) {
|
||||||
|
println("MRTCDEBUG initSend fail, ret:$ret2")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var ret3 = initRecvMRTCEngine()
|
||||||
|
if (!ret3) {
|
||||||
|
println("MRTCDEBUG initRecv fail, ret:$ret3")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val data: ByteArray = "Hello".toByteArray(Charsets.UTF_8)
|
||||||
|
val dataLength: Int = data.size
|
||||||
|
for (i in 1..100) {
|
||||||
|
println("MRTCDEBUG 第${i}次循环")
|
||||||
|
// 执行您的业务逻辑
|
||||||
|
|
||||||
|
var ret4 = sendCustomAudioData(data, dataLength)
|
||||||
|
if (!ret4) {
|
||||||
|
println("MRTCDEBUG send fail, ret:$ret3")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
Thread.sleep(3000)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 监听SDK状态
|
||||||
|
LaunchedEffect(Unit) {
|
||||||
|
// 这里可以添加SDK状态监听逻辑
|
||||||
|
}
|
||||||
|
|
||||||
|
Text(
|
||||||
|
text = if (isSDKReady.value) "Hello $name! (SDK Ready)" else "Loading SDK1...",
|
||||||
|
modifier = modifier
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview(showBackground = true)
|
||||||
|
@Composable
|
||||||
|
fun GreetingPreview() {
|
||||||
|
println("MRTCDEBUG GreetingPreview")
|
||||||
|
MRTCDemoTheme {
|
||||||
|
Greeting("Android")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue