1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
//
// Swap.cpp -- Copyright (c) Microsoft Corporation. All rights reserved.
//
// Description:
//
// Implementation of SwapSamples
//
#include <atlbase.h>
#include <atlcom.h>
#include <atlcoll.h>
#include <atlsync.h>
#include <mmreg.h>
#include <audioenginebaseapo.h>
#include <baseaudioprocessingobject.h>
#include <resource.h>
#include <float.h>
#include "SwapAPO.h"
#pragma AVRT_CODE_BEGIN
void WriteSilence(
_Out_writes_(u32FrameCount * u32SamplesPerFrame)
FLOAT32 *pf32Frames,
UINT32 u32FrameCount,
UINT32 u32SamplesPerFrame )
{
ZeroMemory(pf32Frames, sizeof(FLOAT32) * u32FrameCount * u32SamplesPerFrame);
}
#pragma AVRT_CODE_END
#pragma AVRT_CODE_BEGIN
void CopyFrames(
_Out_writes_(u32FrameCount * u32SamplesPerFrame)
FLOAT32 *pf32OutFrames,
_In_reads_(u32FrameCount * u32SamplesPerFrame)
const FLOAT32 *pf32InFrames,
UINT32 u32FrameCount,
UINT32 u32SamplesPerFrame )
{
CopyMemory(pf32OutFrames, pf32InFrames, sizeof(FLOAT32) * u32FrameCount * u32SamplesPerFrame);
}
#pragma AVRT_CODE_END
#pragma AVRT_CODE_BEGIN
void ProcessSwap(
FLOAT32 *pf32OutputFrames,
const FLOAT32 *pf32InputFrames,
UINT32 u32ValidFrameCount,
UINT32 u32SamplesPerFrame )
{
UINT32 u32SampleIndex;
FLOAT32 fSwap32;
ASSERT_REALTIME();
ATLASSERT( IS_VALID_TYPED_READ_POINTER(pf32InputFrames) );
ATLASSERT( IS_VALID_TYPED_WRITE_POINTER(pf32OutputFrames) );
// loop through samples
while (u32ValidFrameCount--)
{
for (u32SampleIndex=0; u32SampleIndex+1<u32SamplesPerFrame; u32SampleIndex += 2)
{
// apply swap
fSwap32 = *pf32InputFrames;
*pf32OutputFrames = *(pf32InputFrames + 1);
pf32OutputFrames++;
*pf32OutputFrames = fSwap32;
pf32OutputFrames++;
pf32InputFrames += 2;
}
}
}
#pragma AVRT_CODE_END
#pragma AVRT_CODE_BEGIN
void ProcessSwapScale(
FLOAT32 *pf32OutputFrames,
const FLOAT32 *pf32InputFrames,
UINT32 u32ValidFrameCount,
UINT32 u32SamplesPerFrame,
FLOAT32 *pf32Coefficients )
{
UINT32 u32SampleIndex;
FLOAT32 fSwap32;
ASSERT_REALTIME();
ATLASSERT( IS_VALID_TYPED_READ_POINTER(pf32InputFrames) );
ATLASSERT( IS_VALID_TYPED_READ_POINTER(pf32OutputFrames) );
// loop through samples
while (u32ValidFrameCount--)
{
for (u32SampleIndex=0; u32SampleIndex+1<u32SamplesPerFrame; u32SampleIndex += 2)
{
// apply swap for each stereo pair and scale
// save left channel
fSwap32 = *pf32InputFrames;
// left output equals right input times 1st coefficient
*pf32OutputFrames = *(pf32InputFrames + 1) * pf32Coefficients[u32SampleIndex];
pf32OutputFrames++;
// right output equals left input times 2nd coefficient
*pf32OutputFrames = fSwap32 * pf32Coefficients[u32SampleIndex+1];
pf32OutputFrames++;
pf32InputFrames += 2;
}
}
}
#pragma AVRT_CODE_END
|