From 2ee6209a6a06435a23e9651beab6c180127ebca7 Mon Sep 17 00:00:00 2001 From: wuqifeng <540416539@qq.com> Date: Wed, 12 Jun 2024 00:56:18 +0800 Subject: [PATCH] feat:绘本播放状态优化 --- lib/pages/reading/bloc/reading_bloc.dart | 50 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/lib/pages/reading/bloc/reading_bloc.dart b/lib/pages/reading/bloc/reading_bloc.dart index d6a6dc4..85cf809 100644 --- a/lib/pages/reading/bloc/reading_bloc.dart +++ b/lib/pages/reading/bloc/reading_bloc.dart @@ -95,7 +95,7 @@ class ReadingPageBloc //音频播放器 audioPlayer = AudioPlayer(); audioPlayer.onPlayerStateChanged.listen((event) async { - debugPrint('播放状态变化'); + Log.d("播放状态变化 event=$event"); if (event == PlayerState.completed) { debugPrint('播放完成'); _voicePlayState = VoicePlayState.completed; @@ -104,13 +104,18 @@ class ReadingPageBloc if (event == PlayerState.stopped) { debugPrint('播放结束'); _voicePlayState = VoicePlayState.stop; - _onAudioPlayComplete(); } if (event == PlayerState.playing) { debugPrint('正在播放中'); _voicePlayState = VoicePlayState.playing; } + + if (event == PlayerState.disposed) { + debugPrint('播放器释放'); + _voicePlayState = VoicePlayState.unKnow; + } + if (isClosed) { return; } @@ -181,7 +186,7 @@ class ReadingPageBloc Emitter emitter) async { _currentPage = event.pageIndex; _voiceXsCancel(); - _playOriginalAudioInner(null); + _playOriginalAudioInner(null, forcePlay: true); emitter(CurrentPageIndexState()); } @@ -218,20 +223,27 @@ class ReadingPageBloc } ///播放原音音频 - void _playOriginalAudioInner(String? audioUrl) async { + /// - [force]: 是否强制播放(true:不管当前状态如何,都会播放目标原音音频,比如翻页场景) + /// (false:如果正在播放,暂停播放,比如点击播放按钮场景) + void _playOriginalAudioInner(String? audioUrl, {bool forcePlay = false}) async { if (_isRecordAudioPlaying) { + await audioPlayer.stop(); _isRecordAudioPlaying = false; } Log.d( "_playOriginalAudio _isRecordAudioPlaying=$_isRecordAudioPlaying _isOriginAudioPlaying=$_isOriginAudioPlaying url=$audioUrl"); if (_isOriginAudioPlaying) { - _isOriginAudioPlaying = false; await audioPlayer.stop(); + _isOriginAudioPlaying = false; + if (forcePlay) { + audioUrl ??= currentPageData()?.audioUrl ?? ''; + await _playAudio(audioUrl); + _isOriginAudioPlaying = true; + } } else { - _isOriginAudioPlaying = true; - Log.d("_playOriginalAudioInner _isOriginAudioPlaying: true"); audioUrl ??= currentPageData()?.audioUrl ?? ''; - _playAudio(audioUrl); + await _playAudio(audioUrl); + _isOriginAudioPlaying = true; } } @@ -242,23 +254,27 @@ class ReadingPageBloc } Future _playRecordAudioInner() async { + Log.d( + "_playRecordAudioInner _isOriginAudioPlaying=$_isOriginAudioPlaying _isRecordAudioPlaying=$_isRecordAudioPlaying url=${currentPageData() + ?.recordUrl}"); if (_isOriginAudioPlaying) { + ///如果正在播放原音,暂停 + await audioPlayer.stop(); _isOriginAudioPlaying = false; } - Log.d( - "_playRecordAudioInner _isRecordAudioPlaying=$_isRecordAudioPlaying url=${currentPageData()?.recordUrl}"); + if (_isRecordAudioPlaying) { - _isRecordAudioPlaying = false; await audioPlayer.stop(); + _isRecordAudioPlaying = false; } else { - _isRecordAudioPlaying = true; final recordAudioUrl = currentPageData()?.recordUrl; - _playAudio(recordAudioUrl); + await _playAudio(recordAudioUrl); + _isRecordAudioPlaying = true; } // emitter(VoicePlayStateChange()); } - void _playAudio(String? audioUrl) async { + Future _playAudio(String? audioUrl) async { if (audioUrl!.isNotEmpty) { await audioPlayer.play(UrlSource(audioUrl)); } @@ -302,10 +318,11 @@ class ReadingPageBloc ///先声测试 void _voiceXsStart( XSVoiceStartEvent event, Emitter emitter) async { - _stopAudio(); + await _stopAudio(); startRecord(event.content); } + ///开始录音 void startRecord(String content) async { // 调用封装好的权限检查和请求方法 bool result = @@ -374,7 +391,6 @@ class ReadingPageBloc Log.d( "_onAudioPlayComplete _isOriginAudioPlaying=$_isOriginAudioPlaying _voicePlayState=$_voicePlayState recordUrl=${currentPageData()?.recordUrl?.isNotEmpty}"); if (_isOriginAudioPlaying && - _voicePlayState == VoicePlayState.completed && currentPageData()?.recordUrl?.isNotEmpty != true) { ///如果刚刚完成原音播放&&录音为空,则开始录音 startRecord(currentPageData()?.word ?? ''); @@ -384,7 +400,7 @@ class ReadingPageBloc _isRecordAudioPlaying = false; } - void _stopAudio() async { + Future _stopAudio() async { await audioPlayer.stop(); _isOriginAudioPlaying = false; _isRecordAudioPlaying = false; -- libgit2 0.22.2