From 30d5bfbb5309acbd3611042bcf6abf0e4c2752a4 Mon Sep 17 00:00:00 2001 From: zhanhang Date: Wed, 2 Aug 2023 11:39:32 +0800 Subject: [PATCH] check params for fast renderer Signed-off-by: zhanhang --- .../audiorenderer/src/audio_renderer.cpp | 9 ++++- .../audiostream/include/i_audio_stream.h | 1 + .../native/audiocommon/include/audio_info.h | 14 +++++++ .../client/src/i_audio_stream.cpp | 40 ++++++++++++++++++- 4 files changed, 61 insertions(+), 3 deletions(-) diff --git a/frameworks/native/audiorenderer/src/audio_renderer.cpp b/frameworks/native/audiorenderer/src/audio_renderer.cpp index e67df5e3fa..76582d8168 100644 --- a/frameworks/native/audiorenderer/src/audio_renderer.cpp +++ b/frameworks/native/audiorenderer/src/audio_renderer.cpp @@ -259,8 +259,13 @@ int32_t AudioRendererPrivate::SetParams(const AudioRendererParams params) rendererInfo_.streamUsage); IAudioStream::StreamClass streamClass = IAudioStream::PA_STREAM; if (rendererInfo_.rendererFlags == STREAM_FLAG_FAST) { - AUDIO_INFO_LOG("Create stream with STREAM_FLAG_FAST"); - streamClass = IAudioStream::FAST_STREAM; + if(IAudioStream::IsStreamSupported(rendererInfo_.rendererFlags, audioStreamParams)) { + AUDIO_INFO_LOG("Create stream with STREAM_FLAG_FAST"); + streamClass = IAudioStream::FAST_STREAM; + } else { + AUDIO_ERR_LOG("Unsupported parameter, try to create a normal stream"); + streamClass = IAudioStream::PA_STREAM; + } } // check AudioStreamParams for fast stream // As fast stream only support specified audio format, we should call GetPlaybackStream with audioStreamParams. diff --git a/frameworks/native/audiostream/include/i_audio_stream.h b/frameworks/native/audiostream/include/i_audio_stream.h index 5461ad3ec5..6471804a37 100644 --- a/frameworks/native/audiostream/include/i_audio_stream.h +++ b/frameworks/native/audiostream/include/i_audio_stream.h @@ -45,6 +45,7 @@ public: virtual ~IAudioStream() = default; + static bool IsStreamSupported(int32_t streamFlags, const AudioStreamParams ¶ms); static std::shared_ptr GetPlaybackStream(StreamClass streamClass, AudioStreamParams params, AudioStreamType eStreamType, int32_t appUid); static std::shared_ptr GetRecordStream(StreamClass streamClass, AudioStreamParams params, diff --git a/interfaces/inner_api/native/audiocommon/include/audio_info.h b/interfaces/inner_api/native/audiocommon/include/audio_info.h index dd4b376fef..3e34e62390 100644 --- a/interfaces/inner_api/native/audiocommon/include/audio_info.h +++ b/interfaces/inner_api/native/audiocommon/include/audio_info.h @@ -822,6 +822,20 @@ const std::vector AUDIO_SUPPORTED_STREAM_USAGES { STREAM_USAGE_VOICE_MODEM_COMMUNICATION }; +// Supported audio parameters for fast audio stream +const std::vector AUDIO_FAST_STREAM_SUPPORTED_SAMPLING_RATES { + SAMPLE_RATE_48000, +}; + +const std::vector AUDIO_FAST_STREAM_SUPPORTED_CHANNELS { + MONO, + STEREO, +}; + +const std::vector AUDIO_FAST_STREAM_SUPPORTED_FORMATS { + SAMPLE_S16LE, + SAMPLE_S32LE +}; struct BufferDesc { uint8_t* buffer; size_t bufLength; diff --git a/services/audio_service/client/src/i_audio_stream.cpp b/services/audio_service/client/src/i_audio_stream.cpp index 9923d066b8..1e014c4b4a 100644 --- a/services/audio_service/client/src/i_audio_stream.cpp +++ b/services/audio_service/client/src/i_audio_stream.cpp @@ -124,6 +124,44 @@ const std::string IAudioStream::GetEffectSceneName(AudioStreamType audioType) return sceneName; } +bool IAudioStream::IsStreamSupported(int32_t streamFlags, const AudioStreamParams ¶ms) +{ + // 0 for normal stream + if (streamFlags == 0) { + return true; + } + // 1 for fast stream + if (streamFlags == STREAM_FLAG_FAST) { + // check audio sample rate + AudioSamplingRate samplingRate = static_cast(params.samplingRate); + auto rateItem = std::find(AUDIO_FAST_STREAM_SUPPORTED_SAMPLING_RATES.begin(), + AUDIO_FAST_STREAM_SUPPORTED_SAMPLING_RATES.end(), samplingRate); + + if (rateItem == AUDIO_FAST_STREAM_SUPPORTED_SAMPLING_RATES.end()) { + return false; + } + + // check audio channel + AudioChannel channels = static_cast(params.channels); + auto channelItem = std::find(AUDIO_FAST_STREAM_SUPPORTED_CHANNELS.begin(), + AUDIO_FAST_STREAM_SUPPORTED_CHANNELS.end(), channels); + + if (channelItem == AUDIO_FAST_STREAM_SUPPORTED_CHANNELS.end()) { + return false; + } + + // check audio sample format + AudioSampleFormat format = static_cast(params.format); + auto formatItem = std::find(AUDIO_FAST_STREAM_SUPPORTED_FORMATS.begin(), + AUDIO_FAST_STREAM_SUPPORTED_FORMATS.end(), format); + + if (formatItem == AUDIO_FAST_STREAM_SUPPORTED_FORMATS.end()) { + return false; + } + } + return true; +} + std::shared_ptr IAudioStream::GetPlaybackStream(StreamClass streamClass, AudioStreamParams params, AudioStreamType eStreamType, int32_t appUid) { @@ -153,4 +191,4 @@ std::shared_ptr IAudioStream::GetRecordStream(StreamClass streamCl return nullptr; } } // namespace AudioStandard -} // namespace OHOS \ No newline at end of file +} // namespace OHOS -- Gitee