diff --git a/src/AudioProcessor.cpp b/src/AudioProcessor.cpp index 5bf1afa..f2e8988 100644 --- a/src/AudioProcessor.cpp +++ b/src/AudioProcessor.cpp @@ -9,56 +9,100 @@ 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); + ClassDB::bind_method(D_METHOD("get_output_mix_rate"), &AudioProcessor::get_output_mix_rate); + ClassDB::bind_method(D_METHOD("get_input_mix_rate"), &AudioProcessor::get_input_mix_rate); } AudioProcessor::AudioProcessor() { - HRESULT hr; + 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; - } + 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; - } + // Initialize default output device + hr = m_deviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &m_defaultOutputDevice); + if (FAILED(hr)) { + std::cerr << "Failed to get default output audio device" << std::endl; + 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_defaultOutputDevice->Activate(__uuidof(IAudioClient), CLSCTX_ALL, NULL, (void**)&m_outputAudioClient); + if (FAILED(hr)) { + std::cerr << "Failed to activate output audio client" << std::endl; + 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; - } + hr = m_outputAudioClient->GetMixFormat(&m_outputMixFormat); + if (FAILED(hr)) { + std::cerr << "Failed to get output mix format" << std::endl; + return; + } + + // Initialize default input device + hr = m_deviceEnumerator->GetDefaultAudioEndpoint(eCapture, eConsole, &m_defaultInputDevice); + if (FAILED(hr)) { + std::cerr << "Failed to get default input audio device" << std::endl; + return; + } + + hr = m_defaultInputDevice->Activate(__uuidof(IAudioClient), CLSCTX_ALL, NULL, (void**)&m_inputAudioClient); + if (FAILED(hr)) { + std::cerr << "Failed to activate input audio client" << std::endl; + return; + } + + hr = m_inputAudioClient->GetMixFormat(&m_inputMixFormat); + if (FAILED(hr)) { + std::cerr << "Failed to get input mix format" << std::endl; + return; + } } -AudioProcessor::~AudioProcessor() -{ - CoTaskMemFree(m_pwfx); - m_audioClient->Release(); - m_defaultDevice->Release(); +AudioProcessor::~AudioProcessor() { + if (m_outputMixFormat != nullptr) { + CoTaskMemFree(m_outputMixFormat); + m_outputMixFormat = nullptr; + } + + if (m_outputAudioClient != nullptr) { + m_outputAudioClient->Release(); + m_outputAudioClient = nullptr; + } + + if (m_defaultOutputDevice != nullptr) { + m_defaultOutputDevice->Release(); + m_defaultOutputDevice = nullptr; + } + + if (m_inputMixFormat != nullptr) { + CoTaskMemFree(m_inputMixFormat); + m_inputMixFormat = nullptr; + } + + if (m_inputAudioClient != nullptr) { + m_inputAudioClient->Release(); + m_inputAudioClient = nullptr; + } + + if (m_defaultInputDevice != nullptr) { + m_defaultInputDevice->Release(); + m_defaultInputDevice = nullptr; + } + + if (m_deviceEnumerator != nullptr) { m_deviceEnumerator->Release(); - CoUninitialize(); + m_deviceEnumerator = nullptr; + } + + CoUninitialize(); } void AudioProcessor::process() @@ -66,9 +110,13 @@ void AudioProcessor::process() } -size_t AudioProcessor::get_mix_rate() const +size_t AudioProcessor::get_output_mix_rate() const { - return m_pwfx->nSamplesPerSec; + return m_outputMixFormat->nSamplesPerSec; +} + +size_t AudioProcessor::get_input_mix_rate() const { + return m_inputMixFormat->nSamplesPerSec; } } diff --git a/src/AudioProcessor.h b/src/AudioProcessor.h index 20e3e99..a906213 100644 --- a/src/AudioProcessor.h +++ b/src/AudioProcessor.h @@ -22,13 +22,19 @@ public: ~AudioProcessor(); void process(); - size_t get_mix_rate() const; + + size_t get_input_mix_rate() const; + size_t get_output_mix_rate() const; private: - IMMDeviceEnumerator *m_deviceEnumerator{}; - IMMDevice *m_defaultDevice{}; - IAudioClient *m_audioClient{}; - WAVEFORMATEX *m_pwfx{}; + IMMDeviceEnumerator* m_deviceEnumerator = nullptr; + IMMDevice* m_defaultOutputDevice = nullptr; + IAudioClient* m_outputAudioClient = nullptr; + WAVEFORMATEX* m_outputMixFormat = nullptr; + + IMMDevice* m_defaultInputDevice = nullptr; + IAudioClient* m_inputAudioClient = nullptr; + WAVEFORMATEX* m_inputMixFormat = nullptr; }; }