diff --git a/frameworks/native/audiocapturer/src/audio_capturer.cpp b/frameworks/native/audiocapturer/src/audio_capturer.cpp index 6e9357c0aa5c238d500cc4ed2489745ce504a875..435b1e6b6f0aa3c8e87f8f2719ed0f5200db61b3 100644 --- a/frameworks/native/audiocapturer/src/audio_capturer.cpp +++ b/frameworks/native/audiocapturer/src/audio_capturer.cpp @@ -300,9 +300,12 @@ int32_t AudioCapturerPrivate::SetParams(const AudioCapturerParams params) // Create Client std::shared_ptr streamDesc = ConvertToStreamDescriptor(audioStreamParams); + + int32_t ret = IAudioStream::CheckCapturerAudioStreamInfo(audioStreamParams); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "CheckCapturerAudioStreamInfo fail!"); + uint32_t flag = AUDIO_INPUT_FLAG_NORMAL; - int32_t ret = AudioPolicyManager::GetInstance().CreateCapturerClient( - streamDesc, flag, audioStreamParams.originalSessionId); + ret = AudioPolicyManager::GetInstance().CreateCapturerClient(streamDesc, flag, audioStreamParams.originalSessionId); CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_OPERATION_FAILED, "CreateCapturerClient failed"); AUDIO_INFO_LOG("StreamClientState for Capturer::CreateClient. id %{public}u, flag :%{public}u", audioStreamParams.originalSessionId, flag); @@ -1520,8 +1523,11 @@ bool AudioCapturerPrivate::GenerateNewStream(IAudioStream::StreamClass targetCla CapturerState previousState, IAudioStream::SwitchInfo &switchInfo) { std::shared_ptr streamDesc = GetStreamDescBySwitchInfo(switchInfo, restoreInfo); + + int32_t ret = IAudioStream::CheckCapturerAudioStreamInfo(switchInfo.params); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "CheckCapturerAudioStreamInfo fail!"); uint32_t flag = AUDIO_INPUT_FLAG_NORMAL; - int32_t ret = AudioPolicyManager::GetInstance().CreateCapturerClient( + ret = AudioPolicyManager::GetInstance().CreateCapturerClient( streamDesc, flag, switchInfo.params.originalSessionId); CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, false, "CreateCapturerClient failed"); diff --git a/frameworks/native/audiorenderer/src/audio_renderer.cpp b/frameworks/native/audiorenderer/src/audio_renderer.cpp index 4356b65223b016baae9868126ce4c54989ef97f4..b8568f31100c7412d99e998417e48b6ee613ad23 100644 --- a/frameworks/native/audiorenderer/src/audio_renderer.cpp +++ b/frameworks/native/audiorenderer/src/audio_renderer.cpp @@ -651,8 +651,12 @@ int32_t AudioRendererPrivate::SetParams(const AudioRendererParams params) rendererInfo_.rendererFlags = AUDIO_FLAG_NORMAL; IAudioStream::StreamClass streamClass = IAudioStream::PA_STREAM; #endif + + int32_t ret = IAudioStream::CheckRendererAudioStreamInfo(audioStreamParams); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "CheckRendererAudioStreamInfo fail!"); + rendererInfo_.audioFlag = AUDIO_OUTPUT_FLAG_NORMAL; - int32_t ret = PrepareAudioStream(audioStreamParams, audioStreamType, streamClass, rendererInfo_.audioFlag); + ret = PrepareAudioStream(audioStreamParams, audioStreamType, streamClass, rendererInfo_.audioFlag); CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_INVALID_PARAM, "PrepareAudioStream failed"); ret = InitAudioStream(audioStreamParams); @@ -2249,9 +2253,13 @@ bool AudioRendererPrivate::GenerateNewStream(IAudioStream::StreamClass targetCla RendererState previousState, IAudioStream::SwitchInfo &switchInfo) { std::shared_ptr streamDesc = GetStreamDescBySwitchInfo(switchInfo, restoreInfo); + + int32_t ret = IAudioStream::CheckRendererAudioStreamInfo(switchInfo.params); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "CheckRendererAudioStreamInfo fail!"); + uint32_t flag = AUDIO_OUTPUT_FLAG_NORMAL; std::string networkId = LOCAL_NETWORK_ID; - int32_t ret = AudioPolicyManager::GetInstance().CreateRendererClient( + ret = AudioPolicyManager::GetInstance().CreateRendererClient( streamDesc, flag, switchInfo.params.originalSessionId, networkId); CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, false, "CreateRendererClient failed"); @@ -2261,7 +2269,6 @@ bool AudioRendererPrivate::GenerateNewStream(IAudioStream::StreamClass targetCla std::shared_ptr newAudioStream = IAudioStream::GetPlaybackStream(targetClass, switchInfo.params, switchInfo.eStreamType, appInfo_.appUid); CHECK_AND_RETURN_RET_LOG(newAudioStream != nullptr, false, "SetParams GetPlayBackStream failed."); - AUDIO_INFO_LOG("Get new stream success!"); // The latest route info returned by create needs to be used to update audioFlag, // the server can obtain the route info to proceed with start. diff --git a/frameworks/native/audiostream/include/i_audio_stream.h b/frameworks/native/audiostream/include/i_audio_stream.h index 0547b081b7fca48d6c448d4e9b3d2f4e33553f1b..0f7ea1136617e1aa518872742d840f0b1e57d290 100644 --- a/frameworks/native/audiostream/include/i_audio_stream.h +++ b/frameworks/native/audiostream/include/i_audio_stream.h @@ -126,6 +126,18 @@ public: static AudioStreamType GetStreamType(ContentType contentType, StreamUsage streamUsage); static std::map, AudioStreamType> CreateStreamMap(); static void CreateStreamMap(std::map, AudioStreamType> &streamMap); + static int32_t CheckRendererAudioStreamInfo(const AudioStreamParams info); + static int32_t CheckCapturerAudioStreamInfo(const AudioStreamParams info); + static bool IsFormatValid(uint8_t format); + static bool IsRendererChannelValid(uint8_t channel); + static bool IsCapturerChannelValid(uint8_t channel); + static bool IsEncodingTypeValid(uint8_t encodingType); + static bool IsSamplingRateValid(uint32_t samplingRate); + static bool IsCustomSampleRateValid(uint32_t customSampleRate); + static bool IsRendererChannelLayoutValid(uint64_t channelLayout); + static bool IsCapturerChannelLayoutValid(uint64_t channelLayout); + static bool IsPlaybackChannelRelatedInfoValid(uint8_t channels, uint64_t channelLayout); + static bool IsRecordChannelRelatedInfoValid(uint8_t channels, uint64_t channelLayout); static inline bool IsFastStreamClass(StreamClass streamClass) { if (streamClass == FAST_STREAM || streamClass == VOIP_STREAM) { @@ -273,26 +285,6 @@ public: virtual void SetState() {} - bool IsFormatValid(uint8_t format); - - bool IsRendererChannelValid(uint8_t channel); - - bool IsCapturerChannelValid(uint8_t channel); - - bool IsEncodingTypeValid(uint8_t encodingType); - - bool IsSamplingRateValid(uint32_t samplingRate); - - bool IsCustomSampleRateValid(uint32_t customSampleRate); - - bool IsRendererChannelLayoutValid(uint64_t channelLayout); - - bool IsCapturerChannelLayoutValid(uint64_t channelLayout); - - bool IsPlaybackChannelRelatedInfoValid(uint8_t channels, uint64_t channelLayout); - - bool IsRecordChannelRelatedInfoValid(uint8_t channels, uint64_t channelLayout); - virtual void SetSilentModeAndMixWithOthers(bool on) = 0; virtual bool GetSilentModeAndMixWithOthers() = 0; diff --git a/services/audio_service/client/src/capturer_in_client.cpp b/services/audio_service/client/src/capturer_in_client.cpp index c850c4b1be7bee848ef562fbd4138bc4e3912e66..d770549fb28622a4144ef37a1faa679fbe9ce313 100644 --- a/services/audio_service/client/src/capturer_in_client.cpp +++ b/services/audio_service/client/src/capturer_in_client.cpp @@ -202,15 +202,6 @@ int32_t CapturerInClientInner::SetAudioStreamInfo(const AudioStreamParams info, info.encoding); AudioXCollie guard("CapturerInClientInner::SetAudioStreamInfo", CREATE_TIMEOUT_IN_SECOND, nullptr, nullptr, AUDIO_XCOLLIE_FLAG_LOG); - if (!IsFormatValid(info.format) || !IsEncodingTypeValid(info.encoding) || !IsSamplingRateValid(info.samplingRate)) { - AUDIO_ERR_LOG("CapturerInClient: Unsupported audio parameter"); - return ERR_NOT_SUPPORTED; - } - if (!IsRecordChannelRelatedInfoValid(info.channels, info.channelLayout)) { - AUDIO_ERR_LOG("Invalid sink channel %{public}d or channel layout %{public}" PRIu64, info.channels, - info.channelLayout); - return ERR_NOT_SUPPORTED; - } CHECK_AND_RETURN_RET_LOG(IAudioStream::GetByteSizePerFrame(info, sizePerFrameInByte_) == SUCCESS, ERROR_INVALID_PARAM, "GetByteSizePerFrame failed with invalid params"); diff --git a/services/audio_service/client/src/i_audio_stream.cpp b/services/audio_service/client/src/i_audio_stream.cpp index 6753eda52efc4bd107a747b1da10866f627b6483..ac94f965bde834e90c9292964f7808cfa76ff275 100644 --- a/services/audio_service/client/src/i_audio_stream.cpp +++ b/services/audio_service/client/src/i_audio_stream.cpp @@ -112,6 +112,29 @@ void IAudioStream::CreateStreamMap(std::map, streamMap[std::make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_VOICE_CALL_ASSISTANT)] = STREAM_VOICE_CALL_ASSISTANT; } +int32_t IAudioStream::CheckRendererAudioStreamInfo(const AudioStreamParams info) +{ + if (!IsFormatValid(info.format) || !IsEncodingTypeValid(info.encoding) || + !((info.customSampleRate == 0 && IsSamplingRateValid(info.samplingRate)) || + (info.customSampleRate != 0 && IsCustomSampleRateValid(info.customSampleRate)))) { + AUDIO_ERR_LOG("Unsupported audio renderer parameter"); + return ERR_NOT_SUPPORTED; + } + CHECK_AND_RETURN_RET(IsPlaybackChannelRelatedInfoValid(info.channels, info.channelLayout), ERR_NOT_SUPPORTED); + return SUCCESS; +} + +int32_t IAudioStream::CheckCapturerAudioStreamInfo(const AudioStreamParams info) +{ + if (!IsFormatValid(info.format) || !IsEncodingTypeValid(info.encoding) || + !IsSamplingRateValid(info.samplingRate)) { + AUDIO_ERR_LOG("Unsupported audio capturer parameter"); + return ERR_NOT_SUPPORTED; + } + CHECK_AND_RETURN_RET(IsRecordChannelRelatedInfoValid(info.channels, info.channelLayout), ERR_NOT_SUPPORTED); + return SUCCESS; +} + AudioStreamType IAudioStream::GetStreamType(ContentType contentType, StreamUsage streamUsage) { AudioStreamType streamType = STREAM_MUSIC; @@ -321,9 +344,11 @@ bool IAudioStream::IsPlaybackChannelRelatedInfoValid(uint8_t channels, uint64_t bool IAudioStream::IsRecordChannelRelatedInfoValid(uint8_t channels, uint64_t channelLayout) { if (!IsCapturerChannelValid(channels)) { + AUDIO_ERR_LOG("AudioStream: Invalid source channel %{public}d", channels); return false; } if (!IsCapturerChannelLayoutValid(channelLayout)) { + AUDIO_ERR_LOG("AudioStream: Invalid source channel layout"); return false; } return true; diff --git a/services/audio_service/client/src/renderer_in_client_public.cpp b/services/audio_service/client/src/renderer_in_client_public.cpp index cd551f569a62c4e62ad7cd0b6670c830398cbd82..ce4d0631f666f6c77c014ddaf76e77342029a3fb 100644 --- a/services/audio_service/client/src/renderer_in_client_public.cpp +++ b/services/audio_service/client/src/renderer_in_client_public.cpp @@ -236,13 +236,6 @@ int32_t RendererInClientInner::SetAudioStreamInfo(const AudioStreamParams info, AudioXCollie guard("RendererInClientInner::SetAudioStreamInfo", CREATE_TIMEOUT_IN_SECOND, nullptr, nullptr, AUDIO_XCOLLIE_FLAG_LOG); - if (!IsFormatValid(info.format) || !IsEncodingTypeValid(info.encoding) || - !((info.customSampleRate == 0 && IsSamplingRateValid(info.samplingRate)) || - (info.customSampleRate != 0 && IsCustomSampleRateValid(info.customSampleRate)))) { - AUDIO_ERR_LOG("Unsupported audio parameter"); - return ERR_NOT_SUPPORTED; - } - streamParams_ = curStreamParams_ = info; // keep it for later use if (curStreamParams_.encoding == ENCODING_AUDIOVIVID) { ConverterConfig cfg = AudioPolicyManager::GetInstance().GetConverterConfig(); @@ -254,10 +247,6 @@ int32_t RendererInClientInner::SetAudioStreamInfo(const AudioStreamParams info, converter_->ConverterChannels(curStreamParams_.channels, curStreamParams_.channelLayout); } - if (!IsPlaybackChannelRelatedInfoValid(curStreamParams_.channels, curStreamParams_.channelLayout)) { - return ERR_NOT_SUPPORTED; - } - CHECK_AND_RETURN_RET_LOG(IAudioStream::GetByteSizePerFrame(curStreamParams_, sizePerFrameInByte_) == SUCCESS, ERROR_INVALID_PARAM, "GetByteSizePerFrame failed with invalid params"); diff --git a/services/audio_service/test/unittest/client/i_audio_stream_unit_test.cpp b/services/audio_service/test/unittest/client/i_audio_stream_unit_test.cpp index 16ddb254963663a5813d769e8a52bbae9948fbe7..7fb2852203c733f11ce55b28d13e7a86f2bc75e5 100644 --- a/services/audio_service/test/unittest/client/i_audio_stream_unit_test.cpp +++ b/services/audio_service/test/unittest/client/i_audio_stream_unit_test.cpp @@ -153,18 +153,18 @@ HWTEST(IAudioStreamUnitTest, IsPlaybackChannelRelatedInfoValid_001, TestSize.Lev std::make_shared(AudioStreamType::STREAM_MUSIC, 0); std::uint8_t audioChannel = 100; std::uint64_t channelLayout = 100; - EXPECT_FALSE(capturerInClientInner_->IsPlaybackChannelRelatedInfoValid(audioChannel, channelLayout)); + EXPECT_FALSE(IAudioStream::IsPlaybackChannelRelatedInfoValid(audioChannel, channelLayout)); audioChannel = 2; channelLayout = 100; - EXPECT_FALSE(capturerInClientInner_->IsPlaybackChannelRelatedInfoValid(audioChannel, channelLayout)); + EXPECT_FALSE(IAudioStream::IsPlaybackChannelRelatedInfoValid(audioChannel, channelLayout)); } /** * @tc.name : Test IsStreamSupported API * @tc.type : FUNC - * @tc.number: IsPlaybackChannelRelatedInfoValid_001 - * @tc.desc : Test IsPlaybackChannelRelatedInfoValid interface. + * @tc.number: IsRecordChannelRelatedInfoValid_001 + * @tc.desc : Test IsRecordChannelRelatedInfoValid interface. */ HWTEST(IAudioStreamUnitTest, IsRecordChannelRelatedInfoValid_001, TestSize.Level1) { @@ -172,7 +172,7 @@ HWTEST(IAudioStreamUnitTest, IsRecordChannelRelatedInfoValid_001, TestSize.Level std::make_shared(AudioStreamType::STREAM_MUSIC, 0); std::uint8_t audioChannel = 2; std::uint64_t channelLayout = 100; - EXPECT_FALSE(capturerInClientInner_->IsRecordChannelRelatedInfoValid(audioChannel, channelLayout)); + EXPECT_FALSE(IAudioStream::IsRecordChannelRelatedInfoValid(audioChannel, channelLayout)); } /** @@ -200,5 +200,67 @@ HWTEST(IAudioStreamUnitTest, IsStreamSupported_003, TestSize.Level1) result = IAudioStream::IsStreamSupported(2, params); EXPECT_TRUE(result); } + +/** + * @tc.name : Test CheckRendererAudioStreamInfo API + * @tc.type : FUNC + * @tc.number: CheckRendererAudioStreamInfo_001 + * @tc.desc : Test CheckRendererAudioStreamInfo interface. + */ +HWTEST(IAudioStreamUnitTest, CheckRendererAudioStreamInfo_001, TestSize.Level1) +{ + AudioStreamParams params; + params.format = SAMPLE_S16LE; + params.encoding = ENCODING_PCM; + params.samplingRate = SAMPLE_RATE_48000; + params.customSampleRate = 0; + params.channels = STEREO; + params.channelLayout = CH_LAYOUT_STEREO; + EXPECT_EQ(IAudioStream::CheckRendererAudioStreamInfo(params), SUCCESS); + + params.channelLayout = 12345; + EXPECT_EQ(IAudioStream::CheckRendererAudioStreamInfo(params), ERR_NOT_SUPPORTED); + params.channels = CHANNEL_UNKNOW; + EXPECT_EQ(IAudioStream::CheckRendererAudioStreamInfo(params), ERR_NOT_SUPPORTED); + + params.samplingRate = 12345; + EXPECT_EQ(IAudioStream::CheckRendererAudioStreamInfo(params), ERR_NOT_SUPPORTED); + params.customSampleRate = SAMPLE_RATE_48000; + EXPECT_EQ(IAudioStream::CheckRendererAudioStreamInfo(params), ERR_NOT_SUPPORTED); + params.encoding = ENCODING_INVALID; + EXPECT_EQ(IAudioStream::CheckRendererAudioStreamInfo(params), ERR_NOT_SUPPORTED); + params.format = INVALID_WIDTH; + EXPECT_EQ(IAudioStream::CheckRendererAudioStreamInfo(params), ERR_NOT_SUPPORTED); +} + +/** + * @tc.name : Test CheckCapturerAudioStreamInfo API + * @tc.type : FUNC + * @tc.number: CheckCapturerAudioStreamInfo_001 + * @tc.desc : Test CheckCapturerAudioStreamInfo interface. + */ +HWTEST(IAudioStreamUnitTest, CheckCapturerAudioStreamInfo_001, TestSize.Level1) +{ + AudioStreamParams params; + params.format = SAMPLE_S16LE; + params.encoding = ENCODING_PCM; + params.samplingRate = SAMPLE_RATE_48000; + params.customSampleRate = 0; + params.channels = STEREO; + params.channelLayout = CH_LAYOUT_STEREO; + EXPECT_EQ(IAudioStream::CheckCapturerAudioStreamInfo(params), SUCCESS); + + params.channelLayout = 12345; + EXPECT_EQ(IAudioStream::CheckCapturerAudioStreamInfo(params), ERR_NOT_SUPPORTED); + params.channels = CHANNEL_UNKNOW; + EXPECT_EQ(IAudioStream::CheckCapturerAudioStreamInfo(params), ERR_NOT_SUPPORTED); + + params.samplingRate = 12345; + EXPECT_EQ(IAudioStream::CheckCapturerAudioStreamInfo(params), ERR_NOT_SUPPORTED); + params.encoding = ENCODING_INVALID; + EXPECT_EQ(IAudioStream::CheckCapturerAudioStreamInfo(params), ERR_NOT_SUPPORTED); + params.format = INVALID_WIDTH; + EXPECT_EQ(IAudioStream::CheckCapturerAudioStreamInfo(params), ERR_NOT_SUPPORTED); +} } // namespace AudioStandard } // namespace OHOS