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

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

22.08.2020, 21:52. Показов 2453. Ответов 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
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,693
24.08.2020, 18:04
qwert21, IAudioClient::Initialize глядим в последний параметр.
1
2 / 2 / 0
Регистрация: 16.02.2019
Сообщений: 68
24.08.2020, 20:41  [ТС]
А как можно получить нужный GUID сессии?
0
 Аватар для Annemesski
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,693
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
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,693
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
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,693
25.08.2020, 17:36
qwert21, поставить параметр eCapture?
0
2 / 2 / 0
Регистрация: 16.02.2019
Сообщений: 68
25.08.2020, 18:04  [ТС]
Тогда я получу устройство записи (микрофон), а мне нужны динамики
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,118
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
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru