ASI автоматическая громкость для игры - GameVolume

g305noobo

Известный
Автор темы
Модератор
307
477
Версия SA-MP
  1. Другая
Описание: название говорит само за себя.
но если еще подробнее, у меня GTA на одной палочке слишком уж громкая, громкость в микшере спадает после перезахода, этот плагин меняет громкость автоматически при входе в игру, а также в рантайме. может быть кому то понадобится 🤔
1725910069917.png

Активация: /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
 

Вложения

  • GameVolume.asi
    26.5 KB · Просмотры: 22