summaryrefslogtreecommitdiff
path: root/audio/Acx/Samples/Common/SimPeakMeter.cpp
diff options
context:
space:
mode:
authorAdonais Romero González <[email protected]>2024-05-06 16:21:31 -0700
committerGitHub <[email protected]>2024-05-06 16:21:31 -0700
commita74a241c664c4e1d7c0838287b34076c19d9858a (patch)
tree6ff7562612967b122acf8acf8a69c4dcfd5905db /audio/Acx/Samples/Common/SimPeakMeter.cpp
parentdef8e8e34ed2b7b1deb2fc9112ac4255f1a0f2ba (diff)
parent15477ce52bbb6b42ca591ecdfb484cac089f89ab (diff)
Merge develop changes prior to upcoming WDK release (May 2024)
Diffstat (limited to 'audio/Acx/Samples/Common/SimPeakMeter.cpp')
-rw-r--r--audio/Acx/Samples/Common/SimPeakMeter.cpp106
1 files changed, 106 insertions, 0 deletions
diff --git a/audio/Acx/Samples/Common/SimPeakMeter.cpp b/audio/Acx/Samples/Common/SimPeakMeter.cpp
new file mode 100644
index 00000000..0dfbd4e5
--- /dev/null
+++ b/audio/Acx/Samples/Common/SimPeakMeter.cpp
@@ -0,0 +1,106 @@
+/*++
+
+ THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
+ KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
+ PURPOSE.
+
+Module Name:
+
+ SimPeakMeter.cpp
+
+Abstract:
+
+ Virtual Peakmeter - aggregates all streams
+
+Environment:
+
+ Kernel mode
+
+--*/
+
+#include "private.h"
+#include "SimPeakMeter.h"
+
+#ifndef __INTELLISENSE__
+#include "SimPeakMeter.tmh"
+#endif
+
+_Use_decl_annotations_
+PAGED_CODE_SEG
+CSimPeakMeter::CSimPeakMeter()
+{
+ PAGED_CODE();
+ m_NumStreams = 0;
+ m_PeakMeterIndex = 0;
+}
+
+_Use_decl_annotations_
+PAGED_CODE_SEG
+CSimPeakMeter::~CSimPeakMeter()
+{
+ PAGED_CODE();
+}
+
+_Use_decl_annotations_
+PAGED_CODE_SEG
+LONG CSimPeakMeter::GetValue(ULONG Channel)
+{
+ PAGED_CODE();
+
+ // Ignore channel
+ UNREFERENCED_PARAMETER(Channel);
+
+#define PEAKMETER_VALUE_FULL (PEAKMETER_MAXIMUM / PEAKMETER_STEPPING_DELTA * PEAKMETER_STEPPING_DELTA)
+#define PEAKMETER_VALUE_HALF (PEAKMETER_MAXIMUM / 2 / PEAKMETER_STEPPING_DELTA * PEAKMETER_STEPPING_DELTA)
+#define PEAKMETER_VALUE_QUARTER (PEAKMETER_MAXIMUM / 4 / PEAKMETER_STEPPING_DELTA * PEAKMETER_STEPPING_DELTA)
+#define PEAKMETER_VALUE_ONE_EIGTH (PEAKMETER_MAXIMUM / 8 / PEAKMETER_STEPPING_DELTA * PEAKMETER_STEPPING_DELTA)
+
+ LONG PeakMeterValues[] = {
+ PEAKMETER_VALUE_ONE_EIGTH,
+ PEAKMETER_VALUE_QUARTER,
+ PEAKMETER_VALUE_HALF,
+ PEAKMETER_VALUE_FULL,
+ PEAKMETER_VALUE_HALF,
+ PEAKMETER_VALUE_QUARTER
+ };
+
+ if (m_NumStreams)
+ {
+ LONG pmi = InterlockedIncrement(&m_PeakMeterIndex);
+ if (pmi == ARRAYSIZE(PeakMeterValues))
+ {
+ pmi = 0;
+ InterlockedExchange(&m_PeakMeterIndex, 0);
+ }
+
+ return PeakMeterValues[pmi];
+ }
+
+ //
+ // No active streams. Peak meter = 0
+ //
+ return 0;
+}
+
+_Use_decl_annotations_
+PAGED_CODE_SEG
+NTSTATUS CSimPeakMeter::StartStream()
+{
+ PAGED_CODE();
+ InterlockedIncrement(&m_NumStreams);
+
+ return STATUS_SUCCESS;
+}
+
+_Use_decl_annotations_
+PAGED_CODE_SEG
+NTSTATUS CSimPeakMeter::StopStream()
+{
+ PAGED_CODE();
+
+ ASSERT(m_NumStreams);
+ InterlockedDecrement(&m_NumStreams);
+
+ return STATUS_SUCCESS;
+}