|
|
@@ -128,7 +128,7 @@ static void AudioCalcFramesWrittenNeedTime(OH_AudioRenderer *renderer, SDL_Aout_
|
|
|
static int32_t AudioRendererOnWriteData(OH_AudioRenderer *renderer, void *userData, void *buffer, int32_t bufferLen)
|
|
|
{
|
|
|
SDL_Aout_Opaque *opaque = (SDL_Aout_Opaque*)userData;
|
|
|
- if ((opaque == NULL) || opaque->abort_request || opaque->pause_on) {
|
|
|
+ if ((opaque == NULL) || opaque->abort_request || opaque->pause_on || opaque->need_flush) {
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
@@ -138,12 +138,13 @@ static int32_t AudioRendererOnWriteData(OH_AudioRenderer *renderer, void *userDa
|
|
|
}
|
|
|
AudioCalcFramesWrittenNeedTime(renderer, opaque);
|
|
|
audioCallback(opaque->spec.userdata, (uint8_t *)buffer, bufferLen);
|
|
|
-
|
|
|
- // 均衡器处理
|
|
|
- if (opaque->equalizer.enabled && opaque->equalizer.initialized) {
|
|
|
+
|
|
|
+ // 均衡器处理 - 增加额外的安全检查
|
|
|
+ if (opaque->equalizer.enabled && opaque->equalizer.initialized &&
|
|
|
+ buffer != NULL && bufferLen > 0 && !opaque->need_flush) {
|
|
|
equalizer_process_s16(&opaque->equalizer, (int16_t *)buffer, bufferLen);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
opaque->writtenLen += bufferLen;
|
|
|
return 0;
|
|
|
}
|
|
|
@@ -242,6 +243,7 @@ static int AoutOpenAudio(SDL_Aout *aout, const SDL_AudioSpec *desired, SDL_Audio
|
|
|
opaque->buffer_capacity = OPENSLES_BUFFERS * opaque->bytes_per_buffer;
|
|
|
opaque->pause_on = true;
|
|
|
opaque->abort_request = false;
|
|
|
+ opaque->need_flush = false;
|
|
|
opaque->writtenLen = 0;
|
|
|
|
|
|
// 初始化均衡器
|
|
|
@@ -324,11 +326,17 @@ static void AudioRendererFlush(SDL_Aout *aout)
|
|
|
LOGE("audio->AudioRendererFlush audioRendererNormal NULL");
|
|
|
return;
|
|
|
}
|
|
|
+ // 设置 flush 标志,阻止音频回调处理数据
|
|
|
+ opaque->need_flush = true;
|
|
|
OH_AudioRenderer_Flush(opaque->audioRendererNormal); // 丢弃已经写入的音频数据
|
|
|
+ // 重置均衡器滤波器状态,防止 seek 后出现音频问题
|
|
|
+ equalizer_reset(&opaque->equalizer);
|
|
|
// 清除音频时延所有参数
|
|
|
opaque->writtenLen = 0;
|
|
|
opaque->framesWrittenNeedTime = 0;
|
|
|
opaque->lastCalcTime = av_gettime_relative();
|
|
|
+ // 清除 flush 标志
|
|
|
+ opaque->need_flush = false;
|
|
|
}
|
|
|
|
|
|
static void AudioRendererRelease(SDL_Aout *aout)
|