diff --git a/.idea/AndroidProjectSystem.xml b/.idea/AndroidProjectSystem.xml
new file mode 100644
index 00000000..4a53bee8
--- /dev/null
+++ b/.idea/AndroidProjectSystem.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml
new file mode 100644
index 00000000..b268ef36
--- /dev/null
+++ b/.idea/deploymentTargetSelector.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
new file mode 100644
index 00000000..16660f1d
--- /dev/null
+++ b/.idea/runConfigurations.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 00000000..94a25f7f
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/rtc/VolumeManager.java b/moduleUtil/src/main/java/com/xscm/moduleutil/rtc/VolumeManager.java
new file mode 100644
index 00000000..113e269a
--- /dev/null
+++ b/moduleUtil/src/main/java/com/xscm/moduleutil/rtc/VolumeManager.java
@@ -0,0 +1,77 @@
+package com.xscm.moduleutil.rtc;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * com.xscm.moduleutil.rtc
+ * qx
+ * 2025/11/3
+ * 声网声音管理类
+ */
+public class VolumeManager {
+ private static VolumeManager instance;
+ private Map userMusicVolumeMap = new HashMap<>();
+ private Map userPlayoutVolumeMap = new HashMap<>();
+ private Map userPlayoutBzMap = new HashMap<>();
+ private String currentUserId;
+
+ private VolumeManager() {}
+
+ public static VolumeManager getInstance() {
+ if (instance == null) {
+ synchronized (VolumeManager.class) {
+ if (instance == null) {
+ instance = new VolumeManager();
+ }
+ }
+ }
+ return instance;
+ }
+
+ public void setCurrentUserId(String userId) {
+ this.currentUserId = userId;
+ }
+
+ public void saveCurrentVolumes(int musicVolume, int playoutVolume) {
+ if (currentUserId != null) {
+ userMusicVolumeMap.put(currentUserId, musicVolume);
+ userPlayoutVolumeMap.put(currentUserId, playoutVolume);
+ }
+ }
+ public void clearCurrentVolumes() {
+ if (currentUserId != null) {
+ userMusicVolumeMap.remove(currentUserId);
+ userPlayoutVolumeMap.remove(currentUserId);
+ }
+ userPlayoutBzMap.clear();
+ }
+
+ public void saveBz(String userId, boolean bz){
+ userPlayoutBzMap.clear();
+ userPlayoutBzMap.put(userId, bz);
+ }
+
+ public boolean getBz(String userId){
+ Boolean bz = userPlayoutBzMap.get(userId);
+ if (bz == null) {
+ bz = true; // 默认值原唱 false 伴奏
+ }
+ return bz;
+ }
+
+ public int[] getUserVolumes(String userId) {
+ Integer musicVolume = userMusicVolumeMap.get(userId);
+ Integer playoutVolume = userPlayoutVolumeMap.get(userId);
+
+ if (musicVolume == null) {
+ musicVolume = 100; // 默认值
+ }
+ if (playoutVolume == null) {
+ playoutVolume = 50; // 默认值
+ }
+
+ return new int[]{musicVolume, playoutVolume};
+ }
+}
+
diff --git a/moduleUtil/src/main/res/mipmap-hdpi/accompany_off.webp b/moduleUtil/src/main/res/mipmap-hdpi/accompany_off.webp
new file mode 100644
index 00000000..9c75fd1d
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-hdpi/accompany_off.webp differ
diff --git a/moduleUtil/src/main/res/mipmap-hdpi/accompany_on.webp b/moduleUtil/src/main/res/mipmap-hdpi/accompany_on.webp
new file mode 100644
index 00000000..8d12720b
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-hdpi/accompany_on.webp differ
diff --git a/moduleUtil/src/main/res/mipmap-hdpi/icon_liang.webp b/moduleUtil/src/main/res/mipmap-hdpi/icon_liang.webp
new file mode 100644
index 00000000..f429f26d
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-hdpi/icon_liang.webp differ
diff --git a/moduleUtil/src/main/res/mipmap-hdpi/muisc_reward.webp b/moduleUtil/src/main/res/mipmap-hdpi/muisc_reward.webp
new file mode 100644
index 00000000..b24e1b2c
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-hdpi/muisc_reward.webp differ
diff --git a/moduleUtil/src/main/res/mipmap-hdpi/muisc_switch.webp b/moduleUtil/src/main/res/mipmap-hdpi/muisc_switch.webp
new file mode 100644
index 00000000..8885a78d
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-hdpi/muisc_switch.webp differ
diff --git a/moduleUtil/src/main/res/mipmap-hdpi/muisc_tyt.webp b/moduleUtil/src/main/res/mipmap-hdpi/muisc_tyt.webp
new file mode 100644
index 00000000..726606da
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-hdpi/muisc_tyt.webp differ
diff --git a/moduleUtil/src/main/res/mipmap-xhdpi/accompany_off.webp b/moduleUtil/src/main/res/mipmap-xhdpi/accompany_off.webp
new file mode 100644
index 00000000..8065c9be
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xhdpi/accompany_off.webp differ
diff --git a/moduleUtil/src/main/res/mipmap-xhdpi/accompany_on.webp b/moduleUtil/src/main/res/mipmap-xhdpi/accompany_on.webp
new file mode 100644
index 00000000..fe7e84d7
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xhdpi/accompany_on.webp differ
diff --git a/moduleUtil/src/main/res/mipmap-xhdpi/icon_liang.webp b/moduleUtil/src/main/res/mipmap-xhdpi/icon_liang.webp
new file mode 100644
index 00000000..9a6378a0
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xhdpi/icon_liang.webp differ
diff --git a/moduleUtil/src/main/res/mipmap-xhdpi/muisc_reward.webp b/moduleUtil/src/main/res/mipmap-xhdpi/muisc_reward.webp
new file mode 100644
index 00000000..58eeb34e
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xhdpi/muisc_reward.webp differ
diff --git a/moduleUtil/src/main/res/mipmap-xhdpi/muisc_switch.webp b/moduleUtil/src/main/res/mipmap-xhdpi/muisc_switch.webp
new file mode 100644
index 00000000..80eb4425
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xhdpi/muisc_switch.webp differ
diff --git a/moduleUtil/src/main/res/mipmap-xhdpi/muisc_tyt.webp b/moduleUtil/src/main/res/mipmap-xhdpi/muisc_tyt.webp
new file mode 100644
index 00000000..47611afc
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xhdpi/muisc_tyt.webp differ
diff --git a/moduleUtil/src/main/res/mipmap-xxhdpi/accompany_off.webp b/moduleUtil/src/main/res/mipmap-xxhdpi/accompany_off.webp
new file mode 100644
index 00000000..f90eea1d
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxhdpi/accompany_off.webp differ
diff --git a/moduleUtil/src/main/res/mipmap-xxhdpi/accompany_on.webp b/moduleUtil/src/main/res/mipmap-xxhdpi/accompany_on.webp
new file mode 100644
index 00000000..fdf2c359
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxhdpi/accompany_on.webp differ
diff --git a/moduleUtil/src/main/res/mipmap-xxhdpi/icon_liang.webp b/moduleUtil/src/main/res/mipmap-xxhdpi/icon_liang.webp
new file mode 100644
index 00000000..3602e0dc
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxhdpi/icon_liang.webp differ
diff --git a/moduleUtil/src/main/res/mipmap-xxhdpi/muisc_reward.webp b/moduleUtil/src/main/res/mipmap-xxhdpi/muisc_reward.webp
new file mode 100644
index 00000000..c563f6d7
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxhdpi/muisc_reward.webp differ
diff --git a/moduleUtil/src/main/res/mipmap-xxhdpi/muisc_switch.webp b/moduleUtil/src/main/res/mipmap-xxhdpi/muisc_switch.webp
new file mode 100644
index 00000000..46f8d797
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxhdpi/muisc_switch.webp differ
diff --git a/moduleUtil/src/main/res/mipmap-xxhdpi/muisc_tyt.webp b/moduleUtil/src/main/res/mipmap-xxhdpi/muisc_tyt.webp
new file mode 100644
index 00000000..b1bb8034
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxhdpi/muisc_tyt.webp differ
diff --git a/moduletablayout/src/androidTest/java/com/example/moduletablayout/ExampleInstrumentedTest.java b/moduletablayout/src/androidTest/java/com/example/moduletablayout/ExampleInstrumentedTest.java
new file mode 100644
index 00000000..b9144cc5
--- /dev/null
+++ b/moduletablayout/src/androidTest/java/com/example/moduletablayout/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package com.example.moduletablayout;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("com.example.moduletablayout", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/moduletablayout/src/test/java/com/example/moduletablayout/ExampleUnitTest.java b/moduletablayout/src/test/java/com/example/moduletablayout/ExampleUnitTest.java
new file mode 100644
index 00000000..2f7018d9
--- /dev/null
+++ b/moduletablayout/src/test/java/com/example/moduletablayout/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.example.moduletablayout;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file