From f3e40b9753ff0e5e986cf7ded1b32b6c1910f8b9 Mon Sep 17 00:00:00 2001 From: liyuhang Date: Thu, 28 Dec 2023 15:20:30 +0800 Subject: [PATCH] Bugfix releated to IPC Signed-off-by: liyuhang Change-Id: I4d27b69d8ab0d317f2717d3858783cfdb440e29a --- .../native/audioutils/include/audio_utils_c.h | 2 + .../native/audioutils/src/audio_utils.cpp | 5 ++ frameworks/native/examples/pa_stream_test.cpp | 22 ++++---- .../audio_service/client/src/audio_stream.cpp | 2 - .../client/src/i_audio_stream.cpp | 11 +++- .../server/include/capturer_in_server.h | 3 +- .../server/include/pa_capturer_stream_impl.h | 1 + .../server/include/renderer_in_server.h | 3 +- .../server/src/capturer_in_server.cpp | 55 +++++++------------ .../server/src/ipc_stream_in_server.cpp | 12 ++-- .../server/src/ipc_stream_stub.cpp | 1 - .../server/src/pa_adapter_manager.cpp | 30 +++++++--- .../server/src/pa_capturer_stream_impl.cpp | 26 +++++---- .../server/src/pa_renderer_stream_impl.cpp | 21 +++---- .../server/src/renderer_in_server.cpp | 49 +++++++++-------- 15 files changed, 129 insertions(+), 114 deletions(-) diff --git a/frameworks/native/audioutils/include/audio_utils_c.h b/frameworks/native/audioutils/include/audio_utils_c.h index 1bb3ad1453..151e7b630a 100644 --- a/frameworks/native/audioutils/include/audio_utils_c.h +++ b/frameworks/native/audioutils/include/audio_utils_c.h @@ -31,6 +31,8 @@ CTrace *GetAndStart(const char *traceName); void EndCTrace(CTrace *cTrace); +void CTraceCount(const char *traceName, int64_t count); + void CallEndAndClear(CTrace **cTrace); #ifdef __cplusplus diff --git a/frameworks/native/audioutils/src/audio_utils.cpp b/frameworks/native/audioutils/src/audio_utils.cpp index 8fba67dcc9..4ad30dbefc 100644 --- a/frameworks/native/audioutils/src/audio_utils.cpp +++ b/frameworks/native/audioutils/src/audio_utils.cpp @@ -523,6 +523,11 @@ void EndCTrace(CTrace *cTrace) } } +void CTraceCount(const char *traceName, int64_t count) +{ + OHOS::AudioStandard::Trace::Count(traceName, count); +} + void CallEndAndClear(CTrace **cTrace) { if (cTrace != nullptr && *cTrace != nullptr) { diff --git a/frameworks/native/examples/pa_stream_test.cpp b/frameworks/native/examples/pa_stream_test.cpp index c9f556a8f2..540f100bc2 100644 --- a/frameworks/native/examples/pa_stream_test.cpp +++ b/frameworks/native/examples/pa_stream_test.cpp @@ -391,7 +391,7 @@ public: private: std::unique_ptr audioCapturer_ = nullptr; - bool isBlocking_ = false; + bool isBlocking_ = true; std::condition_variable enableReadCv_; std::mutex enableReadThreadLock_; @@ -417,7 +417,7 @@ int32_t PaCapturerTest::InitCapturer(bool isBlocking, CapturerMode capturerMode) isBlocking_ = isBlocking; capturerMode_ = capturerMode; AudioCapturerOptions capturerOptions; - capturerOptions.streamInfo.samplingRate = SAMPLE_RATE_44100; + capturerOptions.streamInfo.samplingRate = SAMPLE_RATE_8000; capturerOptions.streamInfo.encoding = AudioEncodingType::ENCODING_PCM; capturerOptions.streamInfo.format = AudioSampleFormat::SAMPLE_S16LE; capturerOptions.streamInfo.channels = AudioChannel::STEREO; @@ -576,15 +576,15 @@ void PrintUsage() cout << " 4: Drain play." << endl; cout << " 5: Stop play." << endl; cout << " 6: Release play." << endl; - cout << " 7: Write data." << endl; - - cout << " 100: Init renderer." << endl; - cout << " 101: Start play." << endl; - cout << " 102: Pause play." << endl; - cout << " 103: Flush play." << endl; - cout << " 105: Stop play." << endl; - cout << " 106: Release play." << endl; - cout << " 107: Read data." << endl; + cout << " 7: Write data run." << endl; + + cout << " 100: Init Capturer." << endl; + cout << " 101: Start read." << endl; + cout << " 102: Pause read." << endl; + cout << " 103: Flush read." << endl; + cout << " 105: Stop read." << endl; + cout << " 106: Release read." << endl; + cout << " 107: Read data run." << endl; cout << " 1000: exit demo." << endl; cout << " Please input your choice: " << endl; diff --git a/services/audio_service/client/src/audio_stream.cpp b/services/audio_service/client/src/audio_stream.cpp index 96c8e9621e..7216f40768 100644 --- a/services/audio_service/client/src/audio_stream.cpp +++ b/services/audio_service/client/src/audio_stream.cpp @@ -345,7 +345,6 @@ int32_t AudioStream::SetAudioStreamInfo(const AudioStreamParams info, StopAudioStream(); ReleaseAudioStream(false); } - AUDIO_ERR_LOG("0000000000000000000000111"); AudioStreamParams param = info; int32_t ret = 0; @@ -354,7 +353,6 @@ int32_t AudioStream::SetAudioStreamInfo(const AudioStreamParams info, AUDIO_ERR_LOG("InitFromParams error"); return ret; } - AUDIO_ERR_LOG("000000000000000000000011122"); if (CreateStream(param, eStreamType_) != SUCCESS) { AUDIO_ERR_LOG("AudioStream:Create stream failed"); diff --git a/services/audio_service/client/src/i_audio_stream.cpp b/services/audio_service/client/src/i_audio_stream.cpp index 736281d649..35d0ffe476 100644 --- a/services/audio_service/client/src/i_audio_stream.cpp +++ b/services/audio_service/client/src/i_audio_stream.cpp @@ -27,6 +27,11 @@ namespace OHOS { namespace AudioStandard { +namespace { + constexpr int32_t MEDIA_UID = 1013; + constexpr int32_t IPC_FOR_NOT_MEDIA = 1; + constexpr int32_t IPC_FOR_ALL = 2; +} const std::map, AudioStreamType> streamTypeMap_ = IAudioStream::CreateStreamMap(); std::map, AudioStreamType> IAudioStream::CreateStreamMap() { @@ -208,7 +213,8 @@ std::shared_ptr IAudioStream::GetPlaybackStream(StreamClass stream } int32_t ipcFlag = 0; - if (GetSysPara("persist.multimedia.audio.stream.ipc", ipcFlag) && ipcFlag == 1) { + GetSysPara("persist.multimedia.audiostream.ipc.renderer", ipcFlag); + if (ipcFlag == IPC_FOR_ALL || (ipcFlag == IPC_FOR_NOT_MEDIA && getuid() != MEDIA_UID)) { AUDIO_INFO_LOG("Create ipc playback stream"); return RendererInClient::GetInstance(eStreamType, appUid); } @@ -230,7 +236,8 @@ std::shared_ptr IAudioStream::GetRecordStream(StreamClass streamCl } int32_t ipcFlag = 0; - if (GetSysPara("persist.multimedia.audio.stream.ipc", ipcFlag) && ipcFlag == 1) { + GetSysPara("persist.multimedia.audiostream.ipc.capturer", ipcFlag); + if (ipcFlag == IPC_FOR_ALL || (ipcFlag == IPC_FOR_NOT_MEDIA && getuid() != MEDIA_UID)) { AUDIO_INFO_LOG("Create ipc record stream"); return CapturerInClient::GetInstance(eStreamType, appUid); } diff --git a/services/audio_service/server/include/capturer_in_server.h b/services/audio_service/server/include/capturer_in_server.h index f503c3781f..d62136cf2d 100644 --- a/services/audio_service/server/include/capturer_in_server.h +++ b/services/audio_service/server/include/capturer_in_server.h @@ -31,7 +31,6 @@ public: class CapturerInServer : public IStatusCallback, public IReadCallback, public std::enable_shared_from_this { public: - // LYH waiting for review: add IStreamListener CapturerInServer(AudioProcessConfig processConfig, std::weak_ptr streamListener); virtual ~CapturerInServer(); void OnStatusUpdate(IOperation operation) override; @@ -48,7 +47,7 @@ public: int32_t GetAudioTime(uint64_t &framePos, uint64_t &timeStamp); int32_t GetLatency(uint64_t &latency); - void Init(); + int32_t Init(); void RegisterTestCallback(const std::weak_ptr &callback); int32_t ConfigServerBuffer(); diff --git a/services/audio_service/server/include/pa_capturer_stream_impl.h b/services/audio_service/server/include/pa_capturer_stream_impl.h index 81c507cb67..f9756c68a8 100644 --- a/services/audio_service/server/include/pa_capturer_stream_impl.h +++ b/services/audio_service/server/include/pa_capturer_stream_impl.h @@ -24,6 +24,7 @@ namespace AudioStandard { class PaCapturerStreamImpl : public ICapturerStream { public: PaCapturerStreamImpl(pa_stream *paStream, AudioProcessConfig processConfig, pa_threaded_mainloop *mainloop); + ~PaCapturerStreamImpl(); void InitParams(); int32_t Start() override; int32_t Pause() override; diff --git a/services/audio_service/server/include/renderer_in_server.h b/services/audio_service/server/include/renderer_in_server.h index 8f230d5636..9e461d3990 100644 --- a/services/audio_service/server/include/renderer_in_server.h +++ b/services/audio_service/server/include/renderer_in_server.h @@ -26,7 +26,6 @@ namespace AudioStandard { class RendererInServer : public IStatusCallback, public IWriteCallback, public std::enable_shared_from_this { public: - // LYH waiting for review: add IStreamListener RendererInServer(AudioProcessConfig processConfig, std::weak_ptr streamListener); virtual ~RendererInServer(); void OnStatusUpdate(IOperation operation) override; @@ -52,7 +51,7 @@ public: int32_t SetPrivacyType(int32_t privacyType); int32_t GetPrivacyType(int32_t &privacyType); - void Init(); + int32_t Init(); int32_t ConfigServerBuffer(); int32_t InitBufferStatus(); int32_t UpdateWriteIndex(); diff --git a/services/audio_service/server/src/capturer_in_server.cpp b/services/audio_service/server/src/capturer_in_server.cpp index 2e71de7e5d..280df18c56 100644 --- a/services/audio_service/server/src/capturer_in_server.cpp +++ b/services/audio_service/server/src/capturer_in_server.cpp @@ -30,11 +30,7 @@ namespace { CapturerInServer::CapturerInServer(AudioProcessConfig processConfig, std::weak_ptr streamListener) { processConfig_ = processConfig; - streamListener_ = streamListener; // LYH waiting for review - int32_t ret = IStreamManager::GetRecorderManager().CreateCapturer(processConfig, stream_); - AUDIO_INFO_LOG("Construct capturerInServer result: %{public}d", ret); - streamIndex_ = stream_->GetStreamIndex(); - ConfigServerBuffer(); + streamListener_ = streamListener; } CapturerInServer::~CapturerInServer() @@ -108,12 +104,17 @@ int32_t CapturerInServer::InitBufferStatus() return SUCCESS; } -void CapturerInServer::Init() +int32_t CapturerInServer::Init() { - AUDIO_INFO_LOG("Init, register status and read callback"); - CHECK_AND_RETURN_LOG(stream_ != nullptr, "Capturer stream is nullptr"); + int32_t ret = IStreamManager::GetRecorderManager().CreateCapturer(processConfig_, stream_); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS && stream_ != nullptr, ERR_OPERATION_FAILED, + "Construct CapturerInServer failed: %{public}d", ret); + streamIndex_ = stream_->GetStreamIndex(); + ret = ConfigServerBuffer(); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_OPERATION_FAILED, "ConfigServerBuffer failed: %{public}d", ret); stream_->RegisterStatusCallback(shared_from_this()); stream_->RegisterReadCallback(shared_from_this()); + return SUCCESS; } void CapturerInServer::OnStatusUpdate(IOperation operation) @@ -127,7 +128,6 @@ void CapturerInServer::OnStatusUpdate(IOperation operation) } std::shared_ptr stateListener = streamListener_.lock(); CHECK_AND_RETURN_LOG(stateListener != nullptr, "IStreamListener is nullptr"); - // std::shared_ptr callback = testCallback_.lock(); switch (operation) { case OPERATION_UNDERFLOW: underflowCount += 1; @@ -180,7 +180,7 @@ void CapturerInServer::ReadData(size_t length) uint64_t currentReadFrame = audioServerBuffer_->GetCurReadFrame(); uint64_t currentWriteFrame = audioServerBuffer_->GetCurWriteFrame(); - AUDIO_INFO_LOG("Current write frame: %{public}" PRIu64 ", read frame: %{public}" PRIu64 "," + AUDIO_DEBUG_LOG("Current write frame: %{public}" PRIu64 ", read frame: %{public}" PRIu64 "," "avaliable frame:%{public}d, spanSizeInFrame:%{public}zu", currentWriteFrame, currentReadFrame, audioServerBuffer_->GetAvailableDataFrames(), spanSizeInFrame_); if (audioServerBuffer_->GetAvailableDataFrames() <= spanSizeInFrame_) { @@ -197,11 +197,10 @@ void CapturerInServer::ReadData(size_t length) if (ret < 0) { return; } - AUDIO_INFO_LOG("On read spanSizeInBytes_ %{public}zu", spanSizeInBytes_); memcpy_s(dstBuffer.buffer, spanSizeInBytes_, srcBuffer.buffer, spanSizeInBytes_); uint64_t nextWriteFrame = currentWriteFrame + spanSizeInFrame_; - AUDIO_INFO_LOG("Read data, current write frame: %{public}" PRIu64 ", next write frame: %{public}" PRIu64 "", + AUDIO_DEBUG_LOG("Read data, current write frame: %{public}" PRIu64 ", next write frame: %{public}" PRIu64 "", currentWriteFrame, nextWriteFrame); audioServerBuffer_->SetCurWriteFrame(nextWriteFrame); } @@ -232,11 +231,6 @@ int32_t CapturerInServer::ResolveBuffer(std::shared_ptr &buffer) int32_t CapturerInServer::GetSessionId(uint32_t &sessionId) { - { - std::unique_lock lock(statusLock_); - CHECK_AND_RETURN_RET_LOG(status_ != I_STATUS_RELEASED && status_ != I_STATUS_IDLE, ERR_ILLEGAL_STATE, - "Illegal state %{public}d", status_); - } CHECK_AND_RETURN_RET_LOG(stream_ != nullptr, ERR_OPERATION_FAILED, "GetSessionId failed, stream_ is null"); sessionId = streamIndex_; CHECK_AND_RETURN_RET_LOG(sessionId < INT32_MAX, ERR_OPERATION_FAILED, "GetSessionId failed, sessionId:%{public}d", @@ -332,26 +326,19 @@ int32_t CapturerInServer::Release() { { std::unique_lock lock(statusLock_); - CHECK_AND_RETURN_RET_LOG(status_ != I_STATUS_RELEASED && status_ != I_STATUS_IDLE, ERR_ILLEGAL_STATE, - "Illegal state %{public}d", status_); + if (status_ == I_STATUS_RELEASED) { + AUDIO_INFO_LOG("Already released"); + return SUCCESS; + } } AUDIO_INFO_LOG("Start release capturer"); - { - std::unique_lock lock(statusLock_); - status_ = I_STATUS_RELEASED; - - int32_t ret = IStreamManager::GetRecorderManager().ReleaseCapturer(streamIndex_); - stream_ = nullptr; - if (ret < 0) { - AUDIO_ERR_LOG("Release stream failed, reason: %{public}d", ret); - status_ = I_STATUS_INVALID; - return ret; - } - status_ = I_STATUS_RELEASED; + int32_t ret = IStreamManager::GetRecorderManager().ReleaseCapturer(streamIndex_); + if (ret < 0) { + AUDIO_ERR_LOG("Release stream failed, reason: %{public}d", ret); + status_ = I_STATUS_INVALID; + return ret; } - std::shared_ptr stateListener = streamListener_.lock(); - CHECK_AND_RETURN_RET_LOG(stateListener != nullptr, ERROR, "IStreamListener is nullptr"); - stateListener->OnOperationHandled(RELEASE_STREAM, 0); + status_ = I_STATUS_RELEASED; return SUCCESS; } diff --git a/services/audio_service/server/src/ipc_stream_in_server.cpp b/services/audio_service/server/src/ipc_stream_in_server.cpp index 409ca971e8..06b2c461b5 100644 --- a/services/audio_service/server/src/ipc_stream_in_server.cpp +++ b/services/audio_service/server/src/ipc_stream_in_server.cpp @@ -45,7 +45,6 @@ int32_t StreamListenerHolder::RegisterStreamListener(sptr lis int32_t StreamListenerHolder::OnOperationHandled(Operation operation, int64_t result) { - AUDIO_INFO_LOG("OnOperationHandled: operation: %{public}d, result: [%{public}" PRId64 "]", operation, result); std::lock_guard lock(listenerMutex_); CHECK_AND_RETURN_RET_LOG(streamListener_ != nullptr, ERR_OPERATION_FAILED, "stream listrener not set"); return streamListener_->OnOperationHandled(operation, result); @@ -78,7 +77,6 @@ int32_t IpcStreamInServer::Config() { streamListenerHolder_ = std::make_shared(); - // LYH waiting for review: pass streamListenerHolder_ to RendererInServer or CapturerInServer if (mode_ == AUDIO_MODE_PLAYBACK) { return ConfigRenderer(); } @@ -91,19 +89,19 @@ int32_t IpcStreamInServer::Config() int32_t IpcStreamInServer::ConfigRenderer() { - // LYH waiting for review: use config_.streamInfo instead of AudioStreamParams rendererInServer_ = std::make_shared(config_, streamListenerHolder_); - rendererInServer_->Init(); - CHECK_AND_RETURN_RET_LOG(rendererInServer_ != nullptr, ERR_OPERATION_FAILED, "create RendererInServer failed"); + CHECK_AND_RETURN_RET_LOG(rendererInServer_ != nullptr, ERR_OPERATION_FAILED, "Create RendererInServer failed"); + int32_t ret = rendererInServer_->Init(); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_OPERATION_FAILED, "Init RendererInServer failed"); return SUCCESS; } int32_t IpcStreamInServer::ConfigCapturer() { - // LYH waiting for review: use config_.streamInfo instead of AudioStreamParams capturerInServer_ = std::make_shared(config_, streamListenerHolder_); CHECK_AND_RETURN_RET_LOG(capturerInServer_ != nullptr, ERR_OPERATION_FAILED, "create CapturerInServer failed"); - capturerInServer_->Init(); + int32_t ret = capturerInServer_->Init(); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_OPERATION_FAILED, "Init CapturerInServer failed"); return SUCCESS; } diff --git a/services/audio_service/server/src/ipc_stream_stub.cpp b/services/audio_service/server/src/ipc_stream_stub.cpp index eecba50acc..256fc0e298 100644 --- a/services/audio_service/server/src/ipc_stream_stub.cpp +++ b/services/audio_service/server/src/ipc_stream_stub.cpp @@ -72,7 +72,6 @@ int32_t IpcStreamStub::HandleResolveBuffer(MessageParcel &data, MessageParcel &r int32_t IpcStreamStub::HandleUpdatePosition(MessageParcel &data, MessageParcel &reply) { - AUDIO_INFO_LOG("IpcStreamStub::HandleUpdatePosition"); (void)data; reply.WriteInt32(UpdatePosition()); return AUDIO_OK; diff --git a/services/audio_service/server/src/pa_adapter_manager.cpp b/services/audio_service/server/src/pa_adapter_manager.cpp index b318933142..6f4cc81db1 100644 --- a/services/audio_service/server/src/pa_adapter_manager.cpp +++ b/services/audio_service/server/src/pa_adapter_manager.cpp @@ -18,6 +18,7 @@ #include #include "audio_log.h" #include "audio_errors.h" +#include "audio_schedule.h" #include "pa_renderer_stream_impl.h" #include "pa_capturer_stream_impl.h" #include "audio_utils.h" @@ -85,9 +86,11 @@ int32_t PaAdapterManager::CreateRender(AudioProcessConfig processConfig, std::sh uint32_t sessionId = g_sessionId++; pa_stream *paStream = InitPaStream(processConfig, sessionId); + CHECK_AND_RETURN_RET_LOG(paStream != nullptr, ERR_OPERATION_FAILED, "Failed to init render"); std::shared_ptr rendererStream = CreateRendererStream(processConfig, paStream); CHECK_AND_RETURN_RET_LOG(rendererStream != nullptr, ERR_DEVICE_INIT, "Failed to init pa stream"); rendererStream->SetStreamIndex(sessionId); + rendererStreamMap_[sessionId] = rendererStream; stream = rendererStream; return SUCCESS; } @@ -129,9 +132,11 @@ int32_t PaAdapterManager::CreateCapturer(AudioProcessConfig processConfig, std:: } uint32_t sessionId = g_sessionId++; pa_stream *paStream = InitPaStream(processConfig, sessionId); + CHECK_AND_RETURN_RET_LOG(paStream != nullptr, ERR_OPERATION_FAILED, "Failed to init capture"); std::shared_ptr capturerStream = CreateCapturerStream(processConfig, paStream); CHECK_AND_RETURN_RET_LOG(capturerStream != nullptr, ERR_DEVICE_INIT, "Failed to init pa stream"); capturerStream->SetStreamIndex(sessionId); + capturerStreamMap_[sessionId] = capturerStream; stream = capturerStream; return SUCCESS; } @@ -194,6 +199,7 @@ int32_t PaAdapterManager::InitPaContext() mainLoop_ = pa_threaded_mainloop_new(); CHECK_AND_RETURN_RET_LOG(mainLoop_ != nullptr, ERR_DEVICE_INIT, "Failed to init pa mainLoop"); api_ = pa_threaded_mainloop_get_api(mainLoop_); + pa_threaded_mainloop_set_name(mainLoop_, "OS_ClientsML"); if (api_ == nullptr) { pa_threaded_mainloop_free(mainLoop_); AUDIO_ERR_LOG("Get api from mainLoop failed"); @@ -259,6 +265,7 @@ pa_stream *PaAdapterManager::InitPaStream(AudioProcessConfig processConfig, uint AUDIO_DEBUG_LOG("Enter InitPaStream"); int32_t error = ERROR; if (CheckReturnIfinvalid(mainLoop_ && context_, ERR_ILLEGAL_STATE) < 0) { + AUDIO_ERR_LOG("CheckReturnIfinvalid failed"); return nullptr; } pa_threaded_mainloop_lock(mainLoop_); @@ -300,6 +307,13 @@ pa_stream *PaAdapterManager::InitPaStream(AudioProcessConfig processConfig, uint int32_t PaAdapterManager::SetPaProplist(pa_proplist *propList, pa_channel_map &map, AudioProcessConfig &processConfig, const std::string &streamName, uint32_t sessionId) { + bool isEffectNone = false; + StreamUsage mStreamUsage = processConfig.rendererInfo.streamUsage; + if (mStreamUsage == STREAM_USAGE_SYSTEM || mStreamUsage == STREAM_USAGE_DTMF || + mStreamUsage == STREAM_USAGE_ENFORCED_TONE || mStreamUsage == STREAM_USAGE_ULTRASONIC || + mStreamUsage == STREAM_USAGE_NAVIGATION || mStreamUsage == STREAM_USAGE_NOTIFICATION) { + isEffectNone = true; + } // for remote audio device router filter pa_proplist_sets(propList, "stream.sessionID", std::to_string(sessionId).c_str()); pa_proplist_sets(propList, "stream.client.uid", std::to_string(processConfig.appInfo.appUid).c_str()); @@ -308,6 +322,7 @@ int32_t PaAdapterManager::SetPaProplist(pa_proplist *propList, pa_channel_map &m pa_proplist_sets(propList, "media.name", streamName.c_str()); const std::string effectSceneName = GetEffectSceneName(processConfig.streamType); pa_proplist_sets(propList, "scene.type", effectSceneName.c_str()); + pa_proplist_sets(propList, "scene.mode", isEffectNone ? "EFFECT_NONE" : "EFFECT_DEFAULT"); float mVolumeFactor = 1.0f; float mPowerVolumeFactor = 1.0f; pa_proplist_sets(propList, "stream.volumeFactor", std::to_string(mVolumeFactor).c_str()); @@ -317,6 +332,8 @@ int32_t PaAdapterManager::SetPaProplist(pa_proplist *propList, pa_channel_map &m pa_proplist_sets(propList, "stream.startTime", streamStartTime.c_str()); if (processConfig.audioMode == AUDIO_MODE_PLAYBACK) { + pa_proplist_sets(propList, "stream.flush", "false"); + pa_proplist_sets(propList, "spatialization.enabled", "0"); AudioPrivacyType privacyType = PRIVACY_TYPE_PUBLIC; pa_proplist_sets(propList, "stream.privacyType", std::to_string(privacyType).c_str()); pa_proplist_sets(propList, "stream.usage", std::to_string(processConfig.rendererInfo.streamUsage).c_str()); @@ -352,9 +369,6 @@ std::shared_ptr PaAdapterManager::CreateRendererStream(AudioPro AUDIO_ERR_LOG("Create rendererStream Failed"); return nullptr; } - uint32_t streamIndex = pa_stream_get_index(paStream); - AUDIO_DEBUG_LOG("PaStream index is %{public}u", streamIndex); - rendererStreamMap_[streamIndex] = rendererStream; return rendererStream; } @@ -367,9 +381,6 @@ std::shared_ptr PaAdapterManager::CreateCapturerStream(AudioPro AUDIO_ERR_LOG("Create capturerStream Failed"); return nullptr; } - uint32_t streamIndex = pa_stream_get_index(paStream); - AUDIO_DEBUG_LOG("PaStream index is %{public}u", streamIndex); - capturerStreamMap_[streamIndex] = capturerStream; return capturerStream; } @@ -408,9 +419,11 @@ int32_t PaAdapterManager::ConnectStreamToPA(pa_stream *paStream, pa_sample_spec int32_t PaAdapterManager::ConnectRendererStreamToPA(pa_stream *paStream, pa_sample_spec sampleSpec) { - uint32_t tlength = 3; // 3 is tlength of playback + uint32_t tlength = 4; // 4 is tlength of playback uint32_t maxlength = 4; // 4 is max buffer length of playback uint32_t prebuf = 1; // 1 is prebuf of playback + + AUDIO_INFO_LOG("Create ipc playback stream tlength: %{public}u, maxlength: %{public}u", tlength, maxlength); pa_buffer_attr bufferAttr; bufferAttr.fragsize = static_cast(-1); bufferAttr.prebuf = pa_usec_to_bytes(BUF_LENGTH_IN_MSEC * PA_USEC_PER_MSEC * prebuf, &sampleSpec); @@ -435,7 +448,7 @@ int32_t PaAdapterManager::ConnectRendererStreamToPA(pa_stream *paStream, pa_samp int32_t PaAdapterManager::ConnectCapturerStreamToPA(pa_stream *paStream, pa_sample_spec sampleSpec) { uint32_t fragsize = 1; // 1 is frag size of recorder - uint32_t maxlength = 3; // 3 is max buffer length of recorder + uint32_t maxlength = 4; // 4 is max buffer length of recorder pa_buffer_attr bufferAttr; bufferAttr.maxlength = pa_usec_to_bytes(BUF_LENGTH_IN_MSEC * PA_USEC_PER_MSEC * maxlength, &sampleSpec); bufferAttr.fragsize = pa_usec_to_bytes(BUF_LENGTH_IN_MSEC * PA_USEC_PER_MSEC * fragsize, &sampleSpec); @@ -464,6 +477,7 @@ void PaAdapterManager::PAContextStateCb(pa_context *context, void *userdata) { pa_threaded_mainloop *mainLoop = (pa_threaded_mainloop *)userdata; AUDIO_INFO_LOG("Current Context State: %{public}d", pa_context_get_state(context)); + ScheduleReportData(getpid(), gettid(), "pulseaudio"); switch (pa_context_get_state(context)) { case PA_CONTEXT_READY: diff --git a/services/audio_service/server/src/pa_capturer_stream_impl.cpp b/services/audio_service/server/src/pa_capturer_stream_impl.cpp index 64e2d5e861..f32e62c5dc 100644 --- a/services/audio_service/server/src/pa_capturer_stream_impl.cpp +++ b/services/audio_service/server/src/pa_capturer_stream_impl.cpp @@ -44,6 +44,15 @@ PaCapturerStreamImpl::PaCapturerStreamImpl(pa_stream *paStream, AudioProcessConf InitParams(); } +PaCapturerStreamImpl::~PaCapturerStreamImpl() +{ + AUDIO_DEBUG_LOG("~PaCapturerStreamImpl"); + if (capturerServerDumpFile_) { + fclose(capturerServerDumpFile_); + capturerServerDumpFile_ = nullptr; + } +} + inline uint32_t PcmFormatToBits(uint8_t format) { switch (format) { @@ -295,36 +304,31 @@ BufferDesc PaCapturerStreamImpl::DequeueBuffer(size_t length) pa_stream_peek(paStream_, &tempBuffer, &bufferDesc.bufLength); bufferDesc.buffer = static_cast(const_cast(tempBuffer)); totalBytesRead_ += bufferDesc.bufLength; - AUDIO_INFO_LOG("PaCapturerStreamImpl::DequeueBuffer length %{public}zu", bufferDesc.bufLength); - fwrite(reinterpret_cast(bufferDesc.buffer), 1, bufferDesc.bufLength, capturerServerDumpFile_); + if (capturerServerDumpFile_ != nullptr) { + fwrite(reinterpret_cast(bufferDesc.buffer), 1, bufferDesc.bufLength, capturerServerDumpFile_); + } return bufferDesc; } int32_t PaCapturerStreamImpl::EnqueueBuffer(const BufferDesc &bufferDesc) { - AUDIO_INFO_LOG("Capturer enqueue buffer"); pa_stream_drop(paStream_); - AUDIO_INFO_LOG("After enqueue capturere buffer, readable size is %{public}zu", pa_stream_readable_size(paStream_)); + AUDIO_DEBUG_LOG("After enqueue capturere buffer, readable size is %{public}zu", pa_stream_readable_size(paStream_)); return SUCCESS; } int32_t PaCapturerStreamImpl::DropBuffer() { - AUDIO_INFO_LOG("Capturer DropBuffer"); pa_stream_drop(paStream_); - AUDIO_INFO_LOG("After capturere DropBuffer, readable size is %{public}zu", pa_stream_readable_size(paStream_)); + AUDIO_DEBUG_LOG("After capturere DropBuffer, readable size is %{public}zu", pa_stream_readable_size(paStream_)); return SUCCESS; } void PaCapturerStreamImpl::PAStreamReadCb(pa_stream *stream, size_t length, void *userdata) { - AUDIO_INFO_LOG("PAStreamReadCb, length size: %{public}zu, pa_stream_readable_size: %{public}zu", + AUDIO_DEBUG_LOG("PAStreamReadCb, length size: %{public}zu, pa_stream_readable_size: %{public}zu", length, pa_stream_readable_size(stream)); - const pa_buffer_attr *bufferAttr = pa_stream_get_buffer_attr(stream); - AUDIO_INFO_LOG("Buffer attr: maxlength %{public}d, tlength %{public}d, prebuf %{public}d, minreq %{public}d," - "fragsize %{public}d", bufferAttr->maxlength, bufferAttr->tlength, bufferAttr->prebuf, - bufferAttr->minreq, bufferAttr->fragsize); if (!userdata) { AUDIO_ERR_LOG("PAStreamReadCb: userdata is null"); return; diff --git a/services/audio_service/server/src/pa_renderer_stream_impl.cpp b/services/audio_service/server/src/pa_renderer_stream_impl.cpp index 1a29018c56..54fc8c6316 100644 --- a/services/audio_service/server/src/pa_renderer_stream_impl.cpp +++ b/services/audio_service/server/src/pa_renderer_stream_impl.cpp @@ -16,6 +16,7 @@ #include "pa_renderer_stream_impl.h" #include "audio_errors.h" #include "audio_log.h" +#include "audio_utils.h" namespace OHOS { namespace AudioStandard { @@ -195,14 +196,9 @@ int32_t PaRendererStreamImpl::Stop() return ERR_ILLEGAL_STATE; } - streamDrainStatus_ = 0; - isDrain_ = true; - pa_operation *operation = pa_stream_drain(paStream_, PAStreamDrainInStopCb, (void *)this); - if (operation == nullptr) { - AUDIO_ERR_LOG("pa_stream_drain operation is null"); - return ERR_OPERATION_FAILED; - } - + pa_operation *operation = pa_stream_cork(paStream_, 1, PaRendererStreamImpl::PAStreamAsyncStopSuccessCb, + (void *)this); + CHECK_AND_RETURN_RET_LOG(operation != nullptr, ERR_OPERATION_FAILED, "pa_stream_cork operation is null"); pa_operation_unref(operation); return SUCCESS; } @@ -471,6 +467,8 @@ BufferDesc PaRendererStreamImpl::DequeueBuffer(size_t length) int32_t PaRendererStreamImpl::EnqueueBuffer(const BufferDesc &bufferDesc) { + Trace trace("PaRendererStreamImpl::EnqueueBuffer " + std::to_string(bufferDesc.bufLength) + " totalBytesWritten" + + std::to_string(totalBytesWritten_)); pa_threaded_mainloop_lock(mainloop_); int32_t error = 0; error = pa_stream_write(paStream_, static_cast(bufferDesc.buffer), bufferDesc.bufLength, nullptr, @@ -486,8 +484,7 @@ int32_t PaRendererStreamImpl::EnqueueBuffer(const BufferDesc &bufferDesc) void PaRendererStreamImpl::PAStreamWriteCb(pa_stream *stream, size_t length, void *userdata) { - AUDIO_INFO_LOG("PAStreamWriteCb, length: %{public}zu, pa_stream_writeable_size: %{public}zu", - length, pa_stream_writable_size(stream)); + Trace trace("PaRendererStreamImpl::PAStreamWriteCb" + std::to_string(length)); CHECK_AND_RETURN_LOG(userdata, "PAStreamWriteCb: userdata is null"); auto streamImpl = static_cast(userdata); @@ -520,6 +517,7 @@ void PaRendererStreamImpl::PAStreamMovedCb(pa_stream *stream, void *userdata) void PaRendererStreamImpl::PAStreamUnderFlowCb(pa_stream *stream, void *userdata) { + Trace trace("PaRendererStreamImpl::PAStreamUnderFlowCb"); CHECK_AND_RETURN_LOG(userdata, "PAStreamUnderFlowCb: userdata is null"); PaRendererStreamImpl *streamImpl = static_cast(userdata); @@ -536,6 +534,7 @@ void PaRendererStreamImpl::PAStreamSetStartedCb(pa_stream *stream, void *userdat { CHECK_AND_RETURN_LOG(userdata, "PAStreamSetStartedCb: userdata is null"); AUDIO_WARNING_LOG("PAStreamSetStartedCb"); + Trace trace("PaRendererStreamImpl::PAStreamSetStartedCb"); } void PaRendererStreamImpl::PAStreamStartSuccessCb(pa_stream *stream, int32_t success, void *userdata) @@ -614,8 +613,6 @@ void PaRendererStreamImpl::PAStreamAsyncStopSuccessCb(pa_stream *stream, int32_t if (statusCallback != nullptr) { statusCallback->OnStatusUpdate(OPERATION_STOPPED); } - streamImpl->streamCmdStatus_ = success; - streamImpl->isDrain_ = false; } int32_t PaRendererStreamImpl::GetMinimumBufferSize(size_t &minBufferSize) const diff --git a/services/audio_service/server/src/renderer_in_server.cpp b/services/audio_service/server/src/renderer_in_server.cpp index da6c3acfbe..600bcd52e3 100644 --- a/services/audio_service/server/src/renderer_in_server.cpp +++ b/services/audio_service/server/src/renderer_in_server.cpp @@ -18,6 +18,7 @@ #include "securec.h" #include "audio_errors.h" #include "audio_log.h" +#include "audio_utils.h" #include "i_stream_manager.h" namespace OHOS { @@ -29,12 +30,7 @@ namespace { RendererInServer::RendererInServer(AudioProcessConfig processConfig, std::weak_ptr streamListener) { processConfig_ = processConfig; - streamListener_ = streamListener; // LYH wating for review - - int32_t ret = IStreamManager::GetPlaybackManager().CreateRender(processConfig_, stream_); - AUDIO_INFO_LOG("Construct rendererInServer result: %{public}d", ret); - streamIndex_ = stream_->GetStreamIndex(); - ConfigServerBuffer(); + streamListener_ = streamListener; } RendererInServer::~RendererInServer() @@ -108,12 +104,18 @@ int32_t RendererInServer::InitBufferStatus() return SUCCESS; } -void RendererInServer::Init() +int32_t RendererInServer::Init() { - AUDIO_INFO_LOG("Init, register status and write callback"); - CHECK_AND_RETURN_LOG(stream_ != nullptr, "Renderer stream is nullptr"); + int32_t ret = IStreamManager::GetPlaybackManager().CreateRender(processConfig_, stream_); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS && stream_ != nullptr, ERR_OPERATION_FAILED, + "Construct rendererInServer failed: %{public}d", ret); + streamIndex_ = stream_->GetStreamIndex(); + ret = ConfigServerBuffer(); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_OPERATION_FAILED, + "Construct rendererInServer failed: %{public}d", ret); stream_->RegisterStatusCallback(shared_from_this()); stream_->RegisterWriteCallback(shared_from_this()); + return SUCCESS; } void RendererInServer::OnStatusUpdate(IOperation operation) @@ -192,20 +194,25 @@ void RendererInServer::WriteData() { uint64_t currentReadFrame = audioServerBuffer_->GetCurReadFrame(); uint64_t currentWriteFrame = audioServerBuffer_->GetCurWriteFrame(); + Trace::Count("RendererInServer::WriteData", (currentWriteFrame - currentReadFrame) / spanSizeInFrame_); + Trace trace1("RendererInServer::WriteData"); if (currentReadFrame + spanSizeInFrame_ > currentWriteFrame) { AUDIO_INFO_LOG("Underrun!!!"); + Trace trace2("RendererInServer::Underrun"); + std::shared_ptr stateListener = streamListener_.lock(); + CHECK_AND_RETURN_LOG(stateListener != nullptr, "IStreamListener is nullptr"); + stateListener->OnOperationHandled(UPDATE_STREAM, currentReadFrame); return; } BufferDesc bufferDesc = {nullptr, totalSizeInFrame_, totalSizeInFrame_}; if (audioServerBuffer_->GetReadbuffer(currentReadFrame, bufferDesc) == SUCCESS) { - AUDIO_INFO_LOG("Buffer length: %{public}zu", bufferDesc.bufLength); stream_->EnqueueBuffer(bufferDesc); uint64_t nextReadFrame = currentReadFrame + spanSizeInFrame_; - AUDIO_INFO_LOG("CurrentReadFrame: %{public}" PRIu64 ", nextReadFrame:%{public}" PRIu64 "", currentReadFrame, - nextReadFrame); audioServerBuffer_->SetCurReadFrame(nextReadFrame); memset_s(bufferDesc.buffer, bufferDesc.bufLength, 0, bufferDesc.bufLength); // clear is needed for reuse. + } else { + Trace trace3("RendererInServer::WriteData GetReadbuffer failed"); } std::shared_ptr stateListener = streamListener_.lock(); CHECK_AND_RETURN_LOG(stateListener != nullptr, "IStreamListener is nullptr"); @@ -214,6 +221,7 @@ void RendererInServer::WriteData() void RendererInServer::WriteEmptyData() { + Trace trace("RendererInServer::WriteEmptyData"); AUDIO_WARNING_LOG("Underrun, write empty data"); BufferDesc bufferDesc = stream_->DequeueBuffer(totalSizeInFrame_); memset_s(bufferDesc.buffer, bufferDesc.bufLength, 0, bufferDesc.bufLength); @@ -223,7 +231,7 @@ void RendererInServer::WriteEmptyData() int32_t RendererInServer::OnWriteData(size_t length) { - AUDIO_INFO_LOG("RendererInServer::OnWriteData"); + Trace trace("RendererInServer::OnWriteData length " + std::to_string(length)); for (int32_t i = 0; i < length / totalSizeInFrame_; i++) { WriteData(); } @@ -232,9 +240,7 @@ int32_t RendererInServer::OnWriteData(size_t length) int32_t RendererInServer::UpdateWriteIndex() { - AUDIO_INFO_LOG("UpdateWriteIndex: audioServerBuffer_->GetAvailableDataFrames(): %{public}d, " - "spanSizeInFrame_:%{public}zu, needStart: %{public}d", audioServerBuffer_->GetAvailableDataFrames(), - spanSizeInFrame_, needStart); + Trace trace("RendererInServer::UpdateWriteIndex"); if (audioServerBuffer_->GetAvailableDataFrames() == spanSizeInFrame_ && needStart < 3) { // 3 is maxlength - 1 AUDIO_WARNING_LOG("Start write data"); WriteData(); @@ -378,19 +384,18 @@ int32_t RendererInServer::Release() { { std::unique_lock lock(statusLock_); - CHECK_AND_RETURN_RET_LOG(status_ != I_STATUS_RELEASED && status_ != I_STATUS_IDLE, false, - "Illegal state: %{public}d", status_); - status_ = I_STATUS_RELEASED; + if (status_ == I_STATUS_RELEASED) { + AUDIO_INFO_LOG("Already released"); + return SUCCESS; + } } int32_t ret = IStreamManager::GetPlaybackManager().ReleaseRender(streamIndex_); - - stream_ = nullptr; if (ret < 0) { AUDIO_ERR_LOG("Release stream failed, reason: %{public}d", ret); status_ = I_STATUS_INVALID; return ret; } - + status_ = I_STATUS_RELEASED; return SUCCESS; } -- Gitee