From 07cc126464edd6136d25b01749cac87d3c110d30 Mon Sep 17 00:00:00 2001 From: wangchongteng Date: Tue, 9 Sep 2025 09:45:20 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A3=B0=E9=81=93?= =?UTF-8?q?=E6=95=B0=E5=92=8C=E5=A3=B0=E9=81=93=E5=B8=83=E5=B1=80=E4=B8=8D?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E7=9A=84=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangchongteng --- .../audiostream/include/i_audio_stream.h | 1 + .../client/src/i_audio_stream.cpp | 20 +++++++++++++++++ .../client/i_audio_stream_unit_test.cpp | 22 ++++++++++++++++++- 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/frameworks/native/audiostream/include/i_audio_stream.h b/frameworks/native/audiostream/include/i_audio_stream.h index 0f7ea11366..65bd3a053b 100644 --- a/frameworks/native/audiostream/include/i_audio_stream.h +++ b/frameworks/native/audiostream/include/i_audio_stream.h @@ -136,6 +136,7 @@ public: static bool IsCustomSampleRateValid(uint32_t customSampleRate); static bool IsRendererChannelLayoutValid(uint64_t channelLayout); static bool IsCapturerChannelLayoutValid(uint64_t channelLayout); + static bool IsChannelLayoutMatchedWithChannel(uint8_t channel, 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) diff --git a/services/audio_service/client/src/i_audio_stream.cpp b/services/audio_service/client/src/i_audio_stream.cpp index ac94f965bd..c589431ac0 100644 --- a/services/audio_service/client/src/i_audio_stream.cpp +++ b/services/audio_service/client/src/i_audio_stream.cpp @@ -328,6 +328,18 @@ bool IAudioStream::IsCapturerChannelLayoutValid(uint64_t channelLayout) return isValidCapturerChannelLayout; } +bool IAudioStream::IsChannelLayoutMatchedWithChannel(uint8_t channel, uint64_t channelLayout) +{ + if ((channelLayout & CH_MODE_MASK) >> CH_MODE_OFFSET == 0) { + int32_t channelCount = std::popcount(channelLayout); + return channelCount == static_cast(channel); + } + + uint64_t order = (channelLayout & CH_HOA_ORDNUM_MASK) >> CH_HOA_ORDNUM_OFFSET; + uint64_t channelCount = (order + 1) * (order + 1); + return channelCount == static_cast(channel); +} + bool IAudioStream::IsPlaybackChannelRelatedInfoValid(uint8_t channels, uint64_t channelLayout) { if (!IsRendererChannelValid(channels)) { @@ -338,6 +350,10 @@ bool IAudioStream::IsPlaybackChannelRelatedInfoValid(uint8_t channels, uint64_t AUDIO_ERR_LOG("AudioStream: Invalid sink channel layout"); return false; } + if (!IsChannelLayoutMatchedWithChannel(channels, channelLayout)) { + AUDIO_ERR_LOG("AudioStream: not matched sink channel and channel layout"); + return false; + } return true; } @@ -351,6 +367,10 @@ bool IAudioStream::IsRecordChannelRelatedInfoValid(uint8_t channels, uint64_t ch AUDIO_ERR_LOG("AudioStream: Invalid source channel layout"); return false; } + if (!IsChannelLayoutMatchedWithChannel(channels, channelLayout)) { + AUDIO_ERR_LOG("AudioStream: not matched source channel and channel layout"); + return false; + } return true; } } // namespace AudioStandard 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 7fb2852203..1f6c57a45c 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 @@ -158,6 +158,14 @@ HWTEST(IAudioStreamUnitTest, IsPlaybackChannelRelatedInfoValid_001, TestSize.Lev audioChannel = 2; channelLayout = 100; EXPECT_FALSE(IAudioStream::IsPlaybackChannelRelatedInfoValid(audioChannel, channelLayout)); + + audioChannel = 2; + channelLayout = 4; + EXPECT_FALSE(IAudioStream::IsPlaybackChannelRelatedInfoValid(audioChannel, channelLayout)); + + audioChannel = 2; + channelLayout = 3; + EXPECT_TRUE(IAudioStream::IsPlaybackChannelRelatedInfoValid(audioChannel, channelLayout)); } /** @@ -170,9 +178,21 @@ HWTEST(IAudioStreamUnitTest, IsRecordChannelRelatedInfoValid_001, TestSize.Level { std::shared_ptr capturerInClientInner_ = std::make_shared(AudioStreamType::STREAM_MUSIC, 0); - std::uint8_t audioChannel = 2; + std::uint8_t audioChannel = 100; std::uint64_t channelLayout = 100; EXPECT_FALSE(IAudioStream::IsRecordChannelRelatedInfoValid(audioChannel, channelLayout)); + + audioChannel = 2; + channelLayout = 100; + EXPECT_FALSE(IAudioStream::IsRecordChannelRelatedInfoValid(audioChannel, channelLayout)); + + audioChannel = 2; + channelLayout = 4; + EXPECT_FALSE(IAudioStream::IsRecordChannelRelatedInfoValid(audioChannel, channelLayout)); + + audioChannel = 2; + channelLayout = 3; + EXPECT_TRUE(IAudioStream::IsRecordChannelRelatedInfoValid(audioChannel, channelLayout)); } /** -- Gitee From ed1899123908531a4114bc50817b8719266dbd0d Mon Sep 17 00:00:00 2001 From: wangchongteng Date: Tue, 9 Sep 2025 11:30:15 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A3=B0=E9=81=93?= =?UTF-8?q?=E6=95=B0=E5=92=8C=E5=A3=B0=E9=81=93=E5=B8=83=E5=B1=80=E4=B8=8D?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E7=9A=84=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangchongteng --- services/audio_service/client/src/i_audio_stream.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/audio_service/client/src/i_audio_stream.cpp b/services/audio_service/client/src/i_audio_stream.cpp index c589431ac0..555459326c 100644 --- a/services/audio_service/client/src/i_audio_stream.cpp +++ b/services/audio_service/client/src/i_audio_stream.cpp @@ -330,6 +330,8 @@ bool IAudioStream::IsCapturerChannelLayoutValid(uint64_t channelLayout) bool IAudioStream::IsChannelLayoutMatchedWithChannel(uint8_t channel, uint64_t channelLayout) { + CHECK_AND_RETURN_RET(channelLayout != CH_LAYOUT_UNKNOWN, true); + if ((channelLayout & CH_MODE_MASK) >> CH_MODE_OFFSET == 0) { int32_t channelCount = std::popcount(channelLayout); return channelCount == static_cast(channel); -- Gitee From 9f990622a55b1f2a37dbfb809da053e2bdfa57c2 Mon Sep 17 00:00:00 2001 From: wangchongteng Date: Tue, 9 Sep 2025 11:31:53 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A3=B0=E9=81=93?= =?UTF-8?q?=E6=95=B0=E5=92=8C=E5=A3=B0=E9=81=93=E5=B8=83=E5=B1=80=E4=B8=8D?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E7=9A=84=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangchongteng --- services/audio_service/client/src/i_audio_stream.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/audio_service/client/src/i_audio_stream.cpp b/services/audio_service/client/src/i_audio_stream.cpp index 555459326c..47645061a3 100644 --- a/services/audio_service/client/src/i_audio_stream.cpp +++ b/services/audio_service/client/src/i_audio_stream.cpp @@ -338,8 +338,8 @@ bool IAudioStream::IsChannelLayoutMatchedWithChannel(uint8_t channel, uint64_t c } uint64_t order = (channelLayout & CH_HOA_ORDNUM_MASK) >> CH_HOA_ORDNUM_OFFSET; - uint64_t channelCount = (order + 1) * (order + 1); - return channelCount == static_cast(channel); + uint64_t channelCountHoa = (order + 1) * (order + 1); + return channelCountHoa == static_cast(channel); } bool IAudioStream::IsPlaybackChannelRelatedInfoValid(uint8_t channels, uint64_t channelLayout) -- Gitee From 351e13366a0318cb24d1a35f8992987c203c755d Mon Sep 17 00:00:00 2001 From: wangchongteng Date: Tue, 9 Sep 2025 14:55:27 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A3=B0=E9=81=93?= =?UTF-8?q?=E6=95=B0=E5=92=8C=E5=A3=B0=E9=81=93=E5=B8=83=E5=B1=80=E4=B8=8D?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E7=9A=84=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangchongteng --- .../native/audiostream/include/i_audio_stream.h | 5 +++-- .../audio_service/client/src/i_audio_stream.cpp | 14 +++++++++----- .../unittest/client/i_audio_stream_unit_test.cpp | 8 ++++---- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/frameworks/native/audiostream/include/i_audio_stream.h b/frameworks/native/audiostream/include/i_audio_stream.h index 65bd3a053b..5c0f6ef1f6 100644 --- a/frameworks/native/audiostream/include/i_audio_stream.h +++ b/frameworks/native/audiostream/include/i_audio_stream.h @@ -136,8 +136,9 @@ public: static bool IsCustomSampleRateValid(uint32_t customSampleRate); static bool IsRendererChannelLayoutValid(uint64_t channelLayout); static bool IsCapturerChannelLayoutValid(uint64_t channelLayout); - static bool IsChannelLayoutMatchedWithChannel(uint8_t channel, uint64_t channelLayout); - static bool IsPlaybackChannelRelatedInfoValid(uint8_t channels, uint64_t channelLayout); + static bool IsChannelLayoutMatchedWithChannel(uint8_t channel, uint64_t channelLayout, + uint8_t encodingType = ENCODING_PCM); + static bool IsPlaybackChannelRelatedInfoValid(uint8_t encodingType, uint8_t channels, uint64_t channelLayout); static bool IsRecordChannelRelatedInfoValid(uint8_t channels, uint64_t channelLayout); static inline bool IsFastStreamClass(StreamClass streamClass) { diff --git a/services/audio_service/client/src/i_audio_stream.cpp b/services/audio_service/client/src/i_audio_stream.cpp index 47645061a3..9cc980d383 100644 --- a/services/audio_service/client/src/i_audio_stream.cpp +++ b/services/audio_service/client/src/i_audio_stream.cpp @@ -120,7 +120,8 @@ int32_t IAudioStream::CheckRendererAudioStreamInfo(const AudioStreamParams info) AUDIO_ERR_LOG("Unsupported audio renderer parameter"); return ERR_NOT_SUPPORTED; } - CHECK_AND_RETURN_RET(IsPlaybackChannelRelatedInfoValid(info.channels, info.channelLayout), ERR_NOT_SUPPORTED); + CHECK_AND_RETURN_RET(IsPlaybackChannelRelatedInfoValid(info.encoding, info.channels, info.channelLayout), + ERR_NOT_SUPPORTED); return SUCCESS; } @@ -328,12 +329,15 @@ bool IAudioStream::IsCapturerChannelLayoutValid(uint64_t channelLayout) return isValidCapturerChannelLayout; } -bool IAudioStream::IsChannelLayoutMatchedWithChannel(uint8_t channel, uint64_t channelLayout) +bool IAudioStream::IsChannelLayoutMatchedWithChannel(uint8_t channel, uint64_t channelLayout, uint8_t encodingType) { + // for audio vivid, no need to match channel count with channel layout + CHECK_AND_RETURN_RET(encodingType != ENCODING_AUDIOVIVID, true); + // unknown channel layout is matched with any channel count CHECK_AND_RETURN_RET(channelLayout != CH_LAYOUT_UNKNOWN, true); if ((channelLayout & CH_MODE_MASK) >> CH_MODE_OFFSET == 0) { - int32_t channelCount = std::popcount(channelLayout); + int32_t channelCount = __builtin_popcountll(channelLayout); return channelCount == static_cast(channel); } @@ -342,7 +346,7 @@ bool IAudioStream::IsChannelLayoutMatchedWithChannel(uint8_t channel, uint64_t c return channelCountHoa == static_cast(channel); } -bool IAudioStream::IsPlaybackChannelRelatedInfoValid(uint8_t channels, uint64_t channelLayout) +bool IAudioStream::IsPlaybackChannelRelatedInfoValid(uint8_t encodingType, uint8_t channels, uint64_t channelLayout) { if (!IsRendererChannelValid(channels)) { AUDIO_ERR_LOG("AudioStream: Invalid sink channel %{public}d", channels); @@ -352,7 +356,7 @@ bool IAudioStream::IsPlaybackChannelRelatedInfoValid(uint8_t channels, uint64_t AUDIO_ERR_LOG("AudioStream: Invalid sink channel layout"); return false; } - if (!IsChannelLayoutMatchedWithChannel(channels, channelLayout)) { + if (!IsChannelLayoutMatchedWithChannel(channels, channelLayout, encodingType)) { AUDIO_ERR_LOG("AudioStream: not matched sink channel and channel layout"); return false; } 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 1f6c57a45c..51fb84f078 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,19 +153,19 @@ 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(IAudioStream::IsPlaybackChannelRelatedInfoValid(audioChannel, channelLayout)); + EXPECT_FALSE(IAudioStream::IsPlaybackChannelRelatedInfoValid(ENCODING_PCM, audioChannel, channelLayout)); audioChannel = 2; channelLayout = 100; - EXPECT_FALSE(IAudioStream::IsPlaybackChannelRelatedInfoValid(audioChannel, channelLayout)); + EXPECT_FALSE(IAudioStream::IsPlaybackChannelRelatedInfoValid(ENCODING_PCM, audioChannel, channelLayout)); audioChannel = 2; channelLayout = 4; - EXPECT_FALSE(IAudioStream::IsPlaybackChannelRelatedInfoValid(audioChannel, channelLayout)); + EXPECT_FALSE(IAudioStream::IsPlaybackChannelRelatedInfoValid(ENCODING_PCM, audioChannel, channelLayout)); audioChannel = 2; channelLayout = 3; - EXPECT_TRUE(IAudioStream::IsPlaybackChannelRelatedInfoValid(audioChannel, channelLayout)); + EXPECT_TRUE(IAudioStream::IsPlaybackChannelRelatedInfoValid(ENCODING_PCM, audioChannel, channelLayout)); } /** -- Gitee From f190fa99b099a2e33605a2cdb023596eca5dca7a Mon Sep 17 00:00:00 2001 From: wangchongteng Date: Tue, 9 Sep 2025 19:33:48 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A3=B0=E9=81=93?= =?UTF-8?q?=E6=95=B0=E5=92=8C=E5=A3=B0=E9=81=93=E5=B8=83=E5=B1=80=E4=B8=8D?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E7=9A=84=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangchongteng --- services/audio_service/client/src/i_audio_stream.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/audio_service/client/src/i_audio_stream.cpp b/services/audio_service/client/src/i_audio_stream.cpp index 9cc980d383..be5a07e5bd 100644 --- a/services/audio_service/client/src/i_audio_stream.cpp +++ b/services/audio_service/client/src/i_audio_stream.cpp @@ -336,7 +336,7 @@ bool IAudioStream::IsChannelLayoutMatchedWithChannel(uint8_t channel, uint64_t c // unknown channel layout is matched with any channel count CHECK_AND_RETURN_RET(channelLayout != CH_LAYOUT_UNKNOWN, true); - if ((channelLayout & CH_MODE_MASK) >> CH_MODE_OFFSET == 0) { + if (((channelLayout & CH_MODE_MASK) >> CH_MODE_OFFSET) == 0) { int32_t channelCount = __builtin_popcountll(channelLayout); return channelCount == static_cast(channel); } -- Gitee