Kaynağa Gözat

修改midi播放调整速度时候,进度回调不正确的问题

Pq 2 yıl önce
ebeveyn
işleme
36932a6fc1

+ 17 - 0
midiplaylib/src/main/java/com/bassmedia/BassMusicPlay.java

@@ -235,6 +235,23 @@ public class BassMusicPlay {
     }
 
     /**
+     * 获取当前TICK
+     *
+     * @return
+     */
+    public int GetCurrentTICK() {
+        return (int) BASS.BASS_ChannelGetPosition(midi, BASSMIDI.BASS_POS_MIDI_TICK);
+    }
+
+    /**
+     * 获取总的TICK
+     * @return
+     */
+    public int GetTotalTICK(){
+        return (int) BASS.BASS_ChannelGetLength(midi, BASSMIDI.BASS_POS_MIDI_TICK);
+    }
+
+    /**
      * 获取总长度,为了追求进度,返回byte位置
      * BASS_ChannelBytes2Seconds 方法会丢失进度
      *

+ 19 - 0
midiplaylib/src/main/java/com/jinmingyunle/midiplaylib/MidiPlayerUtils.java

@@ -361,6 +361,25 @@ public class MidiPlayerUtils {
         return BassMusicPlay.getInstance().GetCurrentPosition();
     }
 
+    /**
+     * 获取当前播放的TICK
+     *
+     * @return
+     */
+    public int getCurrentTICK() {
+        return BassMusicPlay.getInstance().GetCurrentTICK();
+    }
+
+    /**
+     * 获取当前播放进度
+     *
+     * @return
+     */
+    public int getTotalTICK() {
+        return BassMusicPlay.getInstance().GetTotalTICK();
+    }
+
+
     public long getTotalLength() {
         return BassMusicPlay.getInstance().GetTotalLength();
     }

+ 8 - 1
student/src/main/java/com/cooleshow/student/ui/web/AccompanyFragment.java

@@ -2186,7 +2186,14 @@ public class AccompanyFragment extends BaseMVPFragment<FragmentAccompanyBinding,
         if (!MidiPlayerUtils.getInstance().isPlaying()) {
             return;
         }
-        long dur = MidiPlayerUtils.getInstance().getCurrentPosition() * (midiFileDuration == 0 ? MidiPlayerUtils.getInstance().midiTotalTime : midiFileDuration) / MidiPlayerUtils.getInstance().getTotalLength();
+        int tick = MidiPlayerUtils.getInstance().getCurrentTICK();
+        int totalTick = MidiPlayerUtils.getInstance().getTotalTICK();
+        float percent = (float) tick / (float) totalTick;
+        long totalTime = (midiFileDuration == 0 ? MidiPlayerUtils.getInstance().midiTotalTime : midiFileDuration);
+//        long dur = MidiPlayerUtils.getInstance().getCurrentPosition() * (midiFileDuration == 0 ? MidiPlayerUtils.getInstance().midiTotalTime : midiFileDuration) / MidiPlayerUtils.getInstance().getTotalLength();
+        long dur = (long) (percent * totalTime);
+        LogUtils.i("pq", "dur:" + dur);
+
         try {
             if (TextUtils.isEmpty(midiSongId)) {
                 return;

+ 8 - 1
teacher/src/main/java/com/cooleshow/teacher/ui/web/AccompanyFragment.java

@@ -50,6 +50,7 @@ import com.cooleshow.base.ui.fragment.BaseMVPFragment;
 import com.cooleshow.base.utils.AppUtils;
 import com.cooleshow.base.utils.HeadsetPlugListener;
 import com.cooleshow.base.utils.HeadsetPlugReceiver;
+import com.cooleshow.base.utils.LogUtils;
 import com.cooleshow.base.utils.PermissionUtils;
 import com.cooleshow.base.utils.ToastUtil;
 import com.cooleshow.base.utils.ToastUtils;
@@ -2181,7 +2182,13 @@ public class AccompanyFragment extends BaseMVPFragment<FragmentAccompanyBinding,
         if (!MidiPlayerUtils.getInstance().isPlaying()) {
             return;
         }
-        long dur = MidiPlayerUtils.getInstance().getCurrentPosition() * (midiFileDuration == 0 ? MidiPlayerUtils.getInstance().midiTotalTime : midiFileDuration) / MidiPlayerUtils.getInstance().getTotalLength();
+        int tick = MidiPlayerUtils.getInstance().getCurrentTICK();
+        int totalTick = MidiPlayerUtils.getInstance().getTotalTICK();
+        float percent = (float) tick / (float) totalTick;
+        long totalTime = (midiFileDuration == 0 ? MidiPlayerUtils.getInstance().midiTotalTime : midiFileDuration);
+//        long dur = MidiPlayerUtils.getInstance().getCurrentPosition() * (midiFileDuration == 0 ? MidiPlayerUtils.getInstance().midiTotalTime : midiFileDuration) / MidiPlayerUtils.getInstance().getTotalLength();
+        long dur = (long) (percent * totalTime);
+        LogUtils.i("pq", "dur:" + dur);
         try {
             if (TextUtils.isEmpty(midiSongId)) {
                 return;