diff --git a/AudioRender/AudioRender.cpp b/AudioRender/AudioRender.cpp index f2b4da9..e256506 100644 --- a/AudioRender/AudioRender.cpp +++ b/AudioRender/AudioRender.cpp @@ -6,9 +6,15 @@ #include "IAudioRender.h" static std::unique_ptr audiosRender_; -bool __stdcall Initialize(const char* sender_name, const char* receiver_name) { +bool __stdcall Initialize(callback_t cb) { assert(!audiosRender_); - audiosRender_.reset(IAudioRender::Create()); + + auto logCallback = [cb](int32 level, const int8* log, uint32 length) { + if (nullptr == cb) { + cb(level, log, length); + } + }; + audiosRender_.reset(IAudioRender::Create(std::move(logCallback))); return true; } diff --git a/AudioRender/AudioRender.h b/AudioRender/AudioRender.h index 8cdcacd..24c6d9a 100644 --- a/AudioRender/AudioRender.h +++ b/AudioRender/AudioRender.h @@ -11,8 +11,8 @@ #ifdef __cplusplus extern "C" { #endif // __cplusplus - - AUDIO_RENDER_EXPORT bool __stdcall Initialize(const char* sender_name, const char* receiver_name); + typedef void (*callback_t)(int, const char*, int); + AUDIO_RENDER_EXPORT bool __stdcall Initialize(callback_t cb); AUDIO_RENDER_EXPORT bool __stdcall Write(const unsigned char* data, unsigned int len); AUDIO_RENDER_EXPORT void __stdcall Uninitialize(); diff --git a/AudioRender/AudioRender.vcxproj b/AudioRender/AudioRender.vcxproj index a1a1d84..647b9c5 100644 --- a/AudioRender/AudioRender.vcxproj +++ b/AudioRender/AudioRender.vcxproj @@ -46,7 +46,7 @@ Unicode - Application + DynamicLibrary false v143 true @@ -120,6 +120,8 @@ true NDEBUG;_CONSOLE;WIN32;AUDIO_RENDER_LIB;%(PreprocessorDefinitions) true + D:\Project\AudioRender\AudioRender;%(AdditionalIncludeDirectories) + Disabled Console diff --git a/AudioRender/AudioRenderStd.cpp b/AudioRender/AudioRenderStd.cpp index 575ae75..ffbd439 100644 --- a/AudioRender/AudioRenderStd.cpp +++ b/AudioRender/AudioRenderStd.cpp @@ -1,7 +1,22 @@ #include "AudioRenderStd.h" +#include + #include "Windows/WavAudioRender.h" -IAudioRender* IAudioRender::Create() { - return new WavAudioRender; -} \ No newline at end of file +IAudioRender* IAudioRender::Create(LogCallback callback) { + return new WavAudioRender(std::move(callback)); +} + +AudioRenderStd::AudioRenderStd(LogCallback callback) noexcept + : callback_(std::move(callback)){ + +} + +void AudioRenderStd::WirteLog(int32 level, const std::string& log) { + if (nullptr == callback_) { + return; + } + + callback_(level, log.c_str(), static_cast(log.length())); +} diff --git a/AudioRender/AudioRenderStd.h b/AudioRender/AudioRenderStd.h index aea7328..31335e5 100644 --- a/AudioRender/AudioRenderStd.h +++ b/AudioRender/AudioRenderStd.h @@ -1,12 +1,25 @@ #pragma once +#include + #include "IAudioRender.h" class AudioRenderStd : public IAudioRender { public: + enum LOG_LEVEL { + DEBUG, + LOG + }; +public: + explicit AudioRenderStd(LogCallback callback) noexcept; ~AudioRenderStd() override = default; uint64 GetClock() override { return 0; } + + void WirteLog(int32 level, const std::string& log); + +private: + LogCallback callback_{ nullptr }; }; diff --git a/AudioRender/IAudioRender.h b/AudioRender/IAudioRender.h index 30b126c..37d6aad 100644 --- a/AudioRender/IAudioRender.h +++ b/AudioRender/IAudioRender.h @@ -1,6 +1,7 @@ #pragma once #include +#include using int8 = char; using uint8 = unsigned char; @@ -20,7 +21,8 @@ struct AudioFrame { class IAudioRender { public: - static IAudioRender* Create(); + using LogCallback = std::function; + static IAudioRender* Create(LogCallback callback); public: virtual ~IAudioRender() = default; diff --git a/AudioRender/Windows/WavAudioRender.cpp b/AudioRender/Windows/WavAudioRender.cpp index d5c5239..7cf3f98 100644 --- a/AudioRender/Windows/WavAudioRender.cpp +++ b/AudioRender/Windows/WavAudioRender.cpp @@ -30,7 +30,8 @@ static void FreeBlocks(WAVEHDR* blockArray) { HeapFree(GetProcessHeap(), 0, blockArray); } -WavAudioRender::WavAudioRender() noexcept { +WavAudioRender::WavAudioRender(LogCallback callback) noexcept + : AudioRenderStd(callback){ HWAVEOUT hWaveOut = nullptr; waveBlocks_ = AllocateBlocks(BlockSize_, BlockCount_); @@ -52,15 +53,20 @@ WavAudioRender::WavAudioRender() noexcept { MMRESULT hr = waveOutOpen(&hWaveOut, WAVE_MAPPER, &waveform, reinterpret_cast(WavAudioRender::waveOutProc), reinterpret_cast(this), CALLBACK_FUNCTION); - if (MMSYSERR_NOERROR == hr) { + if (MMSYSERR_NOERROR != hr) { + WirteLog(DEBUG, "init success"); return; } hWavout_ = std::move(hWaveOut); + initialized_ = true; + WirteLog(DEBUG, "init success"); } WavAudioRender::~WavAudioRender() { + initialized_ = false; if (nullptr == hWavout_) { + WirteLog(DEBUG, "hWavout is nullptr"); return; } waveOutReset(hWavout_); @@ -83,10 +89,13 @@ WavAudioRender::~WavAudioRender() { } } while (true); FreeBlocks(waveBlocks_); + WirteLog(DEBUG, "uninitialized success"); } bool WavAudioRender::Write(const AudioFrame& audioFrame) { + WirteLog(DEBUG, "WavAudioRender::Write"); if (nullptr == hWavout_) { + WirteLog(DEBUG, "hWavout_ is nullptr"); return false; } @@ -116,9 +125,12 @@ bool WavAudioRender::Write(const AudioFrame& audioFrame) { --freeBlockCounter_; } - while (!freeBlockCounter_) { + while (!freeBlockCounter_ && initialized_) { Sleep(1); } + if (!initialized_) { + break; + } ++waveCurrentBlock_; waveCurrentBlock_ %= BlockCount_; diff --git a/AudioRender/Windows/WavAudioRender.h b/AudioRender/Windows/WavAudioRender.h index 5c48dec..9ac28f5 100644 --- a/AudioRender/Windows/WavAudioRender.h +++ b/AudioRender/Windows/WavAudioRender.h @@ -6,7 +6,7 @@ class WavAudioRender : public AudioRenderStd { public: - explicit WavAudioRender() noexcept; + explicit WavAudioRender(LogCallback callback) noexcept; ~WavAudioRender() override; bool Write(const AudioFrame& audioFrame) override; @@ -19,7 +19,7 @@ private: private: int64_t audioPts_{ 0 }; - static constexpr int BlockSize_{ 6400 }; + static constexpr int BlockSize_{ 3200 }; static constexpr int BlockCount_{ 10 }; SectionLock lock_; @@ -28,4 +28,5 @@ private: WAVEHDR* waveBlocks_{ nullptr }; HWAVEOUT hWavout_{ nullptr }; + bool initialized_{ false }; };