Loading media/libaudioclient/AudioSystem.cpp +6 −0 Original line number Original line Diff line number Diff line Loading @@ -1392,6 +1392,12 @@ status_t AudioSystem::getMicrophones(std::vector<media::MicrophoneInfo> *microph return af->getMicrophones(microphones); return af->getMicrophones(microphones); } } status_t AudioSystem::setAudioHalPids(const std::vector<pid_t>& pids) { const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); if (af == nullptr) return PERMISSION_DENIED; return af->setAudioHalPids(pids); } status_t AudioSystem::getSurroundFormats(unsigned int *numSurroundFormats, status_t AudioSystem::getSurroundFormats(unsigned int *numSurroundFormats, audio_format_t *surroundFormats, audio_format_t *surroundFormats, bool *surroundFormatsEnabled, bool *surroundFormatsEnabled, Loading media/libaudioclient/IAudioFlinger.cpp +43 −1 Original line number Original line Diff line number Diff line Loading @@ -90,10 +90,12 @@ enum { SET_MASTER_BALANCE, SET_MASTER_BALANCE, GET_MASTER_BALANCE, GET_MASTER_BALANCE, SET_EFFECT_SUSPENDED, SET_EFFECT_SUSPENDED, SET_AUDIO_HAL_PIDS }; }; #define MAX_ITEMS_PER_LIST 1024 #define MAX_ITEMS_PER_LIST 1024 class BpAudioFlinger : public BpInterface<IAudioFlinger> class BpAudioFlinger : public BpInterface<IAudioFlinger> { { public: public: Loading Loading @@ -900,6 +902,20 @@ public: status = reply.readParcelableVector(microphones); status = reply.readParcelableVector(microphones); return status; return status; } } virtual status_t setAudioHalPids(const std::vector<pid_t>& pids) { Parcel data, reply; data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); data.writeInt32(pids.size()); for (auto pid : pids) { data.writeInt32(pid); } status_t status = remote()->transact(SET_AUDIO_HAL_PIDS, data, &reply); if (status != NO_ERROR) { return status; } return static_cast <status_t> (reply.readInt32()); } }; }; IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); Loading Loading @@ -955,7 +971,8 @@ status_t BnAudioFlinger::onTransact( case SET_MODE: case SET_MODE: case SET_MIC_MUTE: case SET_MIC_MUTE: case SET_LOW_RAM_DEVICE: case SET_LOW_RAM_DEVICE: case SYSTEM_READY: { case SYSTEM_READY: case SET_AUDIO_HAL_PIDS: { if (!isServiceUid(IPCThreadState::self()->getCallingUid())) { if (!isServiceUid(IPCThreadState::self()->getCallingUid())) { ALOGW("%s: transaction %d received from PID %d unauthorized UID %d", ALOGW("%s: transaction %d received from PID %d unauthorized UID %d", __func__, code, IPCThreadState::self()->getCallingPid(), __func__, code, IPCThreadState::self()->getCallingPid(), Loading Loading @@ -1542,6 +1559,31 @@ status_t BnAudioFlinger::onTransact( } } return NO_ERROR; return NO_ERROR; } } case SET_AUDIO_HAL_PIDS: { CHECK_INTERFACE(IAudioFlinger, data, reply); std::vector<pid_t> pids; int32_t size; status_t status = data.readInt32(&size); if (status != NO_ERROR) { return status; } if (size < 0) { return BAD_VALUE; } if (size > MAX_ITEMS_PER_LIST) { size = MAX_ITEMS_PER_LIST; } for (int32_t i = 0; i < size; i++) { int32_t pid; status = data.readInt32(&pid); if (status != NO_ERROR) { return status; } pids.push_back(pid); } reply->writeInt32(setAudioHalPids(pids)); return NO_ERROR; } default: default: return BBinder::onTransact(code, data, reply, flags); return BBinder::onTransact(code, data, reply, flags); } } Loading media/libaudioclient/include/media/AudioSystem.h +6 −0 Original line number Original line Diff line number Diff line Loading @@ -397,6 +397,12 @@ public: static status_t setRttEnabled(bool enabled); static status_t setRttEnabled(bool enabled); /** * Send audio HAL server process pids to native audioserver process for use * when generating audio HAL servers tombstones */ static status_t setAudioHalPids(const std::vector<pid_t>& pids); // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- class AudioVolumeGroupCallback : public RefBase class AudioVolumeGroupCallback : public RefBase Loading media/libaudioclient/include/media/IAudioFlinger.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -511,6 +511,8 @@ public: /* List available microphones and their characteristics */ /* List available microphones and their characteristics */ virtual status_t getMicrophones(std::vector<media::MicrophoneInfo> *microphones) = 0; virtual status_t getMicrophones(std::vector<media::MicrophoneInfo> *microphones) = 0; virtual status_t setAudioHalPids(const std::vector<pid_t>& pids) = 0; }; }; Loading media/libaudiohal/impl/DevicesFactoryHalHidl.cpp +27 −0 Original line number Original line Diff line number Diff line Loading @@ -20,6 +20,7 @@ #define LOG_TAG "DevicesFactoryHalHidl" #define LOG_TAG "DevicesFactoryHalHidl" //#define LOG_NDEBUG 0 //#define LOG_NDEBUG 0 #include "android/hidl/manager/1.0/IServiceManager.h" #include PATH(android/hardware/audio/FILE_VERSION/IDevice.h) #include PATH(android/hardware/audio/FILE_VERSION/IDevice.h) #include <media/audiohal/hidl/HalDeathHandler.h> #include <media/audiohal/hidl/HalDeathHandler.h> #include <utils/Log.h> #include <utils/Log.h> Loading @@ -28,6 +29,8 @@ #include "DeviceHalHidl.h" #include "DeviceHalHidl.h" #include "DevicesFactoryHalHidl.h" #include "DevicesFactoryHalHidl.h" #include <set> using ::android::hardware::audio::CPP_VERSION::IDevice; using ::android::hardware::audio::CPP_VERSION::IDevice; using ::android::hardware::audio::CPP_VERSION::Result; using ::android::hardware::audio::CPP_VERSION::Result; using ::android::hardware::Return; using ::android::hardware::Return; Loading Loading @@ -108,5 +111,29 @@ status_t DevicesFactoryHalHidl::openDevice(const char *name, sp<DeviceHalInterfa return BAD_VALUE; return BAD_VALUE; } } status_t DevicesFactoryHalHidl::getHalPids(std::vector<pid_t> *pids) { std::set<pid_t> pidsSet; for (const auto& factory : mDeviceFactories) { using ::android::hidl::base::V1_0::DebugInfo; using android::hidl::manager::V1_0::IServiceManager; DebugInfo debugInfo; auto ret = factory->getDebugInfo([&] (const auto &info) { debugInfo = info; }); if (!ret.isOk()) { return INVALID_OPERATION; } if (debugInfo.pid == (int)IServiceManager::PidConstant::NO_PID) { continue; } pidsSet.insert(debugInfo.pid); } *pids = {pidsSet.begin(), pidsSet.end()}; return NO_ERROR; } } // namespace CPP_VERSION } // namespace CPP_VERSION } // namespace android } // namespace android Loading
media/libaudioclient/AudioSystem.cpp +6 −0 Original line number Original line Diff line number Diff line Loading @@ -1392,6 +1392,12 @@ status_t AudioSystem::getMicrophones(std::vector<media::MicrophoneInfo> *microph return af->getMicrophones(microphones); return af->getMicrophones(microphones); } } status_t AudioSystem::setAudioHalPids(const std::vector<pid_t>& pids) { const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); if (af == nullptr) return PERMISSION_DENIED; return af->setAudioHalPids(pids); } status_t AudioSystem::getSurroundFormats(unsigned int *numSurroundFormats, status_t AudioSystem::getSurroundFormats(unsigned int *numSurroundFormats, audio_format_t *surroundFormats, audio_format_t *surroundFormats, bool *surroundFormatsEnabled, bool *surroundFormatsEnabled, Loading
media/libaudioclient/IAudioFlinger.cpp +43 −1 Original line number Original line Diff line number Diff line Loading @@ -90,10 +90,12 @@ enum { SET_MASTER_BALANCE, SET_MASTER_BALANCE, GET_MASTER_BALANCE, GET_MASTER_BALANCE, SET_EFFECT_SUSPENDED, SET_EFFECT_SUSPENDED, SET_AUDIO_HAL_PIDS }; }; #define MAX_ITEMS_PER_LIST 1024 #define MAX_ITEMS_PER_LIST 1024 class BpAudioFlinger : public BpInterface<IAudioFlinger> class BpAudioFlinger : public BpInterface<IAudioFlinger> { { public: public: Loading Loading @@ -900,6 +902,20 @@ public: status = reply.readParcelableVector(microphones); status = reply.readParcelableVector(microphones); return status; return status; } } virtual status_t setAudioHalPids(const std::vector<pid_t>& pids) { Parcel data, reply; data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); data.writeInt32(pids.size()); for (auto pid : pids) { data.writeInt32(pid); } status_t status = remote()->transact(SET_AUDIO_HAL_PIDS, data, &reply); if (status != NO_ERROR) { return status; } return static_cast <status_t> (reply.readInt32()); } }; }; IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); Loading Loading @@ -955,7 +971,8 @@ status_t BnAudioFlinger::onTransact( case SET_MODE: case SET_MODE: case SET_MIC_MUTE: case SET_MIC_MUTE: case SET_LOW_RAM_DEVICE: case SET_LOW_RAM_DEVICE: case SYSTEM_READY: { case SYSTEM_READY: case SET_AUDIO_HAL_PIDS: { if (!isServiceUid(IPCThreadState::self()->getCallingUid())) { if (!isServiceUid(IPCThreadState::self()->getCallingUid())) { ALOGW("%s: transaction %d received from PID %d unauthorized UID %d", ALOGW("%s: transaction %d received from PID %d unauthorized UID %d", __func__, code, IPCThreadState::self()->getCallingPid(), __func__, code, IPCThreadState::self()->getCallingPid(), Loading Loading @@ -1542,6 +1559,31 @@ status_t BnAudioFlinger::onTransact( } } return NO_ERROR; return NO_ERROR; } } case SET_AUDIO_HAL_PIDS: { CHECK_INTERFACE(IAudioFlinger, data, reply); std::vector<pid_t> pids; int32_t size; status_t status = data.readInt32(&size); if (status != NO_ERROR) { return status; } if (size < 0) { return BAD_VALUE; } if (size > MAX_ITEMS_PER_LIST) { size = MAX_ITEMS_PER_LIST; } for (int32_t i = 0; i < size; i++) { int32_t pid; status = data.readInt32(&pid); if (status != NO_ERROR) { return status; } pids.push_back(pid); } reply->writeInt32(setAudioHalPids(pids)); return NO_ERROR; } default: default: return BBinder::onTransact(code, data, reply, flags); return BBinder::onTransact(code, data, reply, flags); } } Loading
media/libaudioclient/include/media/AudioSystem.h +6 −0 Original line number Original line Diff line number Diff line Loading @@ -397,6 +397,12 @@ public: static status_t setRttEnabled(bool enabled); static status_t setRttEnabled(bool enabled); /** * Send audio HAL server process pids to native audioserver process for use * when generating audio HAL servers tombstones */ static status_t setAudioHalPids(const std::vector<pid_t>& pids); // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- class AudioVolumeGroupCallback : public RefBase class AudioVolumeGroupCallback : public RefBase Loading
media/libaudioclient/include/media/IAudioFlinger.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -511,6 +511,8 @@ public: /* List available microphones and their characteristics */ /* List available microphones and their characteristics */ virtual status_t getMicrophones(std::vector<media::MicrophoneInfo> *microphones) = 0; virtual status_t getMicrophones(std::vector<media::MicrophoneInfo> *microphones) = 0; virtual status_t setAudioHalPids(const std::vector<pid_t>& pids) = 0; }; }; Loading
media/libaudiohal/impl/DevicesFactoryHalHidl.cpp +27 −0 Original line number Original line Diff line number Diff line Loading @@ -20,6 +20,7 @@ #define LOG_TAG "DevicesFactoryHalHidl" #define LOG_TAG "DevicesFactoryHalHidl" //#define LOG_NDEBUG 0 //#define LOG_NDEBUG 0 #include "android/hidl/manager/1.0/IServiceManager.h" #include PATH(android/hardware/audio/FILE_VERSION/IDevice.h) #include PATH(android/hardware/audio/FILE_VERSION/IDevice.h) #include <media/audiohal/hidl/HalDeathHandler.h> #include <media/audiohal/hidl/HalDeathHandler.h> #include <utils/Log.h> #include <utils/Log.h> Loading @@ -28,6 +29,8 @@ #include "DeviceHalHidl.h" #include "DeviceHalHidl.h" #include "DevicesFactoryHalHidl.h" #include "DevicesFactoryHalHidl.h" #include <set> using ::android::hardware::audio::CPP_VERSION::IDevice; using ::android::hardware::audio::CPP_VERSION::IDevice; using ::android::hardware::audio::CPP_VERSION::Result; using ::android::hardware::audio::CPP_VERSION::Result; using ::android::hardware::Return; using ::android::hardware::Return; Loading Loading @@ -108,5 +111,29 @@ status_t DevicesFactoryHalHidl::openDevice(const char *name, sp<DeviceHalInterfa return BAD_VALUE; return BAD_VALUE; } } status_t DevicesFactoryHalHidl::getHalPids(std::vector<pid_t> *pids) { std::set<pid_t> pidsSet; for (const auto& factory : mDeviceFactories) { using ::android::hidl::base::V1_0::DebugInfo; using android::hidl::manager::V1_0::IServiceManager; DebugInfo debugInfo; auto ret = factory->getDebugInfo([&] (const auto &info) { debugInfo = info; }); if (!ret.isOk()) { return INVALID_OPERATION; } if (debugInfo.pid == (int)IServiceManager::PidConstant::NO_PID) { continue; } pidsSet.insert(debugInfo.pid); } *pids = {pidsSet.begin(), pidsSet.end()}; return NO_ERROR; } } // namespace CPP_VERSION } // namespace CPP_VERSION } // namespace android } // namespace android