Merge support for Linux into spice2x-24-08-24 #1
| @ -472,6 +472,7 @@ set(SOURCE_FILES ${SOURCE_FILES} | |||||||
|         hooks/audio/backends/wasapi/util.cpp |         hooks/audio/backends/wasapi/util.cpp | ||||||
|         hooks/audio/implementations/asio.cpp |         hooks/audio/implementations/asio.cpp | ||||||
|         hooks/audio/implementations/wave_out.cpp |         hooks/audio/implementations/wave_out.cpp | ||||||
|  |         hooks/audio/implementations/none.cpp | ||||||
|         hooks/avshook.cpp |         hooks/avshook.cpp | ||||||
|         hooks/cfgmgr32hook.cpp |         hooks/cfgmgr32hook.cpp | ||||||
|         hooks/debughook.cpp |         hooks/debughook.cpp | ||||||
|  | |||||||
| @ -13,6 +13,7 @@ namespace hooks::audio { | |||||||
|     enum class Backend { |     enum class Backend { | ||||||
|         Asio, |         Asio, | ||||||
|         WaveOut, |         WaveOut, | ||||||
|  |         None, | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     extern bool ENABLED; |     extern bool ENABLED; | ||||||
| @ -32,6 +33,8 @@ namespace hooks::audio { | |||||||
|             return Backend::Asio; |             return Backend::Asio; | ||||||
|         } else if (_stricmp(value, "waveout") == 0) { |         } else if (_stricmp(value, "waveout") == 0) { | ||||||
|             return Backend::WaveOut; |             return Backend::WaveOut; | ||||||
|  |         } else if (_stricmp(value, "none") == 0) { | ||||||
|  |             return Backend::None; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return std::nullopt; |         return std::nullopt; | ||||||
|  | |||||||
| @ -9,6 +9,7 @@ | |||||||
| #include "hooks/audio/backends/wasapi/util.h" | #include "hooks/audio/backends/wasapi/util.h" | ||||||
| #include "hooks/audio/implementations/asio.h" | #include "hooks/audio/implementations/asio.h" | ||||||
| #include "hooks/audio/implementations/wave_out.h" | #include "hooks/audio/implementations/wave_out.h" | ||||||
|  | #include "hooks/audio/implementations/none.h" | ||||||
| //#include "util/co_task_mem_ptr.h"
 | //#include "util/co_task_mem_ptr.h"
 | ||||||
| 
 | 
 | ||||||
| #include "defs.h" | #include "defs.h" | ||||||
| @ -160,6 +161,9 @@ IAudioClient *wrap_audio_client(IAudioClient *audio_client) { | |||||||
|             case hooks::audio::Backend::WaveOut: |             case hooks::audio::Backend::WaveOut: | ||||||
|                 backend = new WaveOutBackend(); |                 backend = new WaveOutBackend(); | ||||||
|                 break; |                 break; | ||||||
|  |             case hooks::audio::Backend::None: | ||||||
|  |                 backend = new NoneBackend(); | ||||||
|  |                 break; | ||||||
|             default: |             default: | ||||||
|                 break; |                 break; | ||||||
|         } |         } | ||||||
|  | |||||||
							
								
								
									
										99
									
								
								hooks/audio/implementations/none.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								hooks/audio/implementations/none.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,99 @@ | |||||||
|  | #include "none.h" | ||||||
|  | #include "hooks/audio/audio.h" | ||||||
|  | #include "hooks/audio/backends/wasapi/audio_client.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | const WAVEFORMATEXTENSIBLE &NoneBackend::format() const noexcept { | ||||||
|  |     return format_; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | HRESULT NoneBackend::on_initialize( | ||||||
|  |     AUDCLNT_SHAREMODE *ShareMode, | ||||||
|  |     DWORD *StreamFlags, | ||||||
|  |     REFERENCE_TIME *hnsBufferDuration, | ||||||
|  |     REFERENCE_TIME *hnsPeriodicity, | ||||||
|  |     const WAVEFORMATEX *pFormat, | ||||||
|  |     LPCGUID AudioSessionGuid) noexcept | ||||||
|  | { | ||||||
|  |     *ShareMode = AUDCLNT_SHAREMODE_SHARED; | ||||||
|  |     *StreamFlags = AUDCLNT_STREAMFLAGS_EVENTCALLBACK | | ||||||
|  |             AUDCLNT_STREAMFLAGS_RATEADJUST | | ||||||
|  |             AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM | | ||||||
|  |             AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY; | ||||||
|  |     *hnsBufferDuration = 100000; | ||||||
|  |     *hnsPeriodicity = 100000; | ||||||
|  |     log_info("audio::none", "on_initialize"); | ||||||
|  | 
 | ||||||
|  |     return S_OK; | ||||||
|  | } | ||||||
|  | HRESULT NoneBackend::on_get_buffer_size(uint32_t *buffer_frames) noexcept { | ||||||
|  |     *buffer_frames = 0; | ||||||
|  | 
 | ||||||
|  |     return S_OK; | ||||||
|  | } | ||||||
|  | HRESULT NoneBackend::on_get_stream_latency(REFERENCE_TIME *latency) noexcept { | ||||||
|  |     *latency = 100000; | ||||||
|  | 
 | ||||||
|  |     return S_OK; | ||||||
|  | } | ||||||
|  | HRESULT NoneBackend::on_get_current_padding(std::optional<uint32_t> &padding_frames) noexcept { | ||||||
|  | 
 | ||||||
|  |     padding_frames = 0; | ||||||
|  | 
 | ||||||
|  |     return S_OK; | ||||||
|  | } | ||||||
|  | HRESULT NoneBackend::on_is_format_supported( | ||||||
|  |     AUDCLNT_SHAREMODE *ShareMode, | ||||||
|  |     const WAVEFORMATEX *pFormat, | ||||||
|  |     WAVEFORMATEX **ppClosestMatch) noexcept | ||||||
|  | { | ||||||
|  |     // only accept 44.1 kHz, stereo, 16-bits per channel
 | ||||||
|  |     if (*ShareMode == AUDCLNT_SHAREMODE_EXCLUSIVE && | ||||||
|  |         pFormat->nChannels == 2 && | ||||||
|  |         pFormat->nSamplesPerSec == 44100 && | ||||||
|  |         pFormat->wBitsPerSample == 16) | ||||||
|  |     { | ||||||
|  |         return S_OK; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return AUDCLNT_E_UNSUPPORTED_FORMAT; | ||||||
|  | } | ||||||
|  | HRESULT NoneBackend::on_get_mix_format(WAVEFORMATEX **pp_device_format) noexcept { | ||||||
|  |     return E_NOTIMPL; | ||||||
|  | } | ||||||
|  | HRESULT NoneBackend::on_get_device_period( | ||||||
|  |     REFERENCE_TIME *default_device_period, | ||||||
|  |     REFERENCE_TIME *minimum_device_period) | ||||||
|  | { | ||||||
|  |     *default_device_period = 10000; | ||||||
|  |     *minimum_device_period = 10000; | ||||||
|  | 
 | ||||||
|  |     return S_OK; | ||||||
|  | } | ||||||
|  | HRESULT NoneBackend::on_start() noexcept { | ||||||
|  |     return S_OK; | ||||||
|  | } | ||||||
|  | HRESULT NoneBackend::on_stop() noexcept { | ||||||
|  |     return S_OK; | ||||||
|  | } | ||||||
|  | HRESULT NoneBackend::on_set_event_handle(HANDLE *event_handle) { | ||||||
|  | 
 | ||||||
|  |     *event_handle = CreateEvent(nullptr, true, false, nullptr); | ||||||
|  | 
 | ||||||
|  |     return S_OK; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | HRESULT NoneBackend::on_get_buffer(uint32_t num_frames_requested, BYTE **ppData) { | ||||||
|  |     static BYTE buf[10000]; | ||||||
|  |     *ppData = buf; | ||||||
|  | 
 | ||||||
|  |     return S_OK; | ||||||
|  | } | ||||||
|  | HRESULT NoneBackend::on_release_buffer(uint32_t num_frames_written, DWORD dwFlags) { | ||||||
|  | 
 | ||||||
|  |     return S_OK; | ||||||
|  | } | ||||||
|  | NoneBackend::NoneBackend() : format_(hooks::audio::FORMAT) | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  | } | ||||||
							
								
								
									
										48
									
								
								hooks/audio/implementations/none.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								hooks/audio/implementations/none.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,48 @@ | |||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include "backend.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | struct NoneBackend final : AudioBackend { | ||||||
|  | public: | ||||||
|  |     explicit NoneBackend(); | ||||||
|  |     ~NoneBackend() final = default; | ||||||
|  | 
 | ||||||
|  |     [[nodiscard]] const WAVEFORMATEXTENSIBLE &format() const noexcept override; | ||||||
|  | 
 | ||||||
|  |     HRESULT on_initialize( | ||||||
|  |         AUDCLNT_SHAREMODE *ShareMode, | ||||||
|  |         DWORD *StreamFlags, | ||||||
|  |         REFERENCE_TIME *hnsBufferDuration, | ||||||
|  |         REFERENCE_TIME *hnsPeriodicity, | ||||||
|  |         const WAVEFORMATEX *pFormat, | ||||||
|  |         LPCGUID AudioSessionGuid) noexcept override; | ||||||
|  | 
 | ||||||
|  |     HRESULT on_get_buffer_size(uint32_t *buffer_frames) noexcept override; | ||||||
|  |     HRESULT on_get_stream_latency(REFERENCE_TIME *latency) noexcept override; | ||||||
|  |     HRESULT on_get_current_padding(std::optional<uint32_t> &padding_frames) noexcept override; | ||||||
|  | 
 | ||||||
|  |     HRESULT on_is_format_supported( | ||||||
|  |         AUDCLNT_SHAREMODE *ShareMode, | ||||||
|  |         const WAVEFORMATEX *pFormat, | ||||||
|  |         WAVEFORMATEX **ppClosestMatch) noexcept override; | ||||||
|  | 
 | ||||||
|  |     HRESULT on_get_mix_format(WAVEFORMATEX **pp_device_format) noexcept override; | ||||||
|  | 
 | ||||||
|  |     HRESULT on_get_device_period( | ||||||
|  |         REFERENCE_TIME *default_device_period, | ||||||
|  |         REFERENCE_TIME *minimum_device_period) override; | ||||||
|  | 
 | ||||||
|  |     HRESULT on_start() noexcept override; | ||||||
|  |     HRESULT on_stop() noexcept override; | ||||||
|  |     HRESULT on_set_event_handle(HANDLE *event_handle) override; | ||||||
|  | 
 | ||||||
|  |     HRESULT on_get_buffer(uint32_t num_frames_requested, BYTE **ppData) override; | ||||||
|  |     HRESULT on_release_buffer(uint32_t num_frames_written, DWORD dwFlags) override; | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  | 
 | ||||||
|  |     const WAVEFORMATEXTENSIBLE &format_; | ||||||
|  |     BYTE *active_sound_buffer = nullptr; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| @ -1341,7 +1341,7 @@ static const std::vector<OptionDefinition> OPTION_DEFINITIONS = { | |||||||
|             " Does nothing for games that do not output to exclusive WASAPI", |             " Does nothing for games that do not output to exclusive WASAPI", | ||||||
|         .type = OptionType::Enum, |         .type = OptionType::Enum, | ||||||
|         .category = "Audio", |         .category = "Audio", | ||||||
|         .elements = {{"asio", "ASIO"}, {"waveout", "waveOut"}}, |         .elements = {{"asio", "ASIO"}, {"waveout", "waveOut"},{"none", "None"}}, | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|         .title = "Spice Audio Hook ASIO Driver ID", |         .title = "Spice Audio Hook ASIO Driver ID", | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user