С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
2 / 2 / 0
Регистрация: 16.02.2019
Сообщений: 68

WASAPI Как можно получить звук отдельного приложения?

22.08.2020, 21:52. Показов 2372. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Кто нибудь знает как можно получить звук отдельного приложения?
Например есть интерфейс IAudioSessionManager2, с помощью которого можно получить интерфейс IAudioSessionControl для каждого процесса со звуком. Но с помощью IAudioSessionControl нельзя считывать звук, для этого нужен IAudioClient, но его нельзя получить (или я не знаю как) из IAudioSessionControl.
HELP ME PLEASE
Скорее всего мало кто поймёт что мне надо с первого раза, так что задавайте вопросы пж.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.08.2020, 21:52
Ответы с готовыми решениями:

Как получить значение отдельного нода в treeview?
как получить значение отдельного нода в treeview через messageBox в LINQ to Xml? private void treeView1_AfterSelect(object sender,...

Как можно реализовать запрет чтения и записи для отдельного (специально заданного) USB-флеш-накопителя?
Приветствую всех! После долгих поисков в интернете возник очень интересный вопрос: Как можно реализовать блокировку отдельного(специально...

Можно ли получить исходный код приложения
Имею приложение,под ios,но по некоторым обстоятельствам не имею исходный код,можно ли как нибудь мне его достать?за ранее спасибо

9
 Аватар для Annemesski
2670 / 1333 / 479
Регистрация: 08.11.2016
Сообщений: 3,682
24.08.2020, 18:04
qwert21, IAudioClient::Initialize глядим в последний параметр.
1
2 / 2 / 0
Регистрация: 16.02.2019
Сообщений: 68
24.08.2020, 20:41  [ТС]
А как можно получить нужный GUID сессии?
0
 Аватар для Annemesski
2670 / 1333 / 479
Регистрация: 08.11.2016
Сообщений: 3,682
25.08.2020, 08:11
qwert21, так.
1
2 / 2 / 0
Регистрация: 16.02.2019
Сообщений: 68
25.08.2020, 10:16  [ТС]
Цитата Сообщение от Annemesski Посмотреть сообщение
так
Спасибо это помогло:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
HRESULT hr;
IMMDevice* pDevice;
IAudioClient* pClient;
IAudioSessionControl* psControl;
 
...
 
pDevice->Activate(__uuidof(IAudioClient), CLSCTX_ALL, NULL, (void**)&pClient);
 
WAVEFORMATEX* pwfx;
pClient->GetMixFormat(&pwfx);
 
GUID sGUID;
psControl->GetGroupingParam(&sGUID);
 
hr = pClient->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_CROSSPROCESS, 10000 * 10, 0, pwfx, &sGUID); //No error
Но есть ещё проблема как можно считывать данные с IAudioClient?
Через IAudioCaptureClient не получается:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
HRESULT hr;
IMMDevice* pDevice;
IMMDeviceEnumerator* pEnumerator;
 
hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pEnumerator));
 
pEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &pDevice);
 
...
 
IAudioCaptureClient* pCapClient;
hr = pClient->GetService(__uuidof(IAudioCaptureClient), (void**)&pCapClient);
// Возвращает AUDCLNT_E_WRONG_ENDPOINT_TYPE
Получается для устройства с параметром eRender нельзя использовать IAudioCaptureClient.
Можно как-то это сделать по-другому?
0
 Аватар для Annemesski
2670 / 1333 / 479
Регистрация: 08.11.2016
Сообщений: 3,682
25.08.2020, 14:35
Между строками 8 - 12:
C++
1
pDevice->Activate(__uuidof(IAudioClient), CLSCTX_ALL, NULL, (void**)&pClient);
0
2 / 2 / 0
Регистрация: 16.02.2019
Сообщений: 68
25.08.2020, 17:29  [ТС]
C++
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#define _CRT_SECURE_NO_WARNINGS
 
#include <iostream>
#include <stdlib.h>
#include <windows.h>
#include <audioclient.h>
#include <audiopolicy.h>
#include <mmdeviceapi.h>
#include <Functiondiscoverykeys.h>
 
using namespace std;
 
void getError(HRESULT hr) {
    switch (hr) {
    case E_POINTER:
        cout << "E_POINTER" << endl;
        break;
    case E_NOINTERFACE:
        cout << "E_NOINTERFACE" << endl;
        break;
    case AUDCLNT_E_NOT_INITIALIZED:
        cout << "AUDCLNT_E_NOT_INITIALIZED" << endl;
        break;
    case AUDCLNT_E_WRONG_ENDPOINT_TYPE:
        cout << "AUDCLNT_E_WRONG_ENDPOINT_TYPE" << endl;
        break;
    case AUDCLNT_E_DEVICE_INVALIDATED:
        cout << "AUDCLNT_E_DEVICE_INVALIDATED" << endl;
        break;
    case AUDCLNT_E_SERVICE_NOT_RUNNING:
        cout << "AUDCLNT_E_SERVICE_NOT_RUNNING" << endl;
        break;
    case S_OK:
        cout << "S_OK" << endl;
        break;
    default:
        cout << "UNKNOWN" << endl;
    }
}
 
IMMDeviceEnumerator* pEnumerator;
IMMDevice* pDevice;
IPropertyStore* pStore;
PROPVARIANT              PV;
IAudioSessionManager2* pManager;
IAudioSessionEnumerator* psEnumerator;
IAudioClient* pClient;
 
HRESULT                  hr;
 
int main()
{
    SetConsoleCP(CP_UTF8);
    SetConsoleOutputCP(CP_UTF8);
 
    hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); // Инициализирует библиотеку COM
    if (FAILED(hr))
    {
        printf("CoInitializeEx: %x\n", hr);
        return -1;
    }
 
    hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pEnumerator)); // Получаем IMMDeviceEnumerator
    if (FAILED(hr))
    {
        printf("CoCreateInstance: %x\n", hr);
        return -1;
    }
 
    pEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &pDevice); // Извлекает конечное устройство по умолчанию (eRender - динамики)
 
    pDevice->OpenPropertyStore(STGM_READ, &pStore);  // Получаем
    pStore->GetValue(PKEY_Device_FriendlyName, &PV); // имя устройства
 
    if (PV.vt != VT_LPWSTR) {
        cout << "Error get device friendly name" << endl; 
        return -1;
    }
    wprintf(L"Device name: %s\n\n", PV.pwszVal);
 
    PropVariantClear(&PV);
 
    pDevice->Activate(__uuidof(IAudioSessionManager2), CLSCTX_INPROC_SERVER, NULL, (void**)&pManager); // Получаем
    pManager->GetSessionEnumerator(&psEnumerator);                                                     // список сессий
 
    int sCount;
    psEnumerator->GetCount(&sCount); // Кол-во сессий
 
    for (int i = 0; i < sCount; i++) {
        IAudioSessionControl* psControl;
        AudioSessionState sState;
        LPWSTR psName;
 
        psEnumerator->GetSession(i, &psControl); // Получаем интерфейс IAudioSessionControl для i-той сессии
 
        psControl->GetDisplayName(&psName); // Получаем имя сессии
 
        psControl->GetState(&sState); // Состояние сессии
 
        wprintf(L"%d. %s ", i + 1, psName);
 
        if (sState == AudioSessionStateActive) {
            cout << "(active)" << endl;
        }
        if (sState == AudioSessionStateInactive) {
            cout << "(inactive)" << endl;
        }
        if (sState == AudioSessionStateExpired) {
            cout << "(expired)" << endl;
        }
 
        if (wcscmp(psName, L"Mozilla Firefox")) // Мне нужна сессия Mozill'ы
            continue;
 
        GUID sGUID;
        WAVEFORMATEX* pwfx;
        IAudioCaptureClient* pCapClient;
        REFERENCE_TIME hnsDuration;
 
        psControl->GetGroupingParam(&sGUID); // Получаем GUID
 
        pDevice->Activate(__uuidof(IAudioClient), CLSCTX_ALL, NULL, (void**)&pClient); // Получаем IAudioClient
 
        pClient->GetMixFormat(&pwfx);                 // Получаем
        pClient->GetDevicePeriod(NULL, &hnsDuration); // "формат данных"
        //continue;
        hr = pClient->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_CROSSPROCESS, hnsDuration, hnsDuration, pwfx, &sGUID); // Инициализируем IAudioClient с нужным GUID
        if (FAILED(hr)) {
            cout << "Error initialize IAudioClient" << endl;
            continue;
        }
        
        hr = pClient->GetService(__uuidof(IAudioCaptureClient), (void**)&pCapClient); // Получаем IAudioCaptureClient
        if (FAILED(hr)) {
            getError(hr); // Выдаёт ошибку "AUDCLNT_E_WRONG_ENDPOINT_TYPE", т.к. в строке 70 указан параметр eRender
            continue;
        }
    }
    return 0;
}
Выдаёт ошибку "AUDCLNT_E_WRONG_ENDPOINT_TYPE", т.к. в строке 70 указан параметр eRender
Что делать?
0
 Аватар для Annemesski
2670 / 1333 / 479
Регистрация: 08.11.2016
Сообщений: 3,682
25.08.2020, 17:36
qwert21, поставить параметр eCapture?
0
2 / 2 / 0
Регистрация: 16.02.2019
Сообщений: 68
25.08.2020, 18:04  [ТС]
Тогда я получу устройство записи (микрофон), а мне нужны динамики
0
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,097
25.08.2020, 18:22
Сам никогда такого не делал, но может этот раздел документации поможет Loopback Recording?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.08.2020, 18:22
Помогаю со студенческими работами здесь

Можно ли получить исходный код скомпилированного приложения
Есть приложение, скомпилированое нужно с него достать исходник))) Как это сделать?

Звук воспроизводится с задержкой (при этом виснут приложения где звук)
Кажется, будто что-то мешает воспроизведению аудио. И это происходит не всегда. Например, появляется какое-то уведомление, а его звук лишь...

Подключение библиотек отдельного приложения android
Здравствуйте, такой вопрос есть приложение которое представляет с собой сервис и требует отдельной установки в примере работы...

Запуск отдельного приложения под VPN
Привет. Чтобы мне удаленно работать по rdp, нужно запускать OpenVPN, который блочит все, кроме самого rdp. Проблема: Мне в работе...

Какой программой можно получить названия и значения переменных отлаживаемого приложения?
Подскажите, с помощью какой программы можно получить названия и значения переменных отлаживаемого (активного) приложения в определенный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru