diff --git a/frameworks/native/audiorenderer/src/audio_renderer.cpp b/frameworks/native/audiorenderer/src/audio_renderer.cpp index e67df5e3fa0a68246cc60e9bfa6423f7ede7ac0a..76582d81682d8fe2f7da59362e09e339c911694f 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 5461ad3ec586f3257dd4695322af9d5281e5aacb..6471804a379e410be34df27ccb1df61cafbacbf1 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 dd4b376fef321d5ef7193c32d93f472f2f4112bc..3e34e62390f08d83c1369421799b4cc258abb337 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 9923d066b81bd95b61a0233ef2fed5c5b030c438..1e014c4b4aced6ecd61885a6dccdc05f9f2123a4 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