diff --git a/frameworks/native/ohaudio/BUILD.gn b/frameworks/native/ohaudio/BUILD.gn index 59852115f68939a3ade625bb68ed27177e24ad64..143a8b25c7b2df360717c9a8842a84e8af5b94c3 100644 --- a/frameworks/native/ohaudio/BUILD.gn +++ b/frameworks/native/ohaudio/BUILD.gn @@ -60,7 +60,10 @@ ohos_shared_library("ohaudio") { ] cflags = [ "-Werror" ] - external_deps = [ "hilog:libhilog" ] + external_deps = [ + "c_utils:utils", + "hilog:libhilog", + ] innerapi_tags = [ "ndk" ] diff --git a/frameworks/native/ohaudio/OHAudioRenderer.cpp b/frameworks/native/ohaudio/OHAudioRenderer.cpp index 91dcf69856996382c250812af1af30bca7622af8..7366cfb348b46044fee391bbf648df159748fb6d 100644 --- a/frameworks/native/ohaudio/OHAudioRenderer.cpp +++ b/frameworks/native/ohaudio/OHAudioRenderer.cpp @@ -433,6 +433,11 @@ void OHAudioRenderer::SetPreferredFrameSize(int32_t frameSize) audioRenderer_->SetPreferredFrameSize(frameSize); } +bool OHAudioRenderer::IsFastRenderer() +{ + return audioRenderer_->IsFastRenderer(); +} + void OHAudioRendererModeCallback::OnWriteData(size_t length) { OHAudioRenderer* audioRenderer = (OHAudioRenderer*)ohAudioRenderer_; diff --git a/frameworks/native/ohaudio/OHAudioRenderer.h b/frameworks/native/ohaudio/OHAudioRenderer.h index a2b8c87246167cc917e8cceb0769af11122daa88..2423b2dd2e60ffa36ec114eabe25034739c4e5f4 100644 --- a/frameworks/native/ohaudio/OHAudioRenderer.h +++ b/frameworks/native/ohaudio/OHAudioRenderer.h @@ -146,6 +146,7 @@ class OHAudioRenderer { void SetRendererOutputDeviceChangeCallback(OH_AudioRenderer_OutputDeviceChangeCallback callback, void *userData); + bool IsFastRenderer(); private: std::unique_ptr audioRenderer_; std::shared_ptr audioRendererCallback_; diff --git a/frameworks/native/ohaudio/OHAudioStreamBuilder.cpp b/frameworks/native/ohaudio/OHAudioStreamBuilder.cpp index 6109bb104d75ec327a31a7b300807d325848986c..f5e3ece191ae9be179be960c1cd8a9330091854f 100644 --- a/frameworks/native/ohaudio/OHAudioStreamBuilder.cpp +++ b/frameworks/native/ohaudio/OHAudioStreamBuilder.cpp @@ -28,6 +28,7 @@ using OHOS::AudioStandard::SourceType; static const int32_t RENDERER_TYPE = 1; static const int32_t CAPTURER_TYPE = 2; +constexpr int32_t UNDEFINED_SIZE = -1; static OHOS::AudioStandard::OHAudioStreamBuilder *convertBuilder(OH_AudioStreamBuilder* builder) { @@ -300,7 +301,9 @@ OH_AudioStream_Result OHAudioStreamBuilder::Generate(OH_AudioRenderer** renderer audioRenderer->SetRendererCallback(rendererCallbacks_, userData_); audioRenderer->SetRendererOutputDeviceChangeCallback(outputDeviceChangecallback_, outputDeviceChangeuserData_); *renderer = (OH_AudioRenderer*)audioRenderer; - audioRenderer->SetPreferredFrameSize(preferredFrameSize_); + if (preferredFrameSize_ != UNDEFINED_SIZE) { + audioRenderer->SetPreferredFrameSize(preferredFrameSize_); + } return AUDIOSTREAM_SUCCESS; } AUDIO_ERR_LOG("Create OHAudioRenderer failed"); diff --git a/frameworks/native/ohaudio/OHAudioStreamBuilder.h b/frameworks/native/ohaudio/OHAudioStreamBuilder.h index cbd0b43b7ffa7e74c21047e8a546867b6e0838f2..7c369c1b594bddb4f00043ac1d982c31a9aca9a1 100644 --- a/frameworks/native/ohaudio/OHAudioStreamBuilder.h +++ b/frameworks/native/ohaudio/OHAudioStreamBuilder.h @@ -49,7 +49,7 @@ public: private: int32_t streamType_; int32_t latencyMode_ = 0; // default value is normal mode - int32_t preferredFrameSize_ = 240; // initial clientBufferSizeInFrame + int32_t preferredFrameSize_ = -1; // undefined clientBufferSizeInFrame // stream params int32_t samplingRate_ = SAMPLE_RATE_48000; diff --git a/services/audio_service/client/src/renderer_in_client.cpp b/services/audio_service/client/src/renderer_in_client.cpp index e6a57dd2b696ca05afc39d6809aacdb0ecd1bf5a..fd9cca1428959eea4571b006690d6e624636920b 100644 --- a/services/audio_service/client/src/renderer_in_client.cpp +++ b/services/audio_service/client/src/renderer_in_client.cpp @@ -54,6 +54,8 @@ const uint64_t AUDIO_US_PER_MS = 1000; const int64_t AUDIO_NS_PER_US = 1000; const uint64_t AUDIO_US_PER_S = 1000000; const uint64_t MAX_BUF_DURATION_IN_USEC = 2000000; // 2S +const uint64_t MAX_CBBUF_IN_USEC = 100000; +const uint64_t MIN_CBBUF_IN_USEC = 20000; const uint64_t AUDIO_FIRST_FRAME_LATENCY = 230; //ms const float AUDIO_VOLOMUE_EPSILON = 0.0001; const float AUDIO_MAX_VOLUME = 1.0f; @@ -1610,7 +1612,17 @@ bool RendererInClientInner::DrainAudioStream() void RendererInClientInner::SetPreferredFrameSize(int32_t frameSize) { - AUDIO_WARNING_LOG("Not Supported Yet"); + size_t maxCbBufferSize = static_cast(MAX_CBBUF_IN_USEC * streamParams_.samplingRate / AUDIO_US_PER_S) * + sizePerFrameInByte_; + size_t minCbBufferSize = static_cast(MIN_CBBUF_IN_USEC * streamParams_.samplingRate / AUDIO_US_PER_S) * + sizePerFrameInByte_; + size_t preferredCbBufferSize = static_cast(frameSize) * sizePerFrameInByte_; + std::lock_guard lock(cbBufferMutex_); + cbBufferSize_ = (preferredCbBufferSize > maxCbBufferSize || preferredCbBufferSize < minCbBufferSize) ? + (preferredCbBufferSize > maxCbBufferSize ? maxCbBufferSize : minCbBufferSize) : preferredCbBufferSize; + AUDIO_INFO_LOG("Set CallbackBuffer with byte size: %{public}zu", cbBufferSize_); + cbBuffer_ = std::make_unique(cbBufferSize_); + return; } int32_t RendererInClientInner::Write(uint8_t *pcmBuffer, size_t pcmBufferSize, uint8_t *metaBuffer,