summaryrefslogtreecommitdiff
path: root/audio/Acx/Samples/Common/SimPeakMeter.cpp
diff options
context:
space:
mode:
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;
+}