mirror of
https://gitee.com/openharmony/multimedia_audio_standard
synced 2024-12-02 17:56:18 +00:00
Support DFX for audio subsystem
Signed-off-by: Sulav Mulmi <sulav.mulmi@huawei.com>
This commit is contained in:
parent
3289ca681c
commit
e3692b686e
@ -17,6 +17,7 @@
|
|||||||
"adapted_system_type": [ "standard" ],
|
"adapted_system_type": [ "standard" ],
|
||||||
"rom": "",
|
"rom": "",
|
||||||
"ram": "",
|
"ram": "",
|
||||||
|
"hisysevent_config": [ "//foundation/multimedia/audio_standard/hisysevent.yaml" ],
|
||||||
"deps": {
|
"deps": {
|
||||||
"components": [
|
"components": [
|
||||||
"ability_manager",
|
"ability_manager",
|
||||||
|
@ -39,7 +39,10 @@ ohos_shared_library("pulse_audio_service_adapter") {
|
|||||||
"//utils/native/base:utils",
|
"//utils/native/base:utils",
|
||||||
]
|
]
|
||||||
|
|
||||||
external_deps = [ "hiviewdfx_hilog_native:libhilog" ]
|
external_deps = [
|
||||||
|
"hisysevent_native:libhisysevent",
|
||||||
|
"hiviewdfx_hilog_native:libhilog",
|
||||||
|
]
|
||||||
part_name = "multimedia_audio_standard"
|
part_name = "multimedia_audio_standard"
|
||||||
subsystem_name = "multimedia"
|
subsystem_name = "multimedia"
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "audio_info.h"
|
#include "audio_info.h"
|
||||||
|
|
||||||
@ -140,6 +141,20 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual bool IsStreamActive(AudioStreamType streamType);
|
virtual bool IsStreamActive(AudioStreamType streamType);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief returns the list of all sink inputs
|
||||||
|
*
|
||||||
|
* @return Returns : List of all sink inputs
|
||||||
|
*/
|
||||||
|
virtual std::vector<SinkInput> GetAllSinkInputs() = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief returns the list of all source outputs
|
||||||
|
*
|
||||||
|
* @return Returns : List of all source outputs
|
||||||
|
*/
|
||||||
|
virtual std::vector<SourceOutput> GetAllSourceOutputs() = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Disconnects the connected audio server
|
* @brief Disconnects the connected audio server
|
||||||
*
|
*
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
#include <pulse/pulseaudio.h>
|
#include <pulse/pulseaudio.h>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "audio_service_adapter.h"
|
#include "audio_service_adapter.h"
|
||||||
|
|
||||||
@ -39,6 +40,8 @@ public:
|
|||||||
int32_t SuspendAudioDevice(std::string &audioPortName, bool isSuspend) override;
|
int32_t SuspendAudioDevice(std::string &audioPortName, bool isSuspend) override;
|
||||||
bool IsMute(AudioStreamType streamType) override;
|
bool IsMute(AudioStreamType streamType) override;
|
||||||
bool IsStreamActive(AudioStreamType streamType) override;
|
bool IsStreamActive(AudioStreamType streamType) override;
|
||||||
|
std::vector<SinkInput> GetAllSinkInputs() override;
|
||||||
|
std::vector<SourceOutput> GetAllSourceOutputs() override;
|
||||||
void Disconnect() override;
|
void Disconnect() override;
|
||||||
|
|
||||||
// Static Member functions
|
// Static Member functions
|
||||||
@ -49,6 +52,8 @@ public:
|
|||||||
static void PaGetSinkInputInfoMuteCb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata);
|
static void PaGetSinkInputInfoMuteCb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata);
|
||||||
static void PaGetSinkInputInfoMuteStatusCb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata);
|
static void PaGetSinkInputInfoMuteStatusCb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata);
|
||||||
static void PaGetSinkInputInfoCorkStatusCb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata);
|
static void PaGetSinkInputInfoCorkStatusCb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata);
|
||||||
|
static void PaGetAllSinkInputsCb(pa_context *c, const pa_sink_input_info *i, int eol, void *userdata);
|
||||||
|
static void PaGetAllSourceOutputsCb(pa_context *c, const pa_source_output_info *i, int eol, void *userdata);
|
||||||
private:
|
private:
|
||||||
struct UserData {
|
struct UserData {
|
||||||
PulseAudioServiceAdapterImpl *thiz;
|
PulseAudioServiceAdapterImpl *thiz;
|
||||||
@ -57,6 +62,8 @@ private:
|
|||||||
bool mute;
|
bool mute;
|
||||||
bool isCorked;
|
bool isCorked;
|
||||||
uint32_t idx;
|
uint32_t idx;
|
||||||
|
std::vector<SinkInput> sinkInputList;
|
||||||
|
std::vector<SourceOutput> sourceOutputList;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool ConnectToPulseAudio();
|
bool ConnectToPulseAudio();
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
#include "audio_errors.h"
|
#include "audio_errors.h"
|
||||||
#include "audio_log.h"
|
#include "audio_log.h"
|
||||||
|
#include "hisysevent.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
@ -362,6 +363,70 @@ bool PulseAudioServiceAdapterImpl::IsStreamActive(AudioStreamType streamType)
|
|||||||
return (userData->isCorked) ? false : true;
|
return (userData->isCorked) ? false : true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vector<SinkInput> PulseAudioServiceAdapterImpl::GetAllSinkInputs()
|
||||||
|
{
|
||||||
|
lock_guard<mutex> lock(mMutex);
|
||||||
|
|
||||||
|
unique_ptr<UserData> userData = make_unique<UserData>();
|
||||||
|
userData->thiz = this;
|
||||||
|
|
||||||
|
if (mContext == nullptr) {
|
||||||
|
AUDIO_ERR_LOG("[PulseAudioServiceAdapterImpl] GetAllSinkInputs mContext is nullptr");
|
||||||
|
return userData->sinkInputList;
|
||||||
|
}
|
||||||
|
|
||||||
|
pa_threaded_mainloop_lock(mMainLoop);
|
||||||
|
|
||||||
|
pa_operation *operation = pa_context_get_sink_input_info_list(mContext,
|
||||||
|
PulseAudioServiceAdapterImpl::PaGetAllSinkInputsCb, reinterpret_cast<void*>(userData.get()));
|
||||||
|
if (operation == nullptr) {
|
||||||
|
AUDIO_ERR_LOG("[GetAllSinkInputs] pa_context_get_sink_input_info_list returned nullptr");
|
||||||
|
pa_threaded_mainloop_unlock(mMainLoop);
|
||||||
|
return userData->sinkInputList;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (pa_operation_get_state(operation) == PA_OPERATION_RUNNING) {
|
||||||
|
pa_threaded_mainloop_wait(mMainLoop);
|
||||||
|
}
|
||||||
|
|
||||||
|
pa_operation_unref(operation);
|
||||||
|
pa_threaded_mainloop_unlock(mMainLoop);
|
||||||
|
|
||||||
|
return userData->sinkInputList;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<SourceOutput> PulseAudioServiceAdapterImpl::GetAllSourceOutputs()
|
||||||
|
{
|
||||||
|
lock_guard<mutex> lock(mMutex);
|
||||||
|
|
||||||
|
unique_ptr<UserData> userData = make_unique<UserData>();
|
||||||
|
userData->thiz = this;
|
||||||
|
|
||||||
|
if (mContext == nullptr) {
|
||||||
|
AUDIO_ERR_LOG("[PulseAudioServiceAdapterImpl] GetAllSourceOutputs mContext is nullptr");
|
||||||
|
return userData->sourceOutputList;
|
||||||
|
}
|
||||||
|
|
||||||
|
pa_threaded_mainloop_lock(mMainLoop);
|
||||||
|
|
||||||
|
pa_operation *operation = pa_context_get_source_output_info_list(mContext,
|
||||||
|
PulseAudioServiceAdapterImpl::PaGetAllSourceOutputsCb, reinterpret_cast<void*>(userData.get()));
|
||||||
|
if (operation == nullptr) {
|
||||||
|
AUDIO_ERR_LOG("[GetAllSourceOutputs] pa_context_get_source_output_info_list returned nullptr");
|
||||||
|
pa_threaded_mainloop_unlock(mMainLoop);
|
||||||
|
return userData->sourceOutputList;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (pa_operation_get_state(operation) == PA_OPERATION_RUNNING) {
|
||||||
|
pa_threaded_mainloop_wait(mMainLoop);
|
||||||
|
}
|
||||||
|
|
||||||
|
pa_operation_unref(operation);
|
||||||
|
pa_threaded_mainloop_unlock(mMainLoop);
|
||||||
|
|
||||||
|
return userData->sourceOutputList;
|
||||||
|
}
|
||||||
|
|
||||||
void PulseAudioServiceAdapterImpl::Disconnect()
|
void PulseAudioServiceAdapterImpl::Disconnect()
|
||||||
{
|
{
|
||||||
if (mContext != nullptr) {
|
if (mContext != nullptr) {
|
||||||
@ -613,6 +678,8 @@ void PulseAudioServiceAdapterImpl::PaGetSinkInputInfoVolumeCb(pa_context *c, con
|
|||||||
}
|
}
|
||||||
AUDIO_INFO_LOG("[PulseAudioServiceAdapterImpl]volume : %{public}f for stream : %{public}s, volumeInt%{public}d",
|
AUDIO_INFO_LOG("[PulseAudioServiceAdapterImpl]volume : %{public}f for stream : %{public}s, volumeInt%{public}d",
|
||||||
vol, i->name, volume);
|
vol, i->name, volume);
|
||||||
|
HiviewDFX::HiSysEvent::Write("AUDIO", "AUDIO_VOLUME_CHANGE", HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
|
||||||
|
"ISOUTPUT", 1, "STREAMID", sessionID, "STREAMTYPE", streamID, "VOLUME", vol);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PulseAudioServiceAdapterImpl::PaGetSinkInputInfoCorkStatusCb(pa_context *c, const pa_sink_input_info *i, int eol,
|
void PulseAudioServiceAdapterImpl::PaGetSinkInputInfoCorkStatusCb(pa_context *c, const pa_sink_input_info *i, int eol,
|
||||||
@ -651,6 +718,86 @@ void PulseAudioServiceAdapterImpl::PaGetSinkInputInfoCorkStatusCb(pa_context *c,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PulseAudioServiceAdapterImpl::PaGetAllSinkInputsCb(pa_context *c, const pa_sink_input_info *i, int eol,
|
||||||
|
void *userdata)
|
||||||
|
{
|
||||||
|
UserData *userData = reinterpret_cast<UserData *>(userdata);
|
||||||
|
PulseAudioServiceAdapterImpl *thiz = userData->thiz;
|
||||||
|
|
||||||
|
if (eol < 0) {
|
||||||
|
AUDIO_ERR_LOG("[PulseAudioServiceAdapterImpl] Failed to get sink input information: %{public}s",
|
||||||
|
pa_strerror(pa_context_errno(c)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (eol) {
|
||||||
|
pa_threaded_mainloop_signal(thiz->mMainLoop, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i->proplist == nullptr) {
|
||||||
|
AUDIO_ERR_LOG("[PulseAudioServiceAdapterImpl] Invalid Proplist for sink input (%{public}d).", i->index);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t sessionID = 0;
|
||||||
|
const char *sessionCStr = pa_proplist_gets(i->proplist, "stream.sessionID");
|
||||||
|
if (sessionCStr != nullptr) {
|
||||||
|
std::stringstream sessionStr;
|
||||||
|
sessionStr << sessionCStr;
|
||||||
|
sessionStr >> sessionID;
|
||||||
|
}
|
||||||
|
|
||||||
|
AudioStreamType audioStreamType = STREAM_DEFAULT;
|
||||||
|
const char *streamType = pa_proplist_gets(i->proplist, "stream.type");
|
||||||
|
if (streamType != nullptr) {
|
||||||
|
audioStreamType = thiz->GetIdByStreamType(streamType);
|
||||||
|
}
|
||||||
|
|
||||||
|
SinkInput sinkInput = {sessionID, audioStreamType};
|
||||||
|
userData->sinkInputList.push_back(sinkInput);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PulseAudioServiceAdapterImpl::PaGetAllSourceOutputsCb(pa_context *c, const pa_source_output_info *i, int eol,
|
||||||
|
void *userdata)
|
||||||
|
{
|
||||||
|
UserData *userData = reinterpret_cast<UserData *>(userdata);
|
||||||
|
PulseAudioServiceAdapterImpl *thiz = userData->thiz;
|
||||||
|
|
||||||
|
if (eol < 0) {
|
||||||
|
AUDIO_ERR_LOG("[PulseAudioServiceAdapterImpl] Failed to get source output information: %{public}s",
|
||||||
|
pa_strerror(pa_context_errno(c)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (eol) {
|
||||||
|
pa_threaded_mainloop_signal(thiz->mMainLoop, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i->proplist == nullptr) {
|
||||||
|
AUDIO_ERR_LOG("[PulseAudioServiceAdapterImpl] Invalid Proplist for source output (%{public}d).", i->index);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t sessionID = 0;
|
||||||
|
const char *sessionCStr = pa_proplist_gets(i->proplist, "stream.sessionID");
|
||||||
|
if (sessionCStr != nullptr) {
|
||||||
|
std::stringstream sessionStr;
|
||||||
|
sessionStr << sessionCStr;
|
||||||
|
sessionStr >> sessionID;
|
||||||
|
}
|
||||||
|
|
||||||
|
AudioStreamType audioStreamType = STREAM_DEFAULT;
|
||||||
|
const char *streamType = pa_proplist_gets(i->proplist, "stream.type");
|
||||||
|
if (streamType != nullptr) {
|
||||||
|
audioStreamType = thiz->GetIdByStreamType(streamType);
|
||||||
|
}
|
||||||
|
|
||||||
|
SourceOutput sourceOutput = {sessionID, audioStreamType};
|
||||||
|
userData->sourceOutputList.push_back(sourceOutput);
|
||||||
|
}
|
||||||
|
|
||||||
void PulseAudioServiceAdapterImpl::PaSubscribeCb(pa_context *c, pa_subscription_event_type_t t, uint32_t idx,
|
void PulseAudioServiceAdapterImpl::PaSubscribeCb(pa_context *c, pa_subscription_event_type_t t, uint32_t idx,
|
||||||
void *userdata)
|
void *userdata)
|
||||||
{
|
{
|
||||||
|
@ -66,6 +66,7 @@ public:
|
|||||||
int32_t GetMute(bool &isMute);
|
int32_t GetMute(bool &isMute);
|
||||||
int32_t SetAudioScene(AudioScene audioScene);
|
int32_t SetAudioScene(AudioScene audioScene);
|
||||||
int32_t OpenInput(DeviceType deviceType);
|
int32_t OpenInput(DeviceType deviceType);
|
||||||
|
uint64_t GetTransactionId();
|
||||||
|
|
||||||
static AudioCapturerSource *GetInstance(void);
|
static AudioCapturerSource *GetInstance(void);
|
||||||
bool capturerInited_;
|
bool capturerInited_;
|
||||||
|
@ -459,6 +459,12 @@ int32_t AudioCapturerSource::SetAudioScene(AudioScene audioScene)
|
|||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t AudioCapturerSource::GetTransactionId()
|
||||||
|
{
|
||||||
|
AUDIO_INFO_LOG("AudioCapturerSource::GetTransactionId in");
|
||||||
|
return reinterpret_cast<uint64_t>(audioCapture_);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t AudioCapturerSource::Stop(void)
|
int32_t AudioCapturerSource::Stop(void)
|
||||||
{
|
{
|
||||||
int32_t ret;
|
int32_t ret;
|
||||||
|
@ -51,6 +51,7 @@ public:
|
|||||||
int32_t GetLatency(uint32_t *latency);
|
int32_t GetLatency(uint32_t *latency);
|
||||||
int32_t SetAudioScene(AudioScene audioScene);
|
int32_t SetAudioScene(AudioScene audioScene);
|
||||||
int32_t OpenOutput(DeviceType deviceType);
|
int32_t OpenOutput(DeviceType deviceType);
|
||||||
|
uint64_t GetTransactionId();
|
||||||
static AudioRendererSink *GetInstance(void);
|
static AudioRendererSink *GetInstance(void);
|
||||||
bool rendererInited_;
|
bool rendererInited_;
|
||||||
private:
|
private:
|
||||||
|
@ -46,6 +46,7 @@ public:
|
|||||||
int32_t SetVolume(float left, float right);
|
int32_t SetVolume(float left, float right);
|
||||||
int32_t GetVolume(float &left, float &right);
|
int32_t GetVolume(float &left, float &right);
|
||||||
int32_t GetLatency(uint32_t *latency);
|
int32_t GetLatency(uint32_t *latency);
|
||||||
|
uint64_t GetTransactionId();
|
||||||
static BluetoothRendererSink *GetInstance(void);
|
static BluetoothRendererSink *GetInstance(void);
|
||||||
bool rendererInited_;
|
bool rendererInited_;
|
||||||
private:
|
private:
|
||||||
|
@ -474,6 +474,12 @@ int32_t AudioRendererSink::SetAudioScene(AudioScene audioScene)
|
|||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t AudioRendererSink::GetTransactionId()
|
||||||
|
{
|
||||||
|
AUDIO_INFO_LOG("AudioRendererSink::GetTransactionId in");
|
||||||
|
return reinterpret_cast<uint64_t>(audioRender_);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t AudioRendererSink::Stop(void)
|
int32_t AudioRendererSink::Stop(void)
|
||||||
{
|
{
|
||||||
int32_t ret;
|
int32_t ret;
|
||||||
|
@ -392,6 +392,12 @@ int32_t BluetoothRendererSink::GetLatency(uint32_t *latency)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t BluetoothRendererSink::GetTransactionId()
|
||||||
|
{
|
||||||
|
AUDIO_INFO_LOG("BluetoothRendererSink::GetTransactionId in");
|
||||||
|
return reinterpret_cast<uint64_t>(audioRender_);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t BluetoothRendererSink::Stop(void)
|
int32_t BluetoothRendererSink::Stop(void)
|
||||||
{
|
{
|
||||||
AUDIO_INFO_LOG("BluetoothRendererSink::Stop in");
|
AUDIO_INFO_LOG("BluetoothRendererSink::Stop in");
|
||||||
|
45
hisysevent.yaml
Normal file
45
hisysevent.yaml
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
# Copyright (c) 2022 Huawei Device Co., Ltd.
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
domain: AUDIO
|
||||||
|
|
||||||
|
AUDIO_DEVICE_CHANGE:
|
||||||
|
__BASE: {type: BEHAVIOR, level: MINOR, desc: audio output device}
|
||||||
|
ISOUTPUT: {type: INT32, desc: is output device}
|
||||||
|
STREAMID: {type: INT32, desc: stream id}
|
||||||
|
STREAMTYPE: {type: INT32, desc: stream type}
|
||||||
|
DEVICETYPE: {type: INT32, desc: device type}
|
||||||
|
|
||||||
|
AUDIO_VOLUME_CHANGE:
|
||||||
|
__BASE: {type: BEHAVIOR, level: MINOR, desc: audio input device}
|
||||||
|
ISOUTPUT: {type: INT32, desc: output device}
|
||||||
|
STREAMID: {type: INT32, desc: stream id}
|
||||||
|
STREAMTYPE: {type: INT32, desc: stream type}
|
||||||
|
VOLUME: {type: FLOAT, desc: audio volume}
|
||||||
|
|
||||||
|
AUDIO_STREAM_CHANGE:
|
||||||
|
__BASE: {type: BEHAVIOR, level: MINOR, desc: capturer state change}
|
||||||
|
ISOUTPUT: {type: INT32, desc: output device}
|
||||||
|
STREAMID: {type: INT32, desc: stream id}
|
||||||
|
UID: {type: INT32, desc: user id}
|
||||||
|
PID: {type: INT32, desc: process id}
|
||||||
|
TRANSACTIONID: {type: UINT64, desc: transaction id}
|
||||||
|
STREAMTYPE: {type: INT32, desc: stream type}
|
||||||
|
STATE: {type: INT32, desc: audio state}
|
||||||
|
DEVICETYPE: {type: INT32, desc: device type}
|
||||||
|
|
||||||
|
AUDIO_HEADSET_CHANGE:
|
||||||
|
__BASE: {type: BEHAVIOR, level: MINOR, desc: headset connection state}
|
||||||
|
ISCONNECT: {type: INT32, desc: is plugged in}
|
||||||
|
HASMIC: {type: INT32, desc: mic available}
|
||||||
|
DEVICETYPE: {type: INT32, desc: device type}
|
@ -560,6 +560,16 @@ enum AudioCaptureMode {
|
|||||||
CAPTURE_MODE_CALLBACK
|
CAPTURE_MODE_CALLBACK
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct SinkInput {
|
||||||
|
int32_t streamId;
|
||||||
|
AudioStreamType streamType;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SourceOutput {
|
||||||
|
int32_t streamId;
|
||||||
|
AudioStreamType streamType;
|
||||||
|
};
|
||||||
|
|
||||||
typedef uint32_t AudioIOHandle;
|
typedef uint32_t AudioIOHandle;
|
||||||
|
|
||||||
static inline bool FLOAT_COMPARE_EQ(const float& x, const float& y)
|
static inline bool FLOAT_COMPARE_EQ(const float& x, const float& y)
|
||||||
|
@ -82,6 +82,7 @@ ohos_shared_library("audio_client") {
|
|||||||
]
|
]
|
||||||
|
|
||||||
external_deps = [
|
external_deps = [
|
||||||
|
"hisysevent_native:libhisysevent",
|
||||||
"hiviewdfx_hilog_native:libhilog",
|
"hiviewdfx_hilog_native:libhilog",
|
||||||
"ipc:ipc_core",
|
"ipc:ipc_core",
|
||||||
"samgr_standard:samgr_proxy",
|
"samgr_standard:samgr_proxy",
|
||||||
|
@ -201,6 +201,7 @@ public:
|
|||||||
const std::string GetAudioParameter(const std::string key);
|
const std::string GetAudioParameter(const std::string key);
|
||||||
void SetAudioParameter(const std::string &key, const std::string &value);
|
void SetAudioParameter(const std::string &key, const std::string &value);
|
||||||
const char *RetrieveCookie(int32_t &size);
|
const char *RetrieveCookie(int32_t &size);
|
||||||
|
uint64_t GetTransactionId(DeviceType deviceType, DeviceRole deviceRole);
|
||||||
int32_t SetDeviceActive(ActiveDeviceType deviceType, bool flag) const;
|
int32_t SetDeviceActive(ActiveDeviceType deviceType, bool flag) const;
|
||||||
bool IsDeviceActive(ActiveDeviceType deviceType) const;
|
bool IsDeviceActive(ActiveDeviceType deviceType) const;
|
||||||
bool IsStreamActive(AudioSystemManager::AudioVolumeType volumeType) const;
|
bool IsStreamActive(AudioSystemManager::AudioVolumeType volumeType) const;
|
||||||
|
@ -202,6 +202,7 @@ ohos_shared_library("audio_policy_service") {
|
|||||||
|
|
||||||
external_deps = [
|
external_deps = [
|
||||||
"access_token:libaccesstoken_sdk",
|
"access_token:libaccesstoken_sdk",
|
||||||
|
"hisysevent_native:libhisysevent",
|
||||||
"hiviewdfx_hilog_native:libhilog",
|
"hiviewdfx_hilog_native:libhilog",
|
||||||
"input:libmmi-client",
|
"input:libmmi-client",
|
||||||
"ipc:ipc_core",
|
"ipc:ipc_core",
|
||||||
|
@ -102,6 +102,16 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual const char *RetrieveCookie(int32_t &size) = 0;
|
virtual const char *RetrieveCookie(int32_t &size) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the transaction Id
|
||||||
|
*
|
||||||
|
* @return Returns transaction id.
|
||||||
|
*/
|
||||||
|
virtual uint64_t GetTransactionId(DeviceType deviceType, DeviceRole deviceRole)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
GET_MAX_VOLUME = 0,
|
GET_MAX_VOLUME = 0,
|
||||||
GET_MIN_VOLUME = 1,
|
GET_MIN_VOLUME = 1,
|
||||||
@ -112,7 +122,8 @@ public:
|
|||||||
IS_MICROPHONE_MUTE = 6,
|
IS_MICROPHONE_MUTE = 6,
|
||||||
SET_AUDIO_SCENE = 7,
|
SET_AUDIO_SCENE = 7,
|
||||||
UPDATE_ROUTE_REQ = 8,
|
UPDATE_ROUTE_REQ = 8,
|
||||||
RETRIEVE_COOKIE = 9
|
RETRIEVE_COOKIE = 9,
|
||||||
|
GET_TRANSACTION_ID = 10
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -131,6 +131,8 @@ private:
|
|||||||
|
|
||||||
void TriggerDeviceChangedCallback(const std::vector<sptr<AudioDeviceDescriptor>> &devChangeDesc, bool connection);
|
void TriggerDeviceChangedCallback(const std::vector<sptr<AudioDeviceDescriptor>> &devChangeDesc, bool connection);
|
||||||
|
|
||||||
|
void WriteDeviceChangedSysEvents(const std::vector<sptr<AudioDeviceDescriptor>> &desc, bool isConnected);
|
||||||
|
|
||||||
bool GetActiveDeviceStreamInfo(DeviceType deviceType, AudioStreamInfo &streamInfo);
|
bool GetActiveDeviceStreamInfo(DeviceType deviceType, AudioStreamInfo &streamInfo);
|
||||||
|
|
||||||
bool IsConfigurationUpdated(DeviceType deviceType, const AudioStreamInfo &streamInfo);
|
bool IsConfigurationUpdated(DeviceType deviceType, const AudioStreamInfo &streamInfo);
|
||||||
|
@ -47,6 +47,10 @@ public:
|
|||||||
|
|
||||||
virtual bool IsStreamActive(AudioStreamType streamType) = 0;
|
virtual bool IsStreamActive(AudioStreamType streamType) = 0;
|
||||||
|
|
||||||
|
virtual std::vector<SinkInput> GetAllSinkInputs() = 0;
|
||||||
|
|
||||||
|
virtual std::vector<SourceOutput> GetAllSourceOutputs() = 0;
|
||||||
|
|
||||||
virtual AudioIOHandle OpenAudioPort(const AudioModuleInfo &audioPortInfo) = 0;
|
virtual AudioIOHandle OpenAudioPort(const AudioModuleInfo &audioPortInfo) = 0;
|
||||||
|
|
||||||
virtual int32_t CloseAudioPort(AudioIOHandle ioHandle) = 0;
|
virtual int32_t CloseAudioPort(AudioIOHandle ioHandle) = 0;
|
||||||
|
@ -63,6 +63,10 @@ public:
|
|||||||
|
|
||||||
bool IsStreamActive(AudioStreamType streamType);
|
bool IsStreamActive(AudioStreamType streamType);
|
||||||
|
|
||||||
|
std::vector<SinkInput> GetAllSinkInputs();
|
||||||
|
|
||||||
|
std::vector<SourceOutput> GetAllSourceOutputs();
|
||||||
|
|
||||||
AudioIOHandle OpenAudioPort(const AudioModuleInfo &audioModuleInfo);
|
AudioIOHandle OpenAudioPort(const AudioModuleInfo &audioModuleInfo);
|
||||||
|
|
||||||
int32_t CloseAudioPort(AudioIOHandle ioHandle);
|
int32_t CloseAudioPort(AudioIOHandle ioHandle);
|
||||||
|
@ -36,6 +36,7 @@ public:
|
|||||||
void SetAudioParameter(const std::string &key, const std::string &value) override;
|
void SetAudioParameter(const std::string &key, const std::string &value) override;
|
||||||
int32_t UpdateActiveDeviceRoute(DeviceType type, DeviceFlag flag) override;
|
int32_t UpdateActiveDeviceRoute(DeviceType type, DeviceFlag flag) override;
|
||||||
const char *RetrieveCookie(int32_t &size) override;
|
const char *RetrieveCookie(int32_t &size) override;
|
||||||
|
uint64_t GetTransactionId(DeviceType deviceType, DeviceRole deviceRole) override;
|
||||||
private:
|
private:
|
||||||
static inline BrokerDelegator<AudioManagerProxy> delegator_;
|
static inline BrokerDelegator<AudioManagerProxy> delegator_;
|
||||||
};
|
};
|
||||||
|
@ -534,6 +534,7 @@ private:
|
|||||||
|
|
||||||
pa_cvolume cvolume;
|
pa_cvolume cvolume;
|
||||||
uint32_t streamIndex;
|
uint32_t streamIndex;
|
||||||
|
uint32_t sessionID;
|
||||||
uint32_t volumeChannels;
|
uint32_t volumeChannels;
|
||||||
bool streamInfoUpdated;
|
bool streamInfoUpdated;
|
||||||
|
|
||||||
@ -591,6 +592,8 @@ private:
|
|||||||
void HandleRenderPositionCallbacks(size_t bytesWritten);
|
void HandleRenderPositionCallbacks(size_t bytesWritten);
|
||||||
void HandleCapturePositionCallbacks(size_t bytesRead);
|
void HandleCapturePositionCallbacks(size_t bytesRead);
|
||||||
|
|
||||||
|
void WriteStateChangedSysEvents();
|
||||||
|
|
||||||
// Error code used
|
// Error code used
|
||||||
static const int32_t AUDIO_CLIENT_SUCCESS = 0;
|
static const int32_t AUDIO_CLIENT_SUCCESS = 0;
|
||||||
static const int32_t AUDIO_CLIENT_ERR = -1;
|
static const int32_t AUDIO_CLIENT_ERR = -1;
|
||||||
|
@ -47,6 +47,7 @@ public:
|
|||||||
void SetAudioParameter(const std::string &key, const std::string &value) override;
|
void SetAudioParameter(const std::string &key, const std::string &value) override;
|
||||||
const std::string GetAudioParameter(const std::string &key) override;
|
const std::string GetAudioParameter(const std::string &key) override;
|
||||||
const char *RetrieveCookie(int32_t &size) override;
|
const char *RetrieveCookie(int32_t &size) override;
|
||||||
|
uint64_t GetTransactionId(DeviceType deviceType, DeviceRole deviceRole) override;
|
||||||
int32_t UpdateActiveDeviceRoute(DeviceType type, DeviceFlag flag) override;
|
int32_t UpdateActiveDeviceRoute(DeviceType type, DeviceFlag flag) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include "audio_manager_base.h"
|
#include "audio_manager_base.h"
|
||||||
#include "iservice_registry.h"
|
#include "iservice_registry.h"
|
||||||
#include "audio_log.h"
|
#include "audio_log.h"
|
||||||
|
#include "hisysevent.h"
|
||||||
#include "system_ability_definition.h"
|
#include "system_ability_definition.h"
|
||||||
|
|
||||||
#include "audio_policy_service.h"
|
#include "audio_policy_service.h"
|
||||||
@ -793,12 +794,55 @@ InternalDeviceType AudioPolicyService::GetDeviceType(const std::string &deviceNa
|
|||||||
return devType;
|
return devType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AudioPolicyService::WriteDeviceChangedSysEvents(const vector<sptr<AudioDeviceDescriptor>> &desc, bool isConnected)
|
||||||
|
{
|
||||||
|
for (auto deviceDescriptor : desc) {
|
||||||
|
if (deviceDescriptor != nullptr) {
|
||||||
|
if (deviceDescriptor->deviceType_ == DEVICE_TYPE_WIRED_HEADSET) {
|
||||||
|
HiviewDFX::HiSysEvent::Write("AUDIO", "AUDIO_HEADSET_CHANGE",
|
||||||
|
HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
|
||||||
|
"ISCONNECT", isConnected ? 1 : 0,
|
||||||
|
"HASMIC", 1,
|
||||||
|
"DEVICETYPE", DEVICE_TYPE_WIRED_HEADSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isConnected) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (deviceDescriptor->deviceRole_ == OUTPUT_DEVICE) {
|
||||||
|
vector<SinkInput> sinkInputs = mAudioPolicyManager.GetAllSinkInputs();
|
||||||
|
for (SinkInput sinkInput : sinkInputs) {
|
||||||
|
HiviewDFX::HiSysEvent::Write("AUDIO", "AUDIO_DEVICE_CHANGE",
|
||||||
|
HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
|
||||||
|
"ISOUTPUT", 1,
|
||||||
|
"STREAMID", sinkInput.streamId,
|
||||||
|
"STREAMTYPE", sinkInput.streamType,
|
||||||
|
"DEVICETYPE", deviceDescriptor->deviceType_);
|
||||||
|
}
|
||||||
|
} else if (deviceDescriptor->deviceRole_ == INPUT_DEVICE) {
|
||||||
|
vector<SourceOutput> sourceOutputs = mAudioPolicyManager.GetAllSourceOutputs();
|
||||||
|
for (SourceOutput sourceOutput : sourceOutputs) {
|
||||||
|
HiviewDFX::HiSysEvent::Write("AUDIO", "AUDIO_DEVICE_CHANGE",
|
||||||
|
HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
|
||||||
|
"ISOUTPUT", 0,
|
||||||
|
"STREAMID", sourceOutput.streamId,
|
||||||
|
"STREAMTYPE", sourceOutput.streamType,
|
||||||
|
"DEVICETYPE", deviceDescriptor->deviceType_);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void AudioPolicyService::TriggerDeviceChangedCallback(const vector<sptr<AudioDeviceDescriptor>> &desc, bool isConnected)
|
void AudioPolicyService::TriggerDeviceChangedCallback(const vector<sptr<AudioDeviceDescriptor>> &desc, bool isConnected)
|
||||||
{
|
{
|
||||||
DeviceChangeAction deviceChangeAction;
|
DeviceChangeAction deviceChangeAction;
|
||||||
deviceChangeAction.deviceDescriptors = desc;
|
deviceChangeAction.deviceDescriptors = desc;
|
||||||
deviceChangeAction.type = isConnected ? DeviceChangeType::CONNECT : DeviceChangeType::DISCONNECT;
|
deviceChangeAction.type = isConnected ? DeviceChangeType::CONNECT : DeviceChangeType::DISCONNECT;
|
||||||
|
|
||||||
|
WriteDeviceChangedSysEvents(desc, isConnected);
|
||||||
|
|
||||||
for (auto it = deviceChangeCallbackMap_.begin(); it != deviceChangeCallbackMap_.end(); ++it) {
|
for (auto it = deviceChangeCallbackMap_.begin(); it != deviceChangeCallbackMap_.end(); ++it) {
|
||||||
if (it->second) {
|
if (it->second) {
|
||||||
it->second->OnDeviceChange(deviceChangeAction);
|
it->second->OnDeviceChange(deviceChangeAction);
|
||||||
|
@ -21,6 +21,8 @@
|
|||||||
|
|
||||||
#include "audio_adapter_manager.h"
|
#include "audio_adapter_manager.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
namespace OHOS {
|
namespace OHOS {
|
||||||
namespace AudioStandard {
|
namespace AudioStandard {
|
||||||
bool AudioAdapterManager::Init()
|
bool AudioAdapterManager::Init()
|
||||||
@ -134,6 +136,28 @@ bool AudioAdapterManager::IsStreamActive(AudioStreamType streamType)
|
|||||||
return mAudioServiceAdapter->IsStreamActive(streamType);
|
return mAudioServiceAdapter->IsStreamActive(streamType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vector<SinkInput> AudioAdapterManager::GetAllSinkInputs()
|
||||||
|
{
|
||||||
|
if (!mAudioServiceAdapter) {
|
||||||
|
AUDIO_ERR_LOG("[AudioAdapterManager] audio adapter null");
|
||||||
|
vector<SinkInput> sinkInputList;
|
||||||
|
return sinkInputList;
|
||||||
|
}
|
||||||
|
|
||||||
|
return mAudioServiceAdapter->GetAllSinkInputs();
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<SourceOutput> AudioAdapterManager::GetAllSourceOutputs()
|
||||||
|
{
|
||||||
|
if (!mAudioServiceAdapter) {
|
||||||
|
AUDIO_ERR_LOG("[AudioAdapterManager] audio adapter null");
|
||||||
|
vector<SourceOutput> sourceOutputList;
|
||||||
|
return sourceOutputList;
|
||||||
|
}
|
||||||
|
|
||||||
|
return mAudioServiceAdapter->GetAllSourceOutputs();
|
||||||
|
}
|
||||||
|
|
||||||
int32_t AudioAdapterManager::SuspendAudioDevice(std::string &portName, bool isSuspend)
|
int32_t AudioAdapterManager::SuspendAudioDevice(std::string &portName, bool isSuspend)
|
||||||
{
|
{
|
||||||
if (!mAudioServiceAdapter) {
|
if (!mAudioServiceAdapter) {
|
||||||
|
@ -205,6 +205,32 @@ const char *AudioManagerProxy::RetrieveCookie(int32_t &size)
|
|||||||
return cookieInfo;
|
return cookieInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t AudioManagerProxy::GetTransactionId(DeviceType deviceType, DeviceRole deviceRole)
|
||||||
|
{
|
||||||
|
MessageParcel data;
|
||||||
|
MessageParcel reply;
|
||||||
|
MessageOption option;
|
||||||
|
uint32_t transactionId = 0;
|
||||||
|
|
||||||
|
if (!data.WriteInterfaceToken(GetDescriptor())) {
|
||||||
|
AUDIO_ERR_LOG("AudioManagerProxy: WriteInterfaceToken failed");
|
||||||
|
return transactionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
data.WriteInt32(static_cast<int32_t>(deviceType));
|
||||||
|
data.WriteInt32(static_cast<int32_t>(deviceRole));
|
||||||
|
|
||||||
|
int32_t error = Remote()->SendRequest(GET_TRANSACTION_ID, data, reply, option);
|
||||||
|
if (error != ERR_NONE) {
|
||||||
|
AUDIO_ERR_LOG("get transaction id failed, error: %d", error);
|
||||||
|
return transactionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
transactionId = reply.ReadUint64();
|
||||||
|
|
||||||
|
return transactionId;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t AudioManagerProxy::UpdateActiveDeviceRoute(DeviceType type, DeviceFlag flag)
|
int32_t AudioManagerProxy::UpdateActiveDeviceRoute(DeviceType type, DeviceFlag flag)
|
||||||
{
|
{
|
||||||
return ERR_NONE;
|
return ERR_NONE;
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
#include "iservice_registry.h"
|
#include "iservice_registry.h"
|
||||||
#include "audio_log.h"
|
#include "audio_log.h"
|
||||||
|
#include "hisysevent.h"
|
||||||
#include "securec.h"
|
#include "securec.h"
|
||||||
#include "system_ability_definition.h"
|
#include "system_ability_definition.h"
|
||||||
#include "unistd.h"
|
#include "unistd.h"
|
||||||
@ -147,6 +148,7 @@ void AudioServiceClient::PAStreamStartSuccessCb(pa_stream *stream, int32_t succe
|
|||||||
pa_threaded_mainloop *mainLoop = static_cast<pa_threaded_mainloop *>(asClient->mainLoop);
|
pa_threaded_mainloop *mainLoop = static_cast<pa_threaded_mainloop *>(asClient->mainLoop);
|
||||||
|
|
||||||
asClient->state_ = RUNNING;
|
asClient->state_ = RUNNING;
|
||||||
|
asClient->WriteStateChangedSysEvents();
|
||||||
std::shared_ptr<AudioStreamCallback> streamCb = asClient->streamCallback_.lock();
|
std::shared_ptr<AudioStreamCallback> streamCb = asClient->streamCallback_.lock();
|
||||||
if (streamCb != nullptr) {
|
if (streamCb != nullptr) {
|
||||||
streamCb->OnStateChange(asClient->state_);
|
streamCb->OnStateChange(asClient->state_);
|
||||||
@ -166,6 +168,7 @@ void AudioServiceClient::PAStreamStopSuccessCb(pa_stream *stream, int32_t succes
|
|||||||
pa_threaded_mainloop *mainLoop = static_cast<pa_threaded_mainloop *>(asClient->mainLoop);
|
pa_threaded_mainloop *mainLoop = static_cast<pa_threaded_mainloop *>(asClient->mainLoop);
|
||||||
|
|
||||||
asClient->state_ = STOPPED;
|
asClient->state_ = STOPPED;
|
||||||
|
asClient->WriteStateChangedSysEvents();
|
||||||
std::shared_ptr<AudioStreamCallback> streamCb = asClient->streamCallback_.lock();
|
std::shared_ptr<AudioStreamCallback> streamCb = asClient->streamCallback_.lock();
|
||||||
if (streamCb != nullptr) {
|
if (streamCb != nullptr) {
|
||||||
streamCb->OnStateChange(asClient->state_);
|
streamCb->OnStateChange(asClient->state_);
|
||||||
@ -185,6 +188,7 @@ void AudioServiceClient::PAStreamPauseSuccessCb(pa_stream *stream, int32_t succe
|
|||||||
pa_threaded_mainloop *mainLoop = static_cast<pa_threaded_mainloop *>(asClient->mainLoop);
|
pa_threaded_mainloop *mainLoop = static_cast<pa_threaded_mainloop *>(asClient->mainLoop);
|
||||||
|
|
||||||
asClient->state_ = PAUSED;
|
asClient->state_ = PAUSED;
|
||||||
|
asClient->WriteStateChangedSysEvents();
|
||||||
std::shared_ptr<AudioStreamCallback> streamCb = asClient->streamCallback_.lock();
|
std::shared_ptr<AudioStreamCallback> streamCb = asClient->streamCallback_.lock();
|
||||||
if (streamCb != nullptr) {
|
if (streamCb != nullptr) {
|
||||||
streamCb->OnStateChange(asClient->state_);
|
streamCb->OnStateChange(asClient->state_);
|
||||||
@ -450,6 +454,7 @@ AudioServiceClient::AudioServiceClient()
|
|||||||
mAudioSystemMgr = nullptr;
|
mAudioSystemMgr = nullptr;
|
||||||
|
|
||||||
streamIndex = 0;
|
streamIndex = 0;
|
||||||
|
sessionID = 0;
|
||||||
volumeChannels = STEREO;
|
volumeChannels = STEREO;
|
||||||
streamInfoUpdated = false;
|
streamInfoUpdated = false;
|
||||||
|
|
||||||
@ -946,6 +951,7 @@ int32_t AudioServiceClient::CreateStream(AudioStreamParams audioParams, AudioStr
|
|||||||
}
|
}
|
||||||
|
|
||||||
state_ = PREPARED;
|
state_ = PREPARED;
|
||||||
|
WriteStateChangedSysEvents();
|
||||||
std::shared_ptr<AudioStreamCallback> streamCb = streamCallback_.lock();
|
std::shared_ptr<AudioStreamCallback> streamCb = streamCallback_.lock();
|
||||||
if (streamCb != nullptr) {
|
if (streamCb != nullptr) {
|
||||||
streamCb->OnStateChange(state_);
|
streamCb->OnStateChange(state_);
|
||||||
@ -1547,8 +1553,9 @@ int32_t AudioServiceClient::ReadStream(StreamBuffer &stream, bool isBlocking)
|
|||||||
|
|
||||||
int32_t AudioServiceClient::ReleaseStream()
|
int32_t AudioServiceClient::ReleaseStream()
|
||||||
{
|
{
|
||||||
ResetPAAudioClient();
|
|
||||||
state_ = RELEASED;
|
state_ = RELEASED;
|
||||||
|
WriteStateChangedSysEvents();
|
||||||
|
ResetPAAudioClient();
|
||||||
|
|
||||||
std::shared_ptr<AudioStreamCallback> streamCb = streamCallback_.lock();
|
std::shared_ptr<AudioStreamCallback> streamCb = streamCallback_.lock();
|
||||||
if (streamCb != nullptr) {
|
if (streamCb != nullptr) {
|
||||||
@ -1964,8 +1971,17 @@ void AudioServiceClient::GetSinkInputInfoCb(pa_context *context, const pa_sink_i
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t sessionID = 0;
|
||||||
|
const char *sessionCStr = pa_proplist_gets(info->proplist, "stream.sessionID");
|
||||||
|
if (sessionCStr != nullptr) {
|
||||||
|
std::stringstream sessionStr;
|
||||||
|
sessionStr << sessionCStr;
|
||||||
|
sessionStr >> sessionID;
|
||||||
|
}
|
||||||
|
|
||||||
thiz->cvolume = info->volume;
|
thiz->cvolume = info->volume;
|
||||||
thiz->streamIndex = info->index;
|
thiz->streamIndex = info->index;
|
||||||
|
thiz->sessionID = sessionID;
|
||||||
thiz->volumeChannels = info->channel_map.channels;
|
thiz->volumeChannels = info->channel_map.channels;
|
||||||
thiz->streamInfoUpdated = true;
|
thiz->streamInfoUpdated = true;
|
||||||
|
|
||||||
@ -1992,6 +2008,11 @@ void AudioServiceClient::SetPaVolume(const AudioServiceClient &client)
|
|||||||
pa_operation_unref(pa_context_set_sink_input_volume(client.context, client.streamIndex, &cv, nullptr, nullptr));
|
pa_operation_unref(pa_context_set_sink_input_volume(client.context, client.streamIndex, &cv, nullptr, nullptr));
|
||||||
|
|
||||||
AUDIO_INFO_LOG("Applied volume : %{public}f, pa volume: %{public}d", vol, volume);
|
AUDIO_INFO_LOG("Applied volume : %{public}f, pa volume: %{public}d", vol, volume);
|
||||||
|
HiviewDFX::HiSysEvent::Write("AUDIO", "AUDIO_VOLUME_CHANGE", HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
|
||||||
|
"ISOUTPUT", 1,
|
||||||
|
"STREAMID", client.sessionID,
|
||||||
|
"STREAMTYPE", client.mStreamType,
|
||||||
|
"VOLUME", vol);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t AudioServiceClient::SetStreamRenderRate(AudioRendererRate audioRendererRate)
|
int32_t AudioServiceClient::SetStreamRenderRate(AudioRendererRate audioRendererRate)
|
||||||
@ -2042,5 +2063,34 @@ void AudioServiceClient::SaveStreamCallback(const std::weak_ptr<AudioStreamCallb
|
|||||||
streamCb->OnStateChange(state_);
|
streamCb->OnStateChange(state_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AudioServiceClient::WriteStateChangedSysEvents()
|
||||||
|
{
|
||||||
|
uint32_t sessionID = 0;
|
||||||
|
uint64_t transactionId = 0;
|
||||||
|
int32_t callingPid = getpid();
|
||||||
|
int32_t callingUid = getuid();
|
||||||
|
|
||||||
|
bool isOutput = true;
|
||||||
|
if (eAudioClientType == AUDIO_SERVICE_CLIENT_PLAYBACK) {
|
||||||
|
transactionId = mAudioSystemMgr->GetTransactionId(DEVICE_TYPE_SPEAKER, OUTPUT_DEVICE);
|
||||||
|
} else {
|
||||||
|
transactionId = mAudioSystemMgr->GetTransactionId(DEVICE_TYPE_MIC, INPUT_DEVICE);
|
||||||
|
isOutput = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
GetSessionID(sessionID);
|
||||||
|
|
||||||
|
HiviewDFX::HiSysEvent::Write("AUDIO", "AUDIO_STREAM_CHANGE",
|
||||||
|
HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
|
||||||
|
"ISOUTPUT", isOutput ? 1 : 0,
|
||||||
|
"STREAMID", sessionID,
|
||||||
|
"UID", callingUid,
|
||||||
|
"PID", callingPid,
|
||||||
|
"TRANSACTIONID", transactionId,
|
||||||
|
"STREAMTYPE", mStreamType,
|
||||||
|
"STATE", state_,
|
||||||
|
"DEVICETYPE", DEVICE_TYPE_INVALID);
|
||||||
|
}
|
||||||
} // namespace AudioStandard
|
} // namespace AudioStandard
|
||||||
} // namespace OHOS
|
} // namespace OHOS
|
||||||
|
@ -239,6 +239,14 @@ const char *AudioSystemManager::RetrieveCookie(int32_t &size)
|
|||||||
return g_sProxy->RetrieveCookie(size);
|
return g_sProxy->RetrieveCookie(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t AudioSystemManager::GetTransactionId(DeviceType deviceType, DeviceRole deviceRole)
|
||||||
|
{
|
||||||
|
if (!IsAlived()) {
|
||||||
|
CHECK_AND_RETURN_RET_LOG(g_sProxy != nullptr, 0, "GetTransactionId::Audio service unavailable");
|
||||||
|
}
|
||||||
|
return g_sProxy->GetTransactionId(deviceType, deviceRole);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t AudioSystemManager::SetVolume(AudioSystemManager::AudioVolumeType volumeType, int32_t volume) const
|
int32_t AudioSystemManager::SetVolume(AudioSystemManager::AudioVolumeType volumeType, int32_t volume) const
|
||||||
{
|
{
|
||||||
AUDIO_DEBUG_LOG("AudioSystemManager SetVolume volumeType=%{public}d ", volumeType);
|
AUDIO_DEBUG_LOG("AudioSystemManager SetVolume volumeType=%{public}d ", volumeType);
|
||||||
|
@ -84,6 +84,16 @@ int AudioManagerStub::OnRemoteRequest(
|
|||||||
|
|
||||||
return AUDIO_OK;
|
return AUDIO_OK;
|
||||||
}
|
}
|
||||||
|
case GET_TRANSACTION_ID: {
|
||||||
|
AUDIO_DEBUG_LOG("GET_TRANSACTION_ID AudioManagerStub");
|
||||||
|
DeviceType deviceType = (static_cast<DeviceType>(data.ReadInt32()));
|
||||||
|
DeviceRole deviceRole = (static_cast<DeviceRole>(data.ReadInt32()));
|
||||||
|
uint64_t transactionId = GetTransactionId(deviceType, deviceRole);
|
||||||
|
|
||||||
|
reply.WriteUint64(transactionId);
|
||||||
|
|
||||||
|
return AUDIO_OK;
|
||||||
|
}
|
||||||
case SET_MICROPHONE_MUTE: {
|
case SET_MICROPHONE_MUTE: {
|
||||||
AUDIO_DEBUG_LOG("SET_MICROPHONE_MUTE AudioManagerStub");
|
AUDIO_DEBUG_LOG("SET_MICROPHONE_MUTE AudioManagerStub");
|
||||||
bool isMute = data.ReadBool();
|
bool isMute = data.ReadBool();
|
||||||
|
@ -13,16 +13,18 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <cinttypes>
|
||||||
|
#include <fstream>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
#include "audio_capturer_source.h"
|
#include "audio_capturer_source.h"
|
||||||
#include "audio_errors.h"
|
#include "audio_errors.h"
|
||||||
#include "audio_renderer_sink.h"
|
#include "audio_renderer_sink.h"
|
||||||
#include "iservice_registry.h"
|
#include "iservice_registry.h"
|
||||||
#include "audio_log.h"
|
#include "audio_log.h"
|
||||||
#include "system_ability_definition.h"
|
#include "system_ability_definition.h"
|
||||||
#include "audio_server.h"
|
|
||||||
|
|
||||||
#include <fstream>
|
#include "audio_server.h"
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
#define PA
|
#define PA
|
||||||
#ifdef PA
|
#ifdef PA
|
||||||
@ -135,6 +137,27 @@ const char *AudioServer::RetrieveCookie(int32_t &size)
|
|||||||
return cookieInfo;
|
return cookieInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t AudioServer::GetTransactionId(DeviceType deviceType, DeviceRole deviceRole)
|
||||||
|
{
|
||||||
|
uint64_t transactionId = 0;
|
||||||
|
AUDIO_INFO_LOG("GetTransactionId in: device type: %{public}d, device role: %{public}d", deviceType, deviceRole);
|
||||||
|
|
||||||
|
if (deviceRole == OUTPUT_DEVICE) {
|
||||||
|
AudioRendererSink *audioRendererSinkInstance = AudioRendererSink::GetInstance();
|
||||||
|
if (audioRendererSinkInstance) {
|
||||||
|
transactionId = audioRendererSinkInstance->GetTransactionId();
|
||||||
|
}
|
||||||
|
} else if (deviceRole == INPUT_DEVICE) {
|
||||||
|
AudioCapturerSource *audioCapturerSourceInstance = AudioCapturerSource::GetInstance();
|
||||||
|
if (audioCapturerSourceInstance) {
|
||||||
|
transactionId = audioCapturerSourceInstance->GetTransactionId();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AUDIO_INFO_LOG("Transaction Id: %{public}" PRIu64, transactionId);
|
||||||
|
return transactionId;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t AudioServer::GetMaxVolume(AudioSystemManager::AudioVolumeType volumeType)
|
int32_t AudioServer::GetMaxVolume(AudioSystemManager::AudioVolumeType volumeType)
|
||||||
{
|
{
|
||||||
AUDIO_DEBUG_LOG("GetMaxVolume server");
|
AUDIO_DEBUG_LOG("GetMaxVolume server");
|
||||||
|
Loading…
Reference in New Issue
Block a user