170 похожих чатов

Приветствую! Хочу поменять частоту дискретизации аудиоустройства Скажите, пожалуйста, что я делаю не

так?



#define INITGUID
#include <MMDeviceAPI.h>
#include <endpointvolume.h>
#include <audioclient.h>
#include <Functiondiscoverykeys_devpkey.h>
#include <locale.h>
#include <string>
#include <iostream>


#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "strmiids.lib")
#pragma comment(lib, "quartz.lib")
#pragma comment(lib, "uuid.lib")

int changer()
{
setlocale(LC_ALL, "Russian");

HRESULT hr = CoInitialize(NULL);
if (FAILED(hr)) { printf("CoInitialize fail: HRESULT 0x%x", hr); return 1; }

IMMDeviceEnumerator* deviceEnumerator = NULL;
IMMDeviceCollection* deviceCollection = NULL;
IMMDevice* dev = NULL;
IPropertyStore* propertyStore = NULL;
WAVEFORMATEX wex, newWex; //буфер для данных о формате

WAVEFORMATEX pcmWaveFormat;

DWORD dwMode = STGM_READWRITE;

hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&deviceEnumerator));
if (FAILED(hr)) { printf("CoCreateInstance fail: HRESULT 0x%x", hr); goto End; }
hr = deviceEnumerator->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, &deviceCollection);
if (FAILED(hr)) { printf("EnumAudioEndpoints fail: HRESULT 0x%x", hr); goto End; }

UINT deviceCount;
hr = deviceCollection->GetCount(&deviceCount);
if (FAILED(hr)) { printf("GetCount fail: HRESULT 0x%x", hr); goto End; }

for (UINT DeviceIndex = 0; DeviceIndex < deviceCount; DeviceIndex++)
{

PROPVARIANT format, newFormat{}, checkFormat;
deviceCollection->Item(DeviceIndex, &dev);


if (DeviceIndex != 0) { goto Next; }

if (FAILED(hr)) { printf("Item fail: 0x%x\n", hr); goto Next; }

hr = dev->OpenPropertyStore(dwMode, &propertyStore);
if (FAILED(hr)) { printf("Can't open property store: HRESULT 0x%x", hr); goto Next; }

PROPVARIANT friendlyName;
PropVariantInit(&friendlyName);
hr = propertyStore->GetValue(PKEY_Device_FriendlyName, &friendlyName);
if (FAILED(hr)) { printf("Can't get device name: HRESULT 0x%x", hr); goto Next; }

PropVariantInit(&format);
PropVariantInit(&checkFormat);

hr = propertyStore->GetValue(PKEY_AudioEngine_DeviceFormat, &format);
if (FAILED(hr)) { printf("Can't get format: HRESULT 0x%x", hr); goto Next; }

memcpy_s(&wex, sizeof(wex), format.blob.pBlobData, sizeof(wex)); //копировать данные формата в буфер


pcmWaveFormat.wFormatTag = 0x0000FFFE;
pcmWaveFormat.nChannels = 2;
pcmWaveFormat.nSamplesPerSec = 32000L;
pcmWaveFormat.nAvgBytesPerSec = 128000L;
pcmWaveFormat.nBlockAlign = 4;
pcmWaveFormat.wBitsPerSample = 16;
pcmWaveFormat.cbSize = 22;

newFormat = format;
PropVariantClear(&format);
newFormat.vt = VT_BLOB;
newFormat.blob.cbSize = sizeof(wex);
newFormat.blob.pBlobData = (BYTE*)&wex;
hr = propertyStore->SetValue(PKEY_AudioEngine_DeviceFormat, newFormat);
if (FAILED(hr)) { printf("Can't set format: HRESULT 0x%x", hr); goto Next; }

hr = propertyStore->GetValue(PKEY_AudioEngine_DeviceFormat, &checkFormat);
if (FAILED(hr)) { printf("Can't get format: HRESULT 0x%x", hr); goto Next; }

// Вывод нового значения
memcpy_s(&newWex, sizeof(newWex), checkFormat.blob.pBlobData, sizeof(newWex));
PropVariantClear(&checkFormat);
std::cout << "New Frequency: " << newWex.nSamplesPerSec << std::endl;


Next:
if (dev != NULL) { dev->Release(); dev = NULL; }
if (propertyStore != NULL) { propertyStore->Release(); propertyStore = NULL; }

}

End:
if (dev != NULL) { dev->Release(); dev = NULL; }
if (propertyStore != NULL) { propertyStore->Release(); propertyStore = NULL; }
if (deviceEnumerator != NULL) { deviceEnumerator->Release(); deviceEnumerator = NULL; }
if (deviceCollection != NULL) { deviceCollection->Release(); deviceCollection = NULL; }

CoUninitialize();
return 0;
}

2 ответов

26 просмотров

например не читаешь описание чата, и кросспостишь во все чаты подряд

Ivan- Автор вопроса
Denis P
например не читаешь описание чата, и кросспостишь ...

Отправил сюда и в винапи чат. Правила сейчас прочитал, с этим действительно упущение.

Похожие вопросы

Обсуждают сегодня

Коллеги, я тут для личных нужд пошел ставить MQTT сервер, пощупал mosquitto, но ужаснулся отсутствию такой банальности, как HTTP API для посмотреть список топиков. А тут что,...
Maksim Lapshin
13
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
#include <stdio.h> #include <stdlib.h> #include <time.h> void mass_first_generate(int mass[5][7]) {     for (int N = 0; N < 5; N++) {         for (int A = 0; A < 7; A++) {   ...
Чувак
6
Всем привет! Решаю 99 OCaml Problems и столкнулся со следующей проблемой (прошу палками не забивать, я OCaml практически не трогал до этого момента): open OUnit2 let create_...
К|/|pи/\/\ 6е3yглbIи
2
https://www.linkedin.com/posts/ugama-benedicta-kelechi-codergirl-103041300_mobiledevelopment-fluttertraining-handsonlearning-activity-7263445699227254784-IdHB?utm_source=share...
CoderGirl
16
Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
возможно ли как-то передать в электрон или таури медиа поток с рендера 2д движка? двиг запускается как dll, а дальше надо как-то отправлять рендер кодировать не подходит, зр...
Kyle Nekto
7
Точно, оно. У тебя там имена потоков выставляются?
Александр (Rouse_) Багель
11
Помогите пожалуйста. Делаю систему плагинов. Проблема сейчас в такая: плагины загружаются в основном потоке. FLibHandle := SafeLoadLibrary(FFileName) Но нужно еще выполнить фу...
Илья 🤣
10
объясните пожалуйста, почему функция не работает должным образом? вроде должно брать активное окно сравнивать его размер с размером экрана, и если есть совпадение = true прове...
JF
12
Карта сайта