Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/sanear.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Marsev <alex.marsev@gmail.com>2016-01-24 08:19:26 +0300
committerAlex Marsev <alex.marsev@gmail.com>2016-01-26 14:03:18 +0300
commitacd97e3cec98a6100afdbddbb20fe0c64ddcab3e (patch)
tree0b20af2ad8dbd429a951c76842ff3f2a24c3a526
parent6927511f3610bdc889959f17739ba760029989de (diff)
Add base audio device class
In preparation for event mode audio device support.
-rw-r--r--sanear.vcxproj3
-rw-r--r--sanear.vcxproj.filters18
-rw-r--r--src/AudioDevice.h46
-rw-r--r--src/AudioDeviceManager.cpp3
-rw-r--r--src/AudioDevicePush.cpp (renamed from src/AudioDevice.cpp)42
-rw-r--r--src/AudioDevicePush.h54
-rw-r--r--src/AudioRenderer.h2
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"