diff --git a/common/include/audio_types.h b/common/include/audio_types.h index f9391267b4fa0c68af614b81bf7a75d95522c53c..92072700e3bf170be180924199805de7adae0f6f 100644 --- a/common/include/audio_types.h +++ b/common/include/audio_types.h @@ -119,6 +119,9 @@ enum AudioCategory { AUDIO_IN_CALL, /**< Call */ AUDIO_MMAP_NOIRQ, /**< Mmap mode */ AUDIO_MMAP_VOIP = 8, /**< Mmap Voip mode */ + AUDIO_NOTIFICATION, /**< Notification */ + AUDIO_VOICE_MESSAGE, /**< Voice message */ + AUDIO_VOICE_ASSISTANT, /**< Voice assistant */ }; /** diff --git a/services/audiohdiproxy/include/daudio_manager_callback.h b/services/audiohdiproxy/include/daudio_manager_callback.h index 1066124f399ecbe30eabca1e3f05657fc4b52def..6ab8cd6365e7ec6ae53ad8f3611ac98fc0909957 100644 --- a/services/audiohdiproxy/include/daudio_manager_callback.h +++ b/services/audiohdiproxy/include/daudio_manager_callback.h @@ -49,6 +49,11 @@ public: int32_t RefreshAshmemInfo(int32_t streamId, int fd, int32_t ashmemLength, int32_t lengthPerTrans) override; + int32_t GetLatency(int32_t streamId, uint32_t& ms) override; + + int32_t GetRenderPosition(int32_t streamId, uint64_t& frames, + OHOS::HDI::DistributedAudio::Audioext::V2_0::AudioTimeStamp& time) override; + private: int32_t GetAudioParamHDF(const OHOS::HDI::DistributedAudio::Audioext::V2_0::AudioParameter& param, AudioParamHDF& paramHDF); diff --git a/services/audiohdiproxy/include/idaudio_hdi_callback.h b/services/audiohdiproxy/include/idaudio_hdi_callback.h index 0f1711450ef0f51444b627334a58961e57210b6b..7ca51924c44cbc3a9d4864735306569ab6bd2472 100644 --- a/services/audiohdiproxy/include/idaudio_hdi_callback.h +++ b/services/audiohdiproxy/include/idaudio_hdi_callback.h @@ -42,6 +42,10 @@ public: virtual int32_t RefreshAshmemInfo(const int32_t streamId, int32_t fd, int32_t ashmemLength, int32_t lengthPerTrans) = 0; + + virtual int32_t GetLatency(const int32_t streamId, uint32_t ms) = 0; + + virtual int32_t GetRenderPosition(const int32_t streamId, uint64_t &frames, AudioTimeStamp &time) = 0; }; } // DistributedHardware } // OHOS diff --git a/services/audiohdiproxy/src/daudio_manager_callback.cpp b/services/audiohdiproxy/src/daudio_manager_callback.cpp index a9feb9957935042e604524f7bb1a77dc9842a8e6..b37c34cd50e970b2825a6ab0b9c12b7b02b2dcc5 100644 --- a/services/audiohdiproxy/src/daudio_manager_callback.cpp +++ b/services/audiohdiproxy/src/daudio_manager_callback.cpp @@ -87,6 +87,15 @@ int32_t DAudioManagerCallback::GetAudioParamHDF(const AudioParameter& param, Aud case AUDIO_MMAP_NOIRQ: paramHDF.streamUsage = StreamUsage::STREAM_USAGE_MEDIA; break; + case AUDIO_NOTIFICATION: + paramHDF.streamUsage = StreamUsage::STREAM_USAGE_NOTIFICATION; + break; + case AUDIO_VOICE_MESSAGE: + paramHDF.streamUsage = StreamUsage::STREAM_USAGE_VOICE_MESSAGE; + break; + case AUDIO_VOICE_ASSISTANT: + paramHDF.streamUsage = StreamUsage::STREAM_USAGE_VOICE_ASSISTANT; + break; default: DHLOGE("Stream usage [%{public}" PRIu32"] does not support conversion.", param.streamUsage); return HDF_FAILURE; @@ -156,6 +165,18 @@ int32_t DAudioManagerCallback::NotifyEvent(int32_t streamId, case AudioEventHDF::AUDIO_EVENT_STOP: newEvent.type = AudioEventType::AUDIO_STOP; break; + case AudioEventHDF::AUDIO_EVENT_OFFLOAD_BUF_SIZE_CHANGE: + newEvent.type = AudioEventType::AUDIO_OFFLOAD_BUF_SIZE_CHANGE; + break; + case AudioEventHDF::AUDIO_EVENT_FLUSH: + newEvent.type = AudioEventType::AUDIO_FLUSH; + break; + case AudioEventHDF::AUDIO_EVENT_SPEED_CHANGE: + newEvent.type = AudioEventType::AUDIO_SPEED_CHANGE; + break; + case AudioEventHDF::AUDIO_EVENT_VOLUME_CHANGE: + newEvent.type = AudioEventType::AUDIO_VOLUME_CHANGE; + break; default: DHLOGE("Unsupport event tpye."); break; @@ -238,5 +259,33 @@ int32_t DAudioManagerCallback::RefreshAshmemInfo(int32_t streamId, int fd, int32 DHLOGD("Refresh ashmem info success."); return HDF_SUCCESS; } + +int32_t DAudioManagerCallback::GetLatency(int32_t streamId, uint32_t& ms) +{ + DHLOGD("Get lantency."); + CHECK_NULL_RETURN(callback_, HDF_FAILURE); + if (callback_->GetLatency(streamId, ms) != DH_SUCCESS) { + DHLOGE("Get lantency failed."); + return HDF_FAILURE; + } + DHLOGD("Get lantency success."); + return HDF_SUCCESS; +} + +int32_t DAudioManagerCallback::GetRenderPosition(int32_t streamId, uint64_t& frames, + OHOS::HDI::DistributedAudio::Audioext::V2_0::AudioTimeStamp& time) +{ + DHLOGD("Get render position."); + CHECK_NULL_RETURN(callback_, HDF_FAILURE); + AudioTimeStamp timeHdf; + if (callback_->GetRenderPosition(streamId, frames, timeHdf) != DH_SUCCESS) { + DHLOGE("Get render position failed."); + return HDF_FAILURE; + } + time.tvSec = timeHdf.tvSec; + time.tvNSec = timeHdf.tvNSec; + DHLOGD("Get render position success."); + return HDF_SUCCESS; +} } // DistributedHardware } // OHOS diff --git a/services/audiohdiproxy/test/unittest/daudio_hdi_handler/include/audio_test_utils.h b/services/audiohdiproxy/test/unittest/daudio_hdi_handler/include/audio_test_utils.h index 8c506ca037060140675d9e616358707cf347137a..a0502f713e8def4bedeb16956fe8e1c541a2624c 100644 --- a/services/audiohdiproxy/test/unittest/daudio_hdi_handler/include/audio_test_utils.h +++ b/services/audiohdiproxy/test/unittest/daudio_hdi_handler/include/audio_test_utils.h @@ -94,6 +94,16 @@ public: { return DH_SUCCESS; } + + int32_t GetLatency(const int32_t streamId, uint32_t ms) + { + return DH_SUCCESS; + } + + int32_t GetRenderPosition(const int32_t streamId, uint64_t &frames, AudioTimeStamp &time) + { + return DH_SUCCESS; + } }; } // DistributedHardware } // OHOS diff --git a/services/audiohdiproxy/test/unittest/daudio_manager_callback/include/audio_test_utils.h b/services/audiohdiproxy/test/unittest/daudio_manager_callback/include/audio_test_utils.h index 03ad160afa68e1b47bca6443f58e16a4c1e593fc..01a1263cc5ba99ca5e02c721771d0ea866960d28 100644 --- a/services/audiohdiproxy/test/unittest/daudio_manager_callback/include/audio_test_utils.h +++ b/services/audiohdiproxy/test/unittest/daudio_manager_callback/include/audio_test_utils.h @@ -67,6 +67,16 @@ public: { return DH_SUCCESS; } + + int32_t GetLatency(const int32_t streamId, uint32_t ms) + { + return DH_SUCCESS; + } + + int32_t GetRenderPosition(const int32_t streamId, uint64_t &frames, AudioTimeStamp &time) + { + return DH_SUCCESS; + } }; } // DistributedHardware } // OHOS diff --git a/services/audiohdiproxy/test/unittest/daudio_manager_callback/src/daudio_manager_callback_test.cpp b/services/audiohdiproxy/test/unittest/daudio_manager_callback/src/daudio_manager_callback_test.cpp index 7b3b84417ea67941b5fc2a365aee0184ee5a57ba..24d126df5050d8509df6f3401f8492178f152e37 100644 --- a/services/audiohdiproxy/test/unittest/daudio_manager_callback/src/daudio_manager_callback_test.cpp +++ b/services/audiohdiproxy/test/unittest/daudio_manager_callback/src/daudio_manager_callback_test.cpp @@ -155,6 +155,16 @@ HWTEST_F(DAudioManagerCallbackTest, SetParameters_002, TestSize.Level1) .ext = "HDF_SUCCESS" }; EXPECT_NE(HDF_SUCCESS, manCallback_->SetParameters(streamId_, param)); + param = { + .format = 2, + .channelCount = 2, + .sampleRate = 192000, + .period = 0, + .frameSize = 0, + .streamUsage = 9, + .ext = "HDF_SUCCESS" + }; + EXPECT_EQ(HDF_SUCCESS, manCallback_->SetParameters(streamId_, param)); EXPECT_EQ(HDF_SUCCESS, manCallback_->DestroyStream(streamId_)); } @@ -214,6 +224,18 @@ HWTEST_F(DAudioManagerCallbackTest, NotifyEvent_002, TestSize.Level1) event.type = AudioEventHDF::AUDIO_EVENT_STOP; event.content = "HDF_SUCCESS"; EXPECT_EQ(HDF_SUCCESS, manCallback_->NotifyEvent(streamId_, event)); + event.type = AudioEventHDF::AUDIO_EVENT_OFFLOAD_BUF_SIZE_CHANGE; + event.content = "HDF_SUCCESS"; + EXPECT_EQ(HDF_SUCCESS, manCallback_->NotifyEvent(streamId_, event)); + event.type = AudioEventHDF::AUDIO_EVENT_FLUSH; + event.content = "HDF_SUCCESS"; + EXPECT_EQ(HDF_SUCCESS, manCallback_->NotifyEvent(streamId_, event)); + event.type = AudioEventHDF::AUDIO_EVENT_SPEED_CHANGE; + event.content = "HDF_SUCCESS"; + EXPECT_EQ(HDF_SUCCESS, manCallback_->NotifyEvent(streamId_, event)); + event.type = AudioEventHDF::AUDIO_EVENT_VOLUME_CHANGE; + event.content = "HDF_SUCCESS"; + EXPECT_EQ(HDF_SUCCESS, manCallback_->NotifyEvent(streamId_, event)); event.type = -1; event.content = "HDF_SUCCESS"; EXPECT_EQ(HDF_SUCCESS, manCallback_->NotifyEvent(streamId_, event)); @@ -343,5 +365,38 @@ HWTEST_F(DAudioManagerCallbackTest, RefreshAshmemInfo_001, TestSize.Level1) manCallback_->callback_ = std::make_shared(); EXPECT_EQ(HDF_SUCCESS, manCallback_->RefreshAshmemInfo(streamId, fd, ashmemLength, lengthPerTrans)); } + +/** + * @tc.name: GetLatency_001 + * @tc.desc: Verify the GetLatency function. + * @tc.type: FUNC + * @tc.require: AR000H0E6H + */ +HWTEST_F(DAudioManagerCallbackTest, GetLatency_001, TestSize.Level1) +{ + ASSERT_TRUE(manCallback_ != nullptr); + int32_t streamId = 1; + uint32_t ms = 0; + EXPECT_EQ(HDF_SUCCESS, manCallback_->GetLatency(streamId, ms)); + manCallback_->callback_ = std::make_shared(); + EXPECT_EQ(HDF_SUCCESS, manCallback_->GetLatency(streamId, ms)); +} + +/** + * @tc.name: GetRenderPosition_001 + * @tc.desc: Verify the GetRenderPosition function. + * @tc.type: FUNC + * @tc.require: AR000H0E6H + */ +HWTEST_F(DAudioManagerCallbackTest, GetRenderPosition_001, TestSize.Level1) +{ + ASSERT_TRUE(manCallback_ != nullptr); + int32_t streamId = 1; + uint64_t frames = 0; + OHOS::HDI::DistributedAudio::Audioext::V2_0::AudioTimeStamp time; + EXPECT_EQ(HDF_SUCCESS, manCallback_->GetRenderPosition(streamId, frames, time)); + manCallback_->callback_ = std::make_shared(); + EXPECT_EQ(HDF_SUCCESS, manCallback_->GetRenderPosition(streamId, frames, time)); +} } // DistributedHardware } // OHOS \ No newline at end of file diff --git a/services/audiomanager/managersource/include/dmic_dev.h b/services/audiomanager/managersource/include/dmic_dev.h index 46a422613309376ff69f594d7e6d05568404eefd..99285ba8c5d5b0c93388d4358c1d8a9315dc9573 100644 --- a/services/audiomanager/managersource/include/dmic_dev.h +++ b/services/audiomanager/managersource/include/dmic_dev.h @@ -72,6 +72,8 @@ public: int32_t ReadMmapPosition(const int32_t streamId, uint64_t &frames, CurrentTimeHDF &time) override; int32_t RefreshAshmemInfo(const int32_t streamId, int32_t fd, int32_t ashmemLength, int32_t lengthPerTrans) override; + int32_t GetLatency(const int32_t streamId, uint32_t ms) override; + int32_t GetRenderPosition(const int32_t streamId, uint64_t &frames, AudioTimeStamp &time) override; int32_t MmapStart() override; int32_t MmapStop() override; diff --git a/services/audiomanager/managersource/include/dspeaker_dev.h b/services/audiomanager/managersource/include/dspeaker_dev.h index 68d2eaeaa008aaa3523d61b32713e48d6c8f96cf..12245ab504ab2d33125a7000bd7d149eb81fd067 100644 --- a/services/audiomanager/managersource/include/dspeaker_dev.h +++ b/services/audiomanager/managersource/include/dspeaker_dev.h @@ -66,6 +66,8 @@ public: int32_t ReadMmapPosition(const int32_t streamId, uint64_t &frames, CurrentTimeHDF &time) override; int32_t RefreshAshmemInfo(const int32_t streamId, int32_t fd, int32_t ashmemLength, int32_t lengthPerTrans) override; + int32_t GetLatency(const int32_t streamId, uint32_t ms) override; + int32_t GetRenderPosition(const int32_t streamId, uint64_t &frames, AudioTimeStamp &time) override; int32_t MmapStart() override; int32_t MmapStop() override; diff --git a/services/audiomanager/managersource/src/dmic_dev.cpp b/services/audiomanager/managersource/src/dmic_dev.cpp index a1cbbfc8c62aa5d330983f0b7882e98f40cb3834..d7b5cad4ef8e978bb8b82302a5a8bfb9e3ea3da2 100644 --- a/services/audiomanager/managersource/src/dmic_dev.cpp +++ b/services/audiomanager/managersource/src/dmic_dev.cpp @@ -556,6 +556,21 @@ int32_t DMicDev::RefreshAshmemInfo(const int32_t streamId, return DH_SUCCESS; } +int32_t DMicDev::GetLatency(const int32_t streamId, uint32_t ms) +{ + (void)streamId; + (void)ms; + return DH_SUCCESS; +} + +int32_t DMicDev::GetRenderPosition(const int32_t streamId, uint64_t &frames, AudioTimeStamp &time) +{ + (void)streamId; + (void)frames; + (void)time; + return DH_SUCCESS; +} + int32_t DMicDev::MmapStart() { CHECK_NULL_RETURN(ashmem_, ERR_DH_AUDIO_NULLPTR); diff --git a/services/audiomanager/managersource/src/dspeaker_dev.cpp b/services/audiomanager/managersource/src/dspeaker_dev.cpp index 18ee517273e9ff07888bfdbe26f2ec7c31205319..afd1de095b1d00e021102ae61b9ef0e78e7f733e 100644 --- a/services/audiomanager/managersource/src/dspeaker_dev.cpp +++ b/services/audiomanager/managersource/src/dspeaker_dev.cpp @@ -434,6 +434,22 @@ int32_t DSpeakerDev::RefreshAshmemInfo(const int32_t streamId, return DH_SUCCESS; } +int32_t DSpeakerDev::GetLatency(const int32_t streamId, uint32_t ms) +{ + (void)streamId; + (void)ms; + return DH_SUCCESS; +} + +int32_t DSpeakerDev::GetRenderPosition(const int32_t streamId, uint64_t &frames, AudioTimeStamp &time) +{ + (void)streamId; + (void)frames; + (void)time; + return DH_SUCCESS; +} + + int32_t DSpeakerDev::MmapStart() { CHECK_NULL_RETURN(ashmem_, ERR_DH_AUDIO_NULLPTR); diff --git a/services/common/audioparam/audio_event.h b/services/common/audioparam/audio_event.h index 469f14dc030a4c33cc50413ed311fb1029c5014d..924ffc5d60a352169d9e79745157744ba8dbb02b 100644 --- a/services/common/audioparam/audio_event.h +++ b/services/common/audioparam/audio_event.h @@ -72,6 +72,11 @@ typedef enum { MMAP_MIC_STOP = 84, AUDIO_START = 85, AUDIO_STOP = 86, + + AUDIO_OFFLOAD_BUF_SIZE_CHANGE = 91, + AUDIO_FLUSH = 92, + AUDIO_SPEED_CHANGE = 93, + AUDIO_VOLUME_CHANGE = 94, } AudioEventType; typedef enum { @@ -97,6 +102,9 @@ typedef enum { AUDIO_EVENT_STOP = 19, AUDIO_EVENT_SPK_DUMP = 20, AUDIO_EVENT_MIC_DUMP = 21, + AUDIO_EVENT_OFFLOAD_BUF_SIZE_CHANGE = 22, + AUDIO_EVENT_FLUSH = 23, + AUDIO_EVENT_SPEED_CHANGE = 24, } AudioEventHDF; class AudioEvent { public: diff --git a/services/common/audioparam/audio_param.h b/services/common/audioparam/audio_param.h index 1b03f4d81065bee02db22677d3522408a7d983c6..09edf98e1a06b1f77d133f1c096c5cbe4e938e99 100644 --- a/services/common/audioparam/audio_param.h +++ b/services/common/audioparam/audio_param.h @@ -31,7 +31,8 @@ typedef enum { SAMPLE_RATE_44100 = 44100, SAMPLE_RATE_48000 = 48000, SAMPLE_RATE_64000 = 64000, - SAMPLE_RATE_96000 = 96000 + SAMPLE_RATE_96000 = 96000, + SAMPLE_RATE_192000 = 192000 } AudioSampleRate; typedef enum { @@ -77,7 +78,9 @@ typedef enum { STREAM_USAGE_VOICE_COMMUNICATION = 2, STREAM_USAGE_VOICE_ASSISTANT = 4, STREAM_USAGE_MMAP = 5, - STREAM_USAGE_NOTIFICATION_RINGTONE = 6 + STREAM_USAGE_NOTIFICATION_RINGTONE = 6, + STREAM_USAGE_NOTIFICATION = 7, + STREAM_USAGE_VOICE_MESSAGE = 8 } StreamUsage; typedef enum { @@ -143,6 +146,11 @@ typedef enum { REF, MIC1, } StreamType; + +struct AudioTimeStamp { + int64_t tvSec; /**< Seconds */ + int64_t tvNSec; /**< Nanoseconds */ +}; } // namespace DistributedHardware } // namespace OHOS #endif // OHOS_DAUDIO_AUDIO_PARAM_H