summaryrefslogtreecommitdiff
path: root/audio/tests/HLK/ThirdPartyApoTests/APOOSUpgradeTest.cpp
blob: 9fc5ae4512577c9372addc65c523371d0f00b3d3 (plain)
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
#include <stdafx.h>

#include <initguid.h>
#include "propkey.h"
#include <AudioClient.h>
#include <SpatialAudioClient.h>
#include <functiondiscoverykeys.h>
#include <DevPKey.h>
#include <AudioEngineBaseAPOP.h>
#include "TestMediaType.h"
#include <audioenginebaseapo.h>
#include <MMDeviceAPI.h>
#include <MMDeviceAPIP.h>

#include <WexTestClass.h>

#include <list>
#include <memory>
#include <ctime>
#include <thread>
#include <future>
#include <mutex>
#include <functional>
#include <atlbase.h>

#include "APOOSUpgradeTest.h"
#include "APOStressTest.h"
#include "sinewave.h"

using namespace std;
using namespace wil;
using namespace WEX::Logging;
using namespace WEX::Common;

#define IF_FAILED_RETURN(hr) { HRESULT hrCode = hr; if(FAILED(hrCode)) { return hrCode; } }
#define IF_SUCCEEDED(hr) { HRESULT hrCode = hr; if (!(hrCode == S_OK || hrCode == AUDCLNT_E_WRONG_ENDPOINT_TYPE)) { VERIFY_SUCCEEDED(hrCode); } }

bool SetupSkipRTHeap();
bool CleanupSkipRTHeap();

bool CAPOUpgradeTest::setUpMethod()
{
    return SetupSkipRTHeap();
}

bool CAPOUpgradeTest::tearDownMethod()
{
    return CleanupSkipRTHeap();
}

void CAPOUpgradeTest::TestUpgrade()
{
    UINT cDevices = 0;
    com_ptr_nothrow<IMMDeviceEnumerator> spEnumerator;
    com_ptr_nothrow<IMMDeviceCollection> spDevices;

    VERIFY_SUCCEEDED(CoCreateInstance(__uuidof(MMDeviceEnumerator), nullptr, CLSCTX_ALL, IID_PPV_ARGS(&spEnumerator)));
    VERIFY_SUCCEEDED(spEnumerator->EnumAudioEndpoints(eAll, DEVICE_STATE_ACTIVE, &spDevices));
    VERIFY_SUCCEEDED(spDevices->GetCount(&cDevices));

    for (UINT i = 0; i < cDevices; i++)
    {
        com_ptr_nothrow<IMMDevice> pDevice = nullptr;
        com_ptr_nothrow<IAudioClient2> pAudioClient = nullptr;
        com_ptr_nothrow<IMMEndpoint> pEndpoint = nullptr;
        BOOL bOffloadCapable = FALSE;
        EDataFlow eFlow = eAll;

        VERIFY_SUCCEEDED(spDevices->Item(i, &pDevice));

        VERIFY_SUCCEEDED(com_query_to_nothrow(pDevice, &pEndpoint));
        VERIFY_SUCCEEDED(pEndpoint->GetDataFlow(&eFlow));

        VERIFY_SUCCEEDED(pDevice->Activate(__uuidof(IAudioClient2), CLSCTX_ALL, NULL, (void**)&pAudioClient));
        VERIFY_SUCCEEDED(pAudioClient->IsOffloadCapable(AudioCategory_Media, &bOffloadCapable));

        if (eFlow == eAll || eFlow == eRender)
        {
            VERIFY_SUCCEEDED(BasicAudioStreaming(pDevice.get()));

            VERIFY_SUCCEEDED(BasicSpatialAudio(pDevice.get()));

            VERIFY_SUCCEEDED(BasicAudioLoopback(pDevice.get()));

            if (bOffloadCapable)
            {
                VERIFY_SUCCEEDED(BasicOffloadStreaming(pDevice.get()));
            }
        }
        
        if (eFlow == eAll || eFlow == eCapture)
        {
            VERIFY_SUCCEEDED(BasicAudioCapture(pDevice.get()));
        }
    }
}