diff --git a/frameworks/native/audiocapturer/src/audio_capturer.cpp b/frameworks/native/audiocapturer/src/audio_capturer.cpp index f4994fb13f496c3d52d2538047058c6822e3f488..cae7f1c31bd894598d82aa0ffbad5f51322fb72a 100644 --- a/frameworks/native/audiocapturer/src/audio_capturer.cpp +++ b/frameworks/native/audiocapturer/src/audio_capturer.cpp @@ -153,10 +153,12 @@ std::shared_ptr AudioCapturer::CreateCapturer(const AudioCapturer { Trace trace("KeyAction AudioCapturer::Create"); auto sourceType = capturerOptions.capturerInfo.sourceType; - - if (sourceType < SOURCE_TYPE_MIC || sourceType > SOURCE_TYPE_MAX || sourceType == SOURCE_TYPE_VIRTUAL_CAPTURE || + if (sourceType == SOURCE_TYPE_VIRTUAL_CAPTURE) { + AUDIO_ERR_LOG("Invalid sourceType %{public}d!", sourceType); + return nullptr; + } + if (sourceType < SOURCE_TYPE_MIC || sourceType > SOURCE_TYPE_MAX || sourceType == AUDIO_SOURCE_TYPE_INVALID_5) { - CHECK_AND_RETURN_RET(sourceType != SOURCE_TYPE_VIRTUAL_CAPTURE, nullptr); AudioCapturer::SendCapturerCreateError(sourceType, ERR_INVALID_PARAM); AUDIO_ERR_LOG("Invalid sourceType %{public}d!", sourceType); return nullptr; diff --git a/services/audio_service/common/include/i_audio_process_stream.h b/services/audio_service/common/include/i_audio_process_stream.h index 73feb37c5578b07c7a5df77f5ad1358fc8738e8c..00dede17332ef7d81e8eac595f8bc6784c32d669 100644 --- a/services/audio_service/common/include/i_audio_process_stream.h +++ b/services/audio_service/common/include/i_audio_process_stream.h @@ -57,6 +57,8 @@ public: virtual uint32_t GetByteSizePerFrame() = 0; + virtual StreamStatus GetStreamInServerStatus() = 0; + virtual void EnableStandby(); virtual ~IAudioProcessStream() = default; diff --git a/services/audio_service/server/include/audio_process_in_server.h b/services/audio_service/server/include/audio_process_in_server.h index 50bb9774c59fe16a7be7ff9657c8d5f04f4083a3..9305568ed213371da4d27be5f175893418578a36 100644 --- a/services/audio_service/server/include/audio_process_in_server.h +++ b/services/audio_service/server/include/audio_process_in_server.h @@ -138,7 +138,8 @@ public: StreamStatus GetStreamStatus() override; RestoreStatus RestoreSession(RestoreInfo restoreInfo); int32_t StopSession(); - + StreamStatus GetStreamInServerStatus() override; + bool TurnOnMicIndicator(CapturerState capturerState); bool TurnOffMicIndicator(CapturerState capturerState); @@ -206,6 +207,8 @@ private: std::shared_ptr audioStreamChecker_ = nullptr; std::atomic audioHapticsSyncId_ = 0; + + StreamStatus streamStatusInServer_ = STREAM_INVALID; }; } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/server/src/audio_endpoint.cpp b/services/audio_service/server/src/audio_endpoint.cpp index a3ef72f960857a89da1ae0f5df2ba3fa2bfc4f55..127bc6cc96f051ef5b7d78d012eaca03ac45ffd1 100644 --- a/services/audio_service/server/src/audio_endpoint.cpp +++ b/services/audio_service/server/src/audio_endpoint.cpp @@ -1977,10 +1977,9 @@ void AudioEndpointInner::WriteToProcessBuffers(const BufferDesc &readBuf) std::lock_guard lock(listLock_); for (size_t i = 0; i < processBufferList_.size(); i++) { CHECK_AND_CONTINUE_LOG(processBufferList_[i] != nullptr, "process buffer %{public}zu is null.", i); - if (processBufferList_[i]->GetStreamStatus() && - processBufferList_[i]->GetStreamStatus()->load() != STREAM_RUNNING) { + if (processList_[i]->GetStreamInServerStatus() != STREAM_RUNNING) { AUDIO_WARNING_LOG("process buffer %{public}zu not running, stream status %{public}d.", - i, processBufferList_[i]->GetStreamStatus()->load()); + i, processList_[i]->GetStreamInServerStatus()); continue; } diff --git a/services/audio_service/server/src/audio_process_in_server.cpp b/services/audio_service/server/src/audio_process_in_server.cpp index 22604740a2249c480cd3a21416c4a1dd9979a754..4d2d72e91315710e6ff1a7af4736e15bfc5c9500 100644 --- a/services/audio_service/server/src/audio_process_in_server.cpp +++ b/services/audio_service/server/src/audio_process_in_server.cpp @@ -46,7 +46,6 @@ sptr AudioProcessInServer::Create(const AudioProcessConfig ProcessReleaseCallback *releaseCallback) { sptr process = new(std::nothrow) AudioProcessInServer(processConfig, releaseCallback); - return process; } @@ -77,6 +76,7 @@ AudioProcessInServer::AudioProcessInServer(const AudioProcessConfig &processConf } audioStreamChecker_ = std::make_shared(processConfig); AudioStreamMonitor::GetInstance().AddCheckForMonitor(processConfig.originalSessionId, audioStreamChecker_); + streamStatusInServer_ = STREAM_IDEL; } AudioProcessInServer::~AudioProcessInServer() @@ -297,6 +297,7 @@ int32_t AudioProcessInServer::Start() lastWriteFrame_ = static_cast(processBuffer_->GetCurReadFrame()); } lastWriteMuteFrame_ = 0; + streamStatusInServer_ = STREAM_RUNNING; return ret; } @@ -378,6 +379,7 @@ int32_t AudioProcessInServer::Pause(bool isFlush) AudioPerformanceMonitor::GetInstance().PauseSilenceMonitor(sessionId_); NotifyXperfOnPlayback(processConfig_.audioMode, XPERF_EVENT_STOP); HILOG_COMM_INFO("Pause in server success!"); + streamStatusInServer_ = STREAM_PAUSED; return SUCCESS; } @@ -406,6 +408,7 @@ int32_t AudioProcessInServer::Resume() audioStreamChecker_->MonitorOnAllCallback(AUDIO_STREAM_START, false); NotifyXperfOnPlayback(processConfig_.audioMode, XPERF_EVENT_START); HILOG_COMM_INFO("Resume in server success!"); + streamStatusInServer_ = STREAM_STARTING; return SUCCESS; } @@ -450,6 +453,7 @@ int32_t AudioProcessInServer::Stop(int32_t stage) AudioPerformanceMonitor::GetInstance().PauseSilenceMonitor(sessionId_); NotifyXperfOnPlayback(processConfig_.audioMode, XPERF_EVENT_STOP); HILOG_COMM_INFO("Stop in server success!"); + streamStatusInServer_ = STREAM_STOPPED; return SUCCESS; } @@ -474,6 +478,7 @@ int32_t AudioProcessInServer::Release(bool isSwitchStream) ret = releaseCallback_->OnProcessRelease(this, isSwitchStream); NotifyXperfOnPlayback(processConfig_.audioMode, XPERF_EVENT_RELEASE); HILOG_COMM_INFO("notify service release result: %{public}d", ret); + streamStatusInServer_ = STREAM_RELEASED; return SUCCESS; } @@ -845,7 +850,7 @@ RestoreStatus AudioProcessInServer::RestoreSession(RestoreInfo restoreInfo) processConfig_.appInfo.appUid, processConfig_.appInfo.appPid, processConfig_.appInfo.appTokenId, - HandleStreamStatusToCapturerState(streamStatus_->load()) + HandleStreamStatusToCapturerState(streamStatusInServer_) }; AUDIO_INFO_LOG("Insert switchStream:%{public}u uid:%{public}d tokenId:%{public}u " "Reason:NEED_RESTORE", sessionId_, info.callerUid, info.appTokenId); @@ -890,5 +895,10 @@ void AudioProcessInServer::NotifyXperfOnPlayback(AudioMode audioMode, XperfEvent processConfig_.rendererInfo.streamUsage, sessionId_, processConfig_.appInfo.appPid, processConfig_.appInfo.appUid); } + +StreamStatus AudioProcessInServer::GetStreamInServerStatus() +{ + return streamStatusInServer_; +} } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/test/unittest/audio_endpoint_unit_test/src/audio_endpoint_plus_unit_test.cpp b/services/audio_service/test/unittest/audio_endpoint_unit_test/src/audio_endpoint_plus_unit_test.cpp index 73a58f852b5a076c80755019da9f69606426b0ea..e3dc6a2b164c52cde9aca71b94b4aa640bf009b8 100644 --- a/services/audio_service/test/unittest/audio_endpoint_unit_test/src/audio_endpoint_plus_unit_test.cpp +++ b/services/audio_service/test/unittest/audio_endpoint_unit_test/src/audio_endpoint_plus_unit_test.cpp @@ -59,6 +59,8 @@ public: MOCK_METHOD(uint32_t, GetSpanSizeInFrame, (), (override)); MOCK_METHOD(uint32_t, GetByteSizePerFrame, (), (override)); + MOCK_METHOD(StreamStatus, GetStreamInServerStatus, (), (override)); + // Non-pure virtual methods (with default implementations in interface) MOCK_METHOD(void, EnableStandby, (), (override)); @@ -1938,5 +1940,88 @@ HWTEST_F(AudioEndpointPlusUnitTest, AudioEndpointInner_008, TestSize.Level1) srcData.streamInfo.channels = AudioChannel::CHANNEL_3; audioEndpointInner->HandleRendererDataParams(srcData, dstData); } + +/* + * @tc.name : Test AudioEndpointInner API + * @tc.type : FUNC + * @tc.number: PrepareRingBuffer_001 + * @tc.desc : Test AudioEndpointInner::PrepareRingBuffer() + */ +HWTEST_F(AudioEndpointPlusUnitTest, PrepareRingBuffer_001, TestSize.Level1) +{ + AudioEndpoint::EndpointType type = AudioEndpoint::TYPE_MMAP; + uint64_t id = 123; + AudioProcessConfig clientConfig = {}; + auto audioEndpointInner = std::make_shared(type, id, clientConfig); + + ASSERT_NE(audioEndpointInner, nullptr); + std::vector buffer1(1, 0); + RingBufferWrapper ringBuffer = { + {{ + {.buffer = buffer1.data(), .bufLength = 1}, + {.buffer = nullptr, .bufLength = 0}, + }}, + .dataLength = 1 + }; + std::shared_ptr processBuffer = std::make_shared(bufferHolder, + totalSizeInFrame, byteSizePerFrame); + processBuffer->totalSizeInFrame_ = 10; + BasicBufferInfo basicBufferInfo; + processBuffer->basicBufferInfo_ = &basicBufferInfo; + uint64_t pos = 0; + processBuffer->basicBufferInfo_->basePosInFrame.store(pos); + uint64_t writePos = 0; + processBuffer->basicBufferInfo_->curWriteFrame.store(writePos); + AudioProcessConfig config = {}; + config.privacyType = AudioPrivacyType::PRIVACY_TYPE_PUBLIC; + sptr audioProcess = AudioProcessInServer::Create(config, AudioService::GetInstance()); + audioProcess->byteSizePerFrame_ = 1; + audioProcess->spanSizeInbyte_ = 0; + audioEndpointInner->processList_.push_back(audioProcess); + audioEndpointInner->processBufferList_.push_back(processBuffer); + bool result = audioEndpointInner->PrepareRingBuffer(0, 0, ringBuffer); + EXPECT_EQ(result, true); +} + +/* + * @tc.name : Test AudioEndpointInner API + * @tc.type : FUNC + * @tc.number: PrepareRingBuffer_002 + * @tc.desc : Test AudioEndpointInner::PrepareRingBuffer() + */ +HWTEST_F(AudioEndpointPlusUnitTest, PrepareRingBuffer_002, TestSize.Level1) +{ + AudioEndpoint::EndpointType type = AudioEndpoint::TYPE_MMAP; + uint64_t id = 123; + AudioProcessConfig clientConfig = {}; + auto audioEndpointInner = std::make_shared(type, id, clientConfig); + + ASSERT_NE(audioEndpointInner, nullptr); + std::vector buffer1(1, 0); + RingBufferWrapper ringBuffer = { + {{ + {.buffer = buffer1.data(), .bufLength = 1}, + {.buffer = nullptr, .bufLength = 0}, + }}, + .dataLength = 1 + }; + std::shared_ptr processBuffer = std::make_shared(bufferHolder, + totalSizeInFrame, byteSizePerFrame); + processBuffer->totalSizeInFrame_ = 10; + BasicBufferInfo basicBufferInfo; + processBuffer->basicBufferInfo_ = &basicBufferInfo; + uint64_t pos = 0; + processBuffer->basicBufferInfo_->basePosInFrame.store(pos); + uint64_t writePos = 0; + processBuffer->basicBufferInfo_->curWriteFrame.store(writePos); + config.privacyType = AudioPrivacyType::PRIVACY_TYPE_PUBLIC; + sptr audioProcess = AudioProcessInServer::Create(config, AudioService::GetInstance()); + audioProcess->byteSizePerFrame_ = 1; + audioProcess->spanSizeInframe_ = 2; + audioEndpointInner->processList_.push_back(audioProcess); + audioEndpointInner->processBufferList_.push_back(processBuffer); + bool result = audioEndpointInner->PrepareRingBuffer(0, 0, ringBuffer); + EXPECT_EQ(result, true); +} } // namespace AudioStandard } // namespace OHOS