| 812 | } |
| 813 | |
| 814 | std::unique_ptr<Engine::Implementation> Xaudio2Implementation::create(Options const & opts) |
| 815 | { |
| 816 | HRESULT hr; |
| 817 | if (FAILED(hr = CoInitializeEx(NULL, COINIT_MULTITHREADED))) |
| 818 | { |
| 819 | log::warning("AudioEngine : cannot initialize multi-threaded mode"); |
| 820 | return nullptr; |
| 821 | } |
| 822 | |
| 823 | std::unique_ptr<Xaudio2Implementation> result(std::move(new Xaudio2Implementation(opts))); |
| 824 | |
| 825 | // interface |
| 826 | if (FAILED(hr = XAudio2Create(&result->m_xaudio2, 0))) |
| 827 | { |
| 828 | log::warning("AudioEngine : cannot initialize XAudio2 interface"); |
| 829 | return nullptr; |
| 830 | } |
| 831 | |
| 832 | if (FAILED(hr = result->m_xaudio2->RegisterForCallbacks(&result->m_callback))) |
| 833 | { |
| 834 | log::warning("AudioEngine : failed to register XAudio2 callback"); |
| 835 | return nullptr; |
| 836 | } |
| 837 | |
| 838 | // mastering voice |
| 839 | if (FAILED(hr = result->m_xaudio2->CreateMasteringVoice(&result->m_master, 2, opts.masteringRate))) |
| 840 | { |
| 841 | log::warning("AudioEngine : cannot initialize mastering mixer"); |
| 842 | return nullptr; |
| 843 | } |
| 844 | |
| 845 | DWORD masterMask; |
| 846 | if (FAILED(hr = result->m_master->GetChannelMask(&masterMask))) |
| 847 | { |
| 848 | log::warning("AudioEngine : error retrivieving mastering voice mask"); |
| 849 | return nullptr; |
| 850 | } |
| 851 | result->m_masterMask = masterMask; |
| 852 | |
| 853 | XAUDIO2_VOICE_DETAILS details; |
| 854 | result->m_master->GetVoiceDetails(&details); |
| 855 | result->m_masterChannels = details.InputChannels; |
| 856 | result->m_masterRate = details.InputSampleRate; |
| 857 | |
| 858 | log::info("AudioEngine master voice : %d channels %d kHz 0x%x", details.InputChannels, details.InputSampleRate, masterMask); |
| 859 | |
| 860 | result->m_master->SetVolume(opts.masterVolume); |
| 861 | |
| 862 | // submix voices |
| 863 | if (FAILED(hr = result->m_xaudio2->CreateSubmixVoice(&result->m_music, 2, opts.masteringRate))) |
| 864 | { |
| 865 | log::warning("AudioEngine : cannot initialize music mixer"); |
| 866 | return nullptr; |
| 867 | } |
| 868 | |
| 869 | result->m_music->SetVolume(opts.musicVolume); |
| 870 | |
| 871 | if (FAILED(hr = result->m_xaudio2->CreateSubmixVoice(&result->m_effects, 2, opts.masteringRate))) |
nothing calls this directly
no test coverage detected