From 6c516f44d348436127b5a09e34d5325888b45f80 Mon Sep 17 00:00:00 2001 From: zhanhang Date: Fri, 29 Dec 2023 10:51:14 +0800 Subject: [PATCH] 1 Update frame position calculation method 2 Add fuzzy test cases to the interface for obtaining frame position information Signed-off-by: zhanhang --- .../client/include/audio_service_client.h | 3 +- .../client/src/audio_service_client.cpp | 31 +++++++++++---- .../audio_service/server/src/audio_server.cpp | 12 ------ .../audio_server_fuzzer.cpp | 39 ++++++++++++++++++- 4 files changed, 63 insertions(+), 22 deletions(-) diff --git a/services/audio_service/client/include/audio_service_client.h b/services/audio_service/client/include/audio_service_client.h index 161fed55a6..a733d79892 100644 --- a/services/audio_service/client/include/audio_service_client.h +++ b/services/audio_service/client/include/audio_service_client.h @@ -740,10 +740,11 @@ private: time_t lastOffloadUpdateFinishTime_ = 0; float speed_ = 1.0; + bool firstUpdatePosition_ = true; uint64_t lastStreamPosition_ = 0; uint64_t lastPositionTimestamp_ = 0; uint64_t lastHdiPosition_ = 0; - + uint64_t lastOffloadStreamCorkedPosition_ = 0; int32_t ConnectStreamToPA(); std::pair GetDeviceNameForConnect(); int32_t UpdatePAProbListOffload(AudioOffloadType statePolicy); diff --git a/services/audio_service/client/src/audio_service_client.cpp b/services/audio_service/client/src/audio_service_client.cpp index 4d7c96fba5..4e55ae0805 100644 --- a/services/audio_service/client/src/audio_service_client.cpp +++ b/services/audio_service/client/src/audio_service_client.cpp @@ -2156,27 +2156,38 @@ int32_t AudioServiceClient::UpdateStreamPosition(UpdatePositionTimeNode node) { uint64_t frames; int64_t timeSec, timeNanoSec; - unique_lock positionLock(streamPositionMutex_); std::string deviceClass = offloadEnable_ ? "offload" : "primary"; if (eAudioClientType == AUDIO_SERVICE_CLIENT_PLAYBACK && audioSystemManager_->GetRenderPresentationPosition(deviceClass, frames, timeSec, timeNanoSec) == 0) { if (offloadEnable_) { + if (node == UpdatePositionTimeNode::CORKED_NODE) { + lastOffloadStreamCorkedPosition_ = mTotalBytesWritten / mFrameSize; + return AUDIO_CLIENT_SUCCESS; + } frames = frames * HDI_OFFLOAD_SAMPLE_RATE / SECOND_TO_MICROSECOND; - lastStreamPosition_ = frames; + lastStreamPosition_ = lastOffloadStreamCorkedPosition_ + frames; lastPositionTimestamp_ = timeSec * AUDIO_S_TO_NS + timeNanoSec; return AUDIO_CLIENT_SUCCESS; } + if (frames < lastHdiPosition_) { + AUDIO_ERR_LOG("The frame position should be continuously increasing"); + return AUDIO_CLIENT_ERR; + } + if (firstUpdatePosition_) { + lastHdiPosition_ = frames; + firstUpdatePosition_ = false; + } if (node == UpdatePositionTimeNode::USER_NODE && state_ == RUNNING) { lastStreamPosition_ = lastStreamPosition_ + frames - lastHdiPosition_; lastPositionTimestamp_ = timeSec * AUDIO_S_TO_NS + timeNanoSec; - lastHdiPosition_ = frames; } else if (node == UpdatePositionTimeNode::CORKED_NODE) { - lastStreamPosition_ = lastStreamPosition_ + frames - lastHdiPosition_; - lastHdiPosition_ = frames; - } else if (node == UpdatePositionTimeNode::RUNNING_NODE) { - lastHdiPosition_ = frames; + // In the current paused state, all data will be flushed + lastStreamPosition_ = mTotalBytesWritten / mFrameSize; + } else { + AUDIO_INFO_LOG("other node value %{public}d!", node); } + lastHdiPosition_ = frames; return AUDIO_CLIENT_SUCCESS; } else if (eAudioClientType == AUDIO_SERVICE_CLIENT_RECORD && audioSystemManager_->GetCapturePresentationPosition("primary", frames, timeSec, timeNanoSec) == 0) { @@ -2184,7 +2195,11 @@ int32_t AudioServiceClient::UpdateStreamPosition(UpdatePositionTimeNode node) lastPositionTimestamp_ = timeSec * AUDIO_S_TO_NS + timeNanoSec; return AUDIO_CLIENT_SUCCESS; } else { - AUDIO_ERR_LOG("UpdateStreamPosition failed!"); + AUDIO_ERR_LOG("UpdateStreamPosition from hdi failed!"); + if (eAudioClientType == AUDIO_SERVICE_CLIENT_PLAYBACK && + !offloadEnable_ && node == UpdatePositionTimeNode::RUNNING_NODE) { + lastHdiPosition_ += 240000; // 240000 frame size for 5s,the state from suspend to running + } return AUDIO_CLIENT_ERR; } } diff --git a/services/audio_service/server/src/audio_server.cpp b/services/audio_service/server/src/audio_server.cpp index 56dc1bcd1a..e05045246f 100644 --- a/services/audio_service/server/src/audio_server.cpp +++ b/services/audio_service/server/src/audio_server.cpp @@ -768,12 +768,6 @@ int32_t AudioServer::OffloadDrain() int32_t AudioServer::GetCapturePresentationPosition(const std::string& deviceClass, uint64_t& frames, int64_t& timeSec, int64_t& timeNanoSec) { - int32_t callingUid = IPCSkeleton::GetCallingUid(); - if (callingUid != audioUid_ && callingUid != ROOT_UID) { - AUDIO_ERR_LOG("GetCapturePresentationPosition refused for %{public}d", callingUid); - return ERROR; - } - AudioCapturerSource *audioCapturerSourceInstance = AudioCapturerSource::GetInstance("primary"); if (audioCapturerSourceInstance == nullptr) { AUDIO_ERR_LOG("Capturer is null."); @@ -785,12 +779,6 @@ int32_t AudioServer::GetCapturePresentationPosition(const std::string& deviceCla int32_t AudioServer::GetRenderPresentationPosition(const std::string& deviceClass, uint64_t& frames, int64_t& timeSec, int64_t& timeNanoSec) { - int32_t callingUid = IPCSkeleton::GetCallingUid(); - if (callingUid != audioUid_ && callingUid != ROOT_UID) { - AUDIO_ERR_LOG("GetCapturePresentationPosition refused for %{public}d", callingUid); - return ERROR; - } - IAudioRendererSink *audioRendererSinkInstance = IAudioRendererSink::GetInstance(deviceClass.c_str(), ""); if (audioRendererSinkInstance == nullptr) { AUDIO_ERR_LOG("Renderer is null."); diff --git a/test/fuzztest/audioserver_fuzzer/audio_server_fuzzer.cpp b/test/fuzztest/audioserver_fuzzer/audio_server_fuzzer.cpp index c1bad70ae9..cc4891b130 100644 --- a/test/fuzztest/audioserver_fuzzer/audio_server_fuzzer.cpp +++ b/test/fuzztest/audioserver_fuzzer/audio_server_fuzzer.cpp @@ -194,6 +194,41 @@ void AudioServerNotifyStreamVolumeChangedFuzzTest(const uint8_t *rawData, size_t data, reply, option); } +void AudioServerGetCapturePresentationPositionFuzzTest(const uint8_t *rawData, size_t size) +{ + if (rawData == nullptr || size < LIMITSIZE) { + return; + } + + MessageParcel reply; + MessageOption option; + MessageParcel data; + data.WriteInterfaceToken(FORMMGR_INTERFACE_TOKEN); + std::string deviceClass(reinterpret_cast(rawData), size); + data.WriteString(deviceClass); + + std::shared_ptr AudioServerPtr = std::make_shared(SYSTEM_ABILITY_ID, RUN_ON_CREATE); + AudioServerPtr->OnRemoteRequest(static_cast(AudioServerInterfaceCode::GET_CAPTURE_PRESENTATION_POSITION), + data, reply, option); +} + +void AudioServerGetRenderPresentationPositionFuzzTest(const uint8_t *rawData, size_t size) +{ + if (rawData == nullptr || size < LIMITSIZE) { + return; + } + + MessageParcel reply; + MessageOption option; + MessageParcel data; + data.WriteInterfaceToken(FORMMGR_INTERFACE_TOKEN); + std::string deviceClass(reinterpret_cast(rawData), size); + data.WriteString(deviceClass); + + std::shared_ptr AudioServerPtr = std::make_shared(SYSTEM_ABILITY_ID, RUN_ON_CREATE); + AudioServerPtr->OnRemoteRequest(static_cast(AudioServerInterfaceCode::GET_RENDER_PRESENTATION_POSITION), + data, reply, option); +} } // namespace AudioStandard } // namesapce OHOS @@ -208,5 +243,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) OHOS::AudioStandard::AudioServerOffloadGetPresentationPositionFuzzTest(data, size); OHOS::AudioStandard::AudioServerOffloadSetBufferSizeFuzzTest(data, size); OHOS::AudioStandard::AudioServerNotifyStreamVolumeChangedFuzzTest(data, size); + OHOS::AudioStandard::AudioServerGetCapturePresentationPositionFuzzTest(data, size); + OHOS::AudioStandard::AudioServerGetRenderPresentationPositionFuzzTest(data, size); return 0; -} \ No newline at end of file +} -- Gitee