- Версия SA-MP
-
- Другая
Описание: название говорит само за себя.
но если еще подробнее, у меня GTA на одной палочке слишком уж громкая, громкость в микшере спадает после перезахода, этот плагин меняет громкость автоматически при входе в игру, а также в рантайме. может быть кому то понадобится 🤔
Активация: /gamevolume <0-100%>
но если еще подробнее, у меня GTA на одной палочке слишком уж громкая, громкость в микшере спадает после перезахода, этот плагин меняет громкость автоматически при входе в игру, а также в рантайме. может быть кому то понадобится 🤔
Активация: /gamevolume <0-100%>
C++:
#ifndef VOLUME_HPP
#define VOLUME_HPP
#include <audiopolicy.h>
#include <endpointvolume.h>
#include <mmdeviceapi.h>
#include <windows.h>
#include <cstdint>
#include <iostream>
#pragma comment(lib, "Ole32.lib")
class c_volume {
public:
explicit c_volume(std::uintptr_t pid)
: m_pid(pid), m_session_manager(nullptr), m_enumerator(nullptr) {
initialize();
}
~c_volume() {
if (m_enumerator) {
m_enumerator->Release();
}
if (m_session_manager) {
m_session_manager->Release();
}
CoUninitialize();
}
bool change(float volume, std::string& error) { return set_volume_for_pid(volume, error); }
private:
std::uintptr_t m_pid;
IAudioSessionManager2* m_session_manager;
IAudioSessionEnumerator* m_enumerator;
void initialize() {
HRESULT hr{};
hr = CoInitialize(NULL);
if (FAILED(hr))
return;
IMMDeviceEnumerator* device_enumerator = nullptr;
hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL,
__uuidof(IMMDeviceEnumerator),
(void**)&device_enumerator);
if (FAILED(hr))
return;
IMMDevice* device = nullptr;
hr = device_enumerator->GetDefaultAudioEndpoint(eRender, eMultimedia,
&device);
device_enumerator->Release();
hr = device->Activate(__uuidof(IAudioSessionManager2), CLSCTX_ALL, NULL,
(void**)&m_session_manager);
device->Release();
hr = m_session_manager->GetSessionEnumerator(&m_enumerator);
}
bool set_volume_for_pid(float volume, std::string& error) {
if (!m_enumerator)
return false;
int session_count;
HRESULT hr = m_enumerator->GetCount(&session_count);
if (FAILED(hr)) {
error = "GetCount failed\n";
return false;
}
for (int i = 0; i < session_count; i++) {
IAudioSessionControl* session_control = nullptr;
hr = m_enumerator->GetSession(i, &session_control);
if (FAILED(hr)) {
continue;
}
IAudioSessionControl2* session_control2 = nullptr;
hr = session_control->QueryInterface(__uuidof(IAudioSessionControl2),
(void**)&session_control2);
session_control->Release();
if (FAILED(hr)) {
continue;
}
std::uintptr_t session_pid = 0;
hr = session_control2->GetProcessId(
reinterpret_cast<DWORD*>(&session_pid));
if (SUCCEEDED(hr) && session_pid == m_pid) {
ISimpleAudioVolume* volume_control = nullptr;
hr = session_control2->QueryInterface(__uuidof(ISimpleAudioVolume),
(void**)&volume_control);
if (SUCCEEDED(hr)) {
volume_control->SetMasterVolume(volume, NULL);
volume_control->Release();
session_control2->Release();
return true;
}
}
session_control2->Release();
}
error = "process " + std::to_string(m_pid) + " not found!\n";
return false;
}
};
#endif // !VOLUME_HPP