From c09287c4fe64e27976c6b6d2d52d76025f7157d8 Mon Sep 17 00:00:00 2001 From: weil Date: Mon, 22 Jan 2024 20:16:23 +0100 Subject: [PATCH] Add method for fetching default device sampling rate --- src/AudioProcessor.cpp | 74 ++++++++++++++++++++++++++++++++++++++++++ src/AudioProcessor.h | 34 +++++++++++++++++++ src/register_types.cpp | 2 ++ 3 files changed, 110 insertions(+) create mode 100644 src/AudioProcessor.cpp create mode 100644 src/AudioProcessor.h diff --git a/src/AudioProcessor.cpp b/src/AudioProcessor.cpp new file mode 100644 index 0000000..5bf1afa --- /dev/null +++ b/src/AudioProcessor.cpp @@ -0,0 +1,74 @@ +#include "AudioProcessor.h" + +#include +#include + +#pragma comment(lib, "ole32.lib") +#pragma comment(lib, "Mmdevapi.lib") +#pragma comment(lib, "Uuid.lib") + +namespace godot { + + +void AudioProcessor::_bind_methods() +{ + ClassDB::bind_method(D_METHOD("process"), &AudioProcessor::process); + ClassDB::bind_method(D_METHOD("get_mix_rate"), &AudioProcessor::get_mix_rate); +} + +AudioProcessor::AudioProcessor() +{ + HRESULT hr; + + CoInitialize(NULL); + hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&m_deviceEnumerator); + if (FAILED(hr)) { + std::cerr << "Failed to create device enumerator" << std::endl; + return; + } + + hr = m_deviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &m_defaultDevice); + if (FAILED(hr)) { + std::cerr << "Failed to get default audio device" << std::endl; + m_deviceEnumerator->Release(); + return; + } + + hr = m_defaultDevice->Activate(__uuidof(IAudioClient), CLSCTX_ALL, NULL, (void**)&m_audioClient); + if (FAILED(hr)) { + std::cerr << "Failed to activate audio client" << std::endl; + m_defaultDevice->Release(); + m_deviceEnumerator->Release(); + return; + } + + hr = m_audioClient->GetMixFormat(&m_pwfx); + if (FAILED(hr)) { + std::cerr << "Failed to get mix format" << std::endl; + m_audioClient->Release(); + m_defaultDevice->Release(); + m_deviceEnumerator->Release(); + return; + } +} + +AudioProcessor::~AudioProcessor() +{ + CoTaskMemFree(m_pwfx); + m_audioClient->Release(); + m_defaultDevice->Release(); + m_deviceEnumerator->Release(); + CoUninitialize(); +} + +void AudioProcessor::process() +{ + +} + +size_t AudioProcessor::get_mix_rate() const +{ + return m_pwfx->nSamplesPerSec; +} + +} diff --git a/src/AudioProcessor.h b/src/AudioProcessor.h new file mode 100644 index 0000000..20e3e99 --- /dev/null +++ b/src/AudioProcessor.h @@ -0,0 +1,34 @@ +#pragma once + +#include +#include + +#include +#include + +#include "opus.h" + +namespace godot { + +class AudioProcessor : public Node +{ + GDCLASS(AudioProcessor, Node); + +protected: + static void _bind_methods(); + +public: + AudioProcessor(); + ~AudioProcessor(); + + void process(); + size_t get_mix_rate() const; + +private: + IMMDeviceEnumerator *m_deviceEnumerator{}; + IMMDevice *m_defaultDevice{}; + IAudioClient *m_audioClient{}; + WAVEFORMATEX *m_pwfx{}; +}; + +} diff --git a/src/register_types.cpp b/src/register_types.cpp index 30c6536..12778f9 100644 --- a/src/register_types.cpp +++ b/src/register_types.cpp @@ -12,6 +12,7 @@ #include #include "GodotOpus.h" +#include "AudioProcessor.h" using namespace godot; @@ -22,6 +23,7 @@ void gdextension_initialize(ModuleInitializationLevel p_level) if (p_level == MODULE_INITIALIZATION_LEVEL_SCENE) { ClassDB::register_class(); + ClassDB::register_class(); } }