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:
-rw-r--r--src/AudioDevice.h2
-rw-r--r--src/AudioRenderer.cpp30
-rw-r--r--src/AudioRenderer.h13
-rw-r--r--src/MyClock.cpp19
-rw-r--r--src/MyClock.h2
5 files changed, 38 insertions, 28 deletions
diff --git a/src/AudioDevice.h b/src/AudioDevice.h
index 86a30d9..f0cf902 100644
--- a/src/AudioDevice.h
+++ b/src/AudioDevice.h
@@ -63,7 +63,6 @@ namespace SaneAudioRenderer
REFERENCE_TIME GetStreamLatency() const { return m_backend->latency; }
bool IsExclusive() const { return m_backend->exclusive; }
- bool IsBitstream() const { return m_backend->bitstream; }
bool IsRealtime() const { return m_backend->realtime; }
bool IgnoredSystemChannelMixer() const { return m_backend->ignoredSystemChannelMixer; }
@@ -76,7 +75,6 @@ namespace SaneAudioRenderer
void PushToDevice(DspChunk& chunk, CAMEvent* pFilledEvent);
UINT32 PushSilenceToDevice(UINT32 frames);
void PushToBuffer(DspChunk& chunk);
- void RetrieveFromBuffer(DspChunk& chunk);
std::shared_ptr<AudioDeviceBackend> m_backend;
std::atomic<uint64_t> m_pushedFrames = 0;
diff --git a/src/AudioRenderer.cpp b/src/AudioRenderer.cpp
index ec400a0..d60a6e0 100644
--- a/src/AudioRenderer.cpp
+++ b/src/AudioRenderer.cpp
@@ -61,20 +61,6 @@ namespace SaneAudioRenderer
}
}
- bool AudioRenderer::OnExternalClock()
- {
- CAutoLock objectLock(this);
-
- return m_externalClock;
- }
-
- bool AudioRenderer::IsLive()
- {
- CAutoLock objectLock(this);
-
- return m_live;
- }
-
bool AudioRenderer::Push(IMediaSample* pSample, AM_SAMPLE2_PROPERTIES& sampleProps, CAMEvent* pFilledEvent)
{
DspChunk chunk;
@@ -101,7 +87,7 @@ namespace SaneAudioRenderer
ApplyClockCorrection();
// Apply dsp chain.
- if (m_device && !m_device->IsBitstream())
+ if (m_device && !IsBitstreaming())
{
auto f = [&](DspBase* pDsp)
{
@@ -113,7 +99,7 @@ namespace SaneAudioRenderer
DspChunk::ToFormat(m_device->GetDspFormat(), chunk);
}
- if (m_device && !m_device->IsBitstream() && m_state == State_Running)
+ if (m_device && !IsBitstreaming() && m_state == State_Running)
{
if (m_device->IsRealtime())
{
@@ -161,7 +147,7 @@ namespace SaneAudioRenderer
try
{
// Apply dsp chain.
- if (m_device && !m_device->IsBitstream())
+ if (m_device && !IsBitstreaming())
{
auto f = [&](DspBase* pDsp)
{
@@ -290,6 +276,8 @@ namespace SaneAudioRenderer
m_sampleCorrection.NewFormat(inputFormat);
ClearDevice();
+
+ m_bitstreaming = (DspFormatFromWaveFormat(*inputFormat) == DspFormat::Unknown);
}
void AudioRenderer::NewSegment(double rate)
@@ -361,7 +349,7 @@ namespace SaneAudioRenderer
std::vector<std::wstring> ret;
- if (m_inputFormat && m_device && !m_device->IsBitstream())
+ if (m_inputFormat && m_device && !IsBitstreaming())
{
auto f = [&](DspBase* pDsp)
{
@@ -511,7 +499,7 @@ namespace SaneAudioRenderer
assert(m_state == State_Running);
assert(m_device->GetEnd() == 0);
- if (m_device->IsBitstream())
+ if (IsBitstreaming())
return;
// Try to keep inevitable clock jerking to a minimum after re-slaving.
@@ -564,7 +552,7 @@ namespace SaneAudioRenderer
{
CAutoLock objectLock(this);
assert(m_device);
- assert(!m_device->IsBitstream());
+ assert(!IsBitstreaming());
assert(m_device->IsRealtime());
assert(m_state == State_Running);
@@ -682,7 +670,7 @@ namespace SaneAudioRenderer
assert(m_inputFormat);
assert(m_device);
- if (m_device->IsBitstream())
+ if (IsBitstreaming())
return;
const auto inRate = m_inputFormat->nSamplesPerSec;
diff --git a/src/AudioRenderer.h b/src/AudioRenderer.h
index d90a4f7..e0e6d35 100644
--- a/src/AudioRenderer.h
+++ b/src/AudioRenderer.h
@@ -28,9 +28,6 @@ namespace SaneAudioRenderer
~AudioRenderer();
void SetClock(IReferenceClock* pClock);
- bool OnExternalClock();
-
- bool IsLive();
bool Push(IMediaSample* pSample, AM_SAMPLE2_PROPERTIES& sampleProps, CAMEvent* pFilledEvent);
bool Finish(bool blockUntilEnd, CAMEvent* pFilledEvent);
@@ -58,6 +55,10 @@ namespace SaneAudioRenderer
void TakeGuidedReclock(REFERENCE_TIME offset) { m_guidedReclockOffset += offset; }
+ bool OnExternalClock() const { return m_externalClock; }
+ bool IsLive() const { return m_live; }
+ bool IsBitstreaming() const { return m_bitstreaming; }
+
private:
void CheckDeviceSettings();
@@ -98,10 +99,12 @@ namespace SaneAudioRenderer
MyClock& m_myClock;
IReferenceClockPtr m_graphClock;
- bool m_externalClock = false;
+
+ std::atomic<bool> m_externalClock = false;
+ std::atomic<bool> m_live = false;
+ std::atomic<bool> m_bitstreaming = false;
SharedWaveFormat m_inputFormat;
- bool m_live = false;
REFERENCE_TIME m_startClockOffset = 0;
REFERENCE_TIME m_startTime = 0;
diff --git a/src/MyClock.cpp b/src/MyClock.cpp
index b10c971..e5ed900 100644
--- a/src/MyClock.cpp
+++ b/src/MyClock.cpp
@@ -24,6 +24,9 @@ namespace SaneAudioRenderer
{
CAutoLock lock(this);
+ if (m_guidedReclockSlaving && !CanDoGuidedReclock())
+ UnslaveClock();
+
if (m_guidedReclockSlaving)
{
auto getGuidedReclockTime = [this](int64_t counterTime)
@@ -132,6 +135,9 @@ namespace SaneAudioRenderer
{
CAutoLock lock(this);
+ if (!CanDoGuidedReclock())
+ return E_FAIL;
+
int64_t time;
ReturnIfFailed(GetTime(&time));
@@ -147,6 +153,9 @@ namespace SaneAudioRenderer
{
CAutoLock lock(this);
+ if (!m_guidedReclockSlaving)
+ return S_FALSE;
+
GetPrivateTime();
m_guidedReclockSlaving = false;
@@ -157,6 +166,9 @@ namespace SaneAudioRenderer
{
CAutoLock lock(this);
+ if (!CanDoGuidedReclock())
+ return E_FAIL;
+
m_audioOffset += offset;
m_counterOffset += offset;
m_guidedReclockStartClock += offset;
@@ -174,4 +186,11 @@ namespace SaneAudioRenderer
return S_OK;
}
+
+ bool MyClock::CanDoGuidedReclock()
+ {
+ return !m_renderer->IsBitstreaming() &&
+ !m_renderer->OnExternalClock() &&
+ !m_renderer->IsLive();
+ }
}
diff --git a/src/MyClock.h b/src/MyClock.h
index a209746..31ad742 100644
--- a/src/MyClock.h
+++ b/src/MyClock.h
@@ -35,6 +35,8 @@ namespace SaneAudioRenderer
private:
+ bool CanDoGuidedReclock();
+
int64_t GetCounterTime() { return llMulDiv(GetPerformanceCounter(), OneSecond, m_performanceFrequency, 0); }
const std::unique_ptr<AudioRenderer>& m_renderer;