forked from m-garanin/zgui-qt
/
utils.cpp
124 lines (99 loc) · 3.2 KB
/
utils.cpp
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
115
116
117
118
119
120
121
122
123
124
#include "utils.h"
#include <QAudioDeviceInfo>
#include <QCamera>
#include <QString>
#include <QDebug>
#ifdef Q_OS_WIN32
#include <comdef.h>
#include <comutil.h>
#include <dshow.h>
QStringList getCaptureDevices(GUID catGuid);
#endif
QStringList getAudioCaptureDevicesQt()
{
QStringList result = QStringList() << "AS-A" << "AS-B";
QList<QAudioDeviceInfo> l = QAudioDeviceInfo::availableDevices(QAudio::AudioInput);
foreach (QAudioDeviceInfo devInfo, l) {
result << devInfo.deviceName();
}
return result;
}
QStringList getVideoCaptureDevicesQt()
{
QStringList result = QStringList() << "VS-A" << "VS-B";
QList<QByteArray> l = QCamera::availableDevices();
foreach (QByteArray devInfo, l) {
//result << QCamera::deviceDescription(devInfo); // returns device name like "USB2.0 Camera" under Ubuntu 12.04 (Qt5)
result << devInfo; // returns device filename under Ubuntu 12.04 (Qt5), like /dev/videoX
}
return result;
}
// âîçâðàùàåò ñïèñîê óñòðîéñòâ âèäåî-çàõâàòà â ôîðìàòå json
QStringList getVideoCaptureDevices()
{
#ifdef Q_OS_WIN32
return getCaptureDevices(CLSID_VideoInputDeviceCategory);
#elif defined Q_OS_UNIX
return getVideoCaptureDevicesQt();
#endif
}
// âîçâðàùàåò ñïèñîê óñòðîéñòâ àóäèî-çàõâàòà â ôîðìàòå json
QStringList getAudioCaptureDevices()
{
//return getCaptureDevices(CLSID_AudioInputDeviceCategory);
return getAudioCaptureDevicesQt();
}
#ifdef Q_OS_WIN32
QStringList getCaptureDevices(GUID catGuid) //, QList<IMoniker*>& monList)
{
// Create the System Device Enumerator.
QStringList list;
HRESULT hr;
ICreateDevEnum *pDevEnum = NULL;
IEnumMoniker *pEnum = NULL;
// òåñò-èñòî÷íèêè
if( catGuid == CLSID_VideoInputDeviceCategory){
list.append("VS-A");
list.append("VS-B");
}else{
list.append("AS-A");
list.append("AS-B");
}
//
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum, (void **)&pDevEnum);
//CHECK(hr, "create SystemDeviceEnum");
// çàïîëíåíèå ñïèñêà âèäåî-èñòî÷íèêîâ
hr = pDevEnum->CreateClassEnumerator(catGuid,&pEnum, 0);
//CHECK(hr, "create ClassEnumerator");
if(pEnum == NULL)
qDebug() << "bad pEnum";
IMoniker *pMoniker = NULL;
while ( (pEnum != NULL) && pEnum->Next(1, &pMoniker, NULL) == S_OK)
{
IPropertyBag *pPropBag;
hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropBag);
if (SUCCEEDED(hr))
{
// To retrieve the filter's friendly name, do the following:
VARIANT varName;
VariantInit(&varName);
hr = pPropBag->Read(L"FriendlyName", &varName, 0);
if (SUCCEEDED(hr))
{
char* pN = _com_util::ConvertBSTRToString(varName.bstrVal);
QString txt = QString::fromLocal8Bit(pN); // èíà÷å êðàêîçÿáðû âìåñòî êèðèëëèöû
list.append(txt);
}
VariantClear(&varName);
pPropBag->Release();
}
pMoniker->Release();
}
if(pEnum != NULL)
pEnum->Release();
if(pDevEnum != NULL)
pDevEnum->Release();
return list;
}
#endif