diff options
author | Alex Marsev <alex.marsev@gmail.com> | 2016-01-24 08:19:26 +0300 |
---|---|---|
committer | Alex Marsev <alex.marsev@gmail.com> | 2016-01-26 14:03:18 +0300 |
commit | acd97e3cec98a6100afdbddbb20fe0c64ddcab3e (patch) | |
tree | 0b20af2ad8dbd429a951c76842ff3f2a24c3a526 | |
parent | 6927511f3610bdc889959f17739ba760029989de (diff) |
Add base audio device class
In preparation for event mode audio device support.
-rw-r--r-- | sanear.vcxproj | 3 | ||||
-rw-r--r-- | sanear.vcxproj.filters | 18 | ||||
-rw-r--r-- | src/AudioDevice.h | 46 | ||||
-rw-r--r-- | src/AudioDeviceManager.cpp | 3 | ||||
-rw-r--r-- | src/AudioDevicePush.cpp (renamed from src/AudioDevice.cpp) | 42 | ||||
-rw-r--r-- | src/AudioDevicePush.h | 54 | ||||
-rw-r--r-- | src/AudioRenderer.h | 2 |
7 files changed, 103 insertions, 65 deletions
diff --git a/sanear.vcxproj b/sanear.vcxproj index 4e92b8c..c4b6d1b 100644 --- a/sanear.vcxproj +++ b/sanear.vcxproj @@ -99,6 +99,7 @@ </ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="IGuidedReclock.h" />
+ <ClInclude Include="src\AudioDevicePush.h" />
<ClInclude Include="src\AudioDevice.h" />
<ClInclude Include="src\AudioDeviceManager.h" />
<ClInclude Include="src\DspBalance.h" />
@@ -127,7 +128,7 @@ <ClInclude Include="src\DspRate.h" />
</ItemGroup>
<ItemGroup>
- <ClCompile Include="src\AudioDevice.cpp" />
+ <ClCompile Include="src\AudioDevicePush.cpp" />
<ClCompile Include="src\AudioDeviceManager.cpp" />
<ClCompile Include="src\DspBalance.cpp" />
<ClCompile Include="src\DspCrossfeed.cpp" />
diff --git a/sanear.vcxproj.filters b/sanear.vcxproj.filters index b9da9e3..2c4a1de 100644 --- a/sanear.vcxproj.filters +++ b/sanear.vcxproj.filters @@ -60,10 +60,10 @@ <Filter>Renderer</Filter>
</ClCompile>
<ClCompile Include="src\AudioDeviceManager.cpp">
- <Filter>Renderer</Filter>
+ <Filter>Device</Filter>
</ClCompile>
- <ClCompile Include="src\AudioDevice.cpp">
- <Filter>Renderer</Filter>
+ <ClCompile Include="src\AudioDevicePush.cpp">
+ <Filter>Device</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
@@ -135,13 +135,16 @@ <ClInclude Include="src\SampleCorrection.h">
<Filter>Renderer</Filter>
</ClInclude>
+ <ClInclude Include="IGuidedReclock.h" />
<ClInclude Include="src\AudioDeviceManager.h">
- <Filter>Renderer</Filter>
+ <Filter>Device</Filter>
+ </ClInclude>
+ <ClInclude Include="src\AudioDevicePush.h">
+ <Filter>Device</Filter>
</ClInclude>
<ClInclude Include="src\AudioDevice.h">
- <Filter>Renderer</Filter>
+ <Filter>Device</Filter>
</ClInclude>
- <ClInclude Include="IGuidedReclock.h" />
</ItemGroup>
<ItemGroup>
<Filter Include="DirectShow">
@@ -159,5 +162,8 @@ <Filter Include="Processors\Base">
<UniqueIdentifier>{a3828985-2937-4570-8aa1-110935fd6227}</UniqueIdentifier>
</Filter>
+ <Filter Include="Device">
+ <UniqueIdentifier>{0fcfb96b-d55e-4bd8-9a08-2f45801291ce}</UniqueIdentifier>
+ </Filter>
</ItemGroup>
</Project>
\ No newline at end of file diff --git a/src/AudioDevice.h b/src/AudioDevice.h index f0cf902..43e8543 100644 --- a/src/AudioDevice.h +++ b/src/AudioDevice.h @@ -29,25 +29,22 @@ namespace SaneAudioRenderer bool ignoredSystemChannelMixer;
};
- class AudioDevice final
+ class AudioDevice
{
public:
- AudioDevice(std::shared_ptr<AudioDeviceBackend> backend);
- AudioDevice(const AudioDevice&) = delete;
- AudioDevice& operator=(const AudioDevice&) = delete;
- ~AudioDevice();
+ virtual ~AudioDevice() = default;
- void Push(DspChunk& chunk, CAMEvent* pFilledEvent);
- REFERENCE_TIME Finish(CAMEvent* pFilledEvent);
+ virtual void Push(DspChunk& chunk, CAMEvent* pFilledEvent) = 0;
+ virtual REFERENCE_TIME Finish(CAMEvent* pFilledEvent) = 0;
- int64_t GetPosition();
- int64_t GetEnd();
- int64_t GetSilence();
+ virtual int64_t GetPosition() = 0;
+ virtual int64_t GetEnd() = 0;
+ virtual int64_t GetSilence() = 0;
- void Start();
- void Stop();
- void Reset();
+ virtual void Start() = 0;
+ virtual void Stop() = 0;
+ virtual void Reset() = 0;
SharedString GetId() const { return m_backend->id; }
SharedString GetAdapterName() const { return m_backend->adapterName; }
@@ -67,29 +64,8 @@ namespace SaneAudioRenderer bool IgnoredSystemChannelMixer() const { return m_backend->ignoredSystemChannelMixer; }
- private:
-
- void RealtimeFeed();
- void SilenceFeed();
-
- void PushToDevice(DspChunk& chunk, CAMEvent* pFilledEvent);
- UINT32 PushSilenceToDevice(UINT32 frames);
- void PushToBuffer(DspChunk& chunk);
+ protected:
std::shared_ptr<AudioDeviceBackend> m_backend;
- std::atomic<uint64_t> m_pushedFrames = 0;
- std::atomic<uint64_t> m_silenceFrames = 0;
- int64_t m_eos = 0;
-
- std::thread m_thread;
- CAMEvent m_wake;
- CAMEvent m_woken;
- CCritSec m_threadBusyMutex;
- std::atomic<bool> m_exit = false;
- std::atomic<bool> m_error = false;
-
- std::deque<DspChunk> m_buffer;
- size_t m_bufferFrameCount = 0;
- CCritSec m_bufferMutex;
};
}
diff --git a/src/AudioDeviceManager.cpp b/src/AudioDeviceManager.cpp index 7b4cbf1..c605bfc 100644 --- a/src/AudioDeviceManager.cpp +++ b/src/AudioDeviceManager.cpp @@ -1,6 +1,7 @@ #include "pch.h"
#include "AudioDeviceManager.h"
+#include "AudioDevicePush.h"
#include "DspMatrix.h"
namespace SaneAudioRenderer
@@ -513,7 +514,7 @@ namespace SaneAudioRenderer try
{
- return std::unique_ptr<AudioDevice>(new AudioDevice(backend));
+ return std::unique_ptr<AudioDevice>(new AudioDevicePush(backend));
}
catch (std::bad_alloc&)
{
diff --git a/src/AudioDevice.cpp b/src/AudioDevicePush.cpp index 2987b2c..e9e2a4b 100644 --- a/src/AudioDevice.cpp +++ b/src/AudioDevicePush.cpp @@ -1,5 +1,5 @@ #include "pch.h"
-#include "AudioDevice.h"
+#include "AudioDevicePush.h"
namespace SaneAudioRenderer
{
@@ -14,11 +14,11 @@ namespace SaneAudioRenderer }
}
- AudioDevice::AudioDevice(std::shared_ptr<AudioDeviceBackend> backend)
- : m_backend(backend)
- , m_woken(TRUE/*manual reset*/)
+ AudioDevicePush::AudioDevicePush(std::shared_ptr<AudioDeviceBackend> backend)
+ : m_woken(TRUE/*manual reset*/)
{
- assert(m_backend);
+ assert(backend);
+ m_backend = backend;
if (static_cast<HANDLE>(m_wake) == NULL ||
static_cast<HANDLE>(m_woken) == NULL)
@@ -27,10 +27,10 @@ namespace SaneAudioRenderer }
if (m_backend->realtime)
- m_thread = std::thread(std::bind(&AudioDevice::RealtimeFeed, this));
+ m_thread = std::thread(std::bind(&AudioDevicePush::RealtimeFeed, this));
}
- AudioDevice::~AudioDevice()
+ AudioDevicePush::~AudioDevicePush()
{
m_exit = true;
m_wake.Set();
@@ -63,7 +63,7 @@ namespace SaneAudioRenderer m_backend = nullptr;
}
- void AudioDevice::Push(DspChunk& chunk, CAMEvent* pFilledEvent)
+ void AudioDevicePush::Push(DspChunk& chunk, CAMEvent* pFilledEvent)
{
assert(m_eos == 0);
@@ -82,7 +82,7 @@ namespace SaneAudioRenderer }
}
- REFERENCE_TIME AudioDevice::Finish(CAMEvent* pFilledEvent)
+ REFERENCE_TIME AudioDevicePush::Finish(CAMEvent* pFilledEvent)
{
if (m_error)
throw E_FAIL;
@@ -96,7 +96,7 @@ namespace SaneAudioRenderer if (!m_thread.joinable())
{
assert(!m_exit);
- m_thread = std::thread(std::bind(&AudioDevice::SilenceFeed, this));
+ m_thread = std::thread(std::bind(&AudioDevicePush::SilenceFeed, this));
}
}
catch (std::system_error&)
@@ -111,7 +111,7 @@ namespace SaneAudioRenderer return m_eos - GetPosition();
}
- int64_t AudioDevice::GetPosition()
+ int64_t AudioDevicePush::GetPosition()
{
UINT64 deviceClockFrequency, deviceClockPosition;
ThrowIfFailed(m_backend->audioClock->GetFrequency(&deviceClockFrequency));
@@ -120,27 +120,27 @@ namespace SaneAudioRenderer return llMulDiv(deviceClockPosition, OneSecond, deviceClockFrequency, 0);
}
- int64_t AudioDevice::GetEnd()
+ int64_t AudioDevicePush::GetEnd()
{
return llMulDiv(m_pushedFrames, OneSecond, m_backend->waveFormat->nSamplesPerSec, 0);
}
- int64_t AudioDevice::GetSilence()
+ int64_t AudioDevicePush::GetSilence()
{
return llMulDiv(m_silenceFrames, OneSecond, m_backend->waveFormat->nSamplesPerSec, 0);
}
- void AudioDevice::Start()
+ void AudioDevicePush::Start()
{
m_backend->audioClient->Start();
}
- void AudioDevice::Stop()
+ void AudioDevicePush::Stop()
{
m_backend->audioClient->Stop();
}
- void AudioDevice::Reset()
+ void AudioDevicePush::Reset()
{
if (!m_backend->realtime && m_thread.joinable())
{
@@ -175,7 +175,7 @@ namespace SaneAudioRenderer }
}
- void AudioDevice::RealtimeFeed()
+ void AudioDevicePush::RealtimeFeed()
{
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
TimePeriodHelper timePeriodHelper(1);
@@ -253,7 +253,7 @@ namespace SaneAudioRenderer }
}
- void AudioDevice::SilenceFeed()
+ void AudioDevicePush::SilenceFeed()
{
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL);
@@ -279,7 +279,7 @@ namespace SaneAudioRenderer }
}
- void AudioDevice::PushToDevice(DspChunk& chunk, CAMEvent* pFilledEvent)
+ void AudioDevicePush::PushToDevice(DspChunk& chunk, CAMEvent* pFilledEvent)
{
// Get up-to-date information on the device buffer.
UINT32 bufferFrames, bufferPadding;
@@ -312,7 +312,7 @@ namespace SaneAudioRenderer m_pushedFrames += doFrames;
}
- UINT32 AudioDevice::PushSilenceToDevice(UINT32 frames)
+ UINT32 AudioDevicePush::PushSilenceToDevice(UINT32 frames)
{
// Get up-to-date information on the device buffer.
UINT32 bufferFrames, bufferPadding;
@@ -337,7 +337,7 @@ namespace SaneAudioRenderer return doFrames;
}
- void AudioDevice::PushToBuffer(DspChunk& chunk)
+ void AudioDevicePush::PushToBuffer(DspChunk& chunk)
{
if (m_error)
throw E_FAIL;
diff --git a/src/AudioDevicePush.h b/src/AudioDevicePush.h new file mode 100644 index 0000000..12e3530 --- /dev/null +++ b/src/AudioDevicePush.h @@ -0,0 +1,54 @@ +#pragma once
+
+#include "AudioDevice.h"
+#include "DspChunk.h"
+#include "DspFormat.h"
+
+namespace SaneAudioRenderer
+{
+ class AudioDevicePush final
+ : public AudioDevice
+ {
+ public:
+
+ AudioDevicePush(std::shared_ptr<AudioDeviceBackend> backend);
+ AudioDevicePush(const AudioDevicePush&) = delete;
+ AudioDevicePush& operator=(const AudioDevicePush&) = delete;
+ ~AudioDevicePush();
+
+ void Push(DspChunk& chunk, CAMEvent* pFilledEvent) override;
+ REFERENCE_TIME Finish(CAMEvent* pFilledEvent) override;
+
+ int64_t GetPosition() override;
+ int64_t GetEnd() override;
+ int64_t GetSilence() override;
+
+ void Start() override;
+ void Stop() override;
+ void Reset() override;
+
+ private:
+
+ void RealtimeFeed();
+ void SilenceFeed();
+
+ void PushToDevice(DspChunk& chunk, CAMEvent* pFilledEvent);
+ UINT32 PushSilenceToDevice(UINT32 frames);
+ void PushToBuffer(DspChunk& chunk);
+
+ std::atomic<uint64_t> m_pushedFrames = 0;
+ std::atomic<uint64_t> m_silenceFrames = 0;
+ int64_t m_eos = 0;
+
+ std::thread m_thread;
+ CAMEvent m_wake;
+ CAMEvent m_woken;
+ CCritSec m_threadBusyMutex;
+ std::atomic<bool> m_exit = false;
+ std::atomic<bool> m_error = false;
+
+ std::deque<DspChunk> m_buffer;
+ size_t m_bufferFrameCount = 0;
+ CCritSec m_bufferMutex;
+ };
+}
diff --git a/src/AudioRenderer.h b/src/AudioRenderer.h index 826a9bc..de49436 100644 --- a/src/AudioRenderer.h +++ b/src/AudioRenderer.h @@ -1,7 +1,7 @@ #pragma once
-#include "AudioDeviceManager.h"
#include "AudioDevice.h"
+#include "AudioDeviceManager.h"
#include "DspBalance.h"
#include "DspCrossfeed.h"
#include "DspDither.h"
|