Обнаружение, если микрофон включен - PullRequest
1 голос
/ 13 октября 2009

Есть ли способ программно определить, включен ли микрофон в Windows?

Ответы [ 3 ]

5 голосов
/ 13 октября 2009

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

Для этого вам нужно удалить любое смещение постоянного тока и искать любой сигнал выше разумного минимального уровня шума. (Будьте щедрыми: многие дешевые устройства ввода звука довольно шумные, даже когда нет входящего сигнала. Фильтр средней полосы / FFT также будет полезен для обнаружения только сигналов в среднем диапазоне голоса, а не низкочастотного гула и переходные клики.)

2 голосов
/ 13 октября 2009

Это никак не проверяется, но я бы попробовал прочитать некоторые примеры и посмотреть, есть ли какие-либо изменения. Если микрофон включен, то вы должны получить разные значения от окружающих звуков. Если микрофон выключен, вы должны получить 0. Опять же, это просто то, как я представляю, что вещи должны работать - я не знаю, действительно ли они так работают.

1 голос
/ 11 октября 2017

Из-за счастливой случайности я, возможно, обнаружил, что да, есть способ обнаружить присутствие подключенного микрофона.

Если ваши «записывающие устройства» Windows показывают «нет микрофона», этот подход (с использованием Microsoft Speech API) будет работать и подтвердит, что у вас нет микрофона. Однако, если Windows считает, что у вас есть микрофон, с этим не будет проблем.

#include <sapi.h>
#include <sapiddk.h>
#include <sphelper.h>

CComPtr<ISpRecognizer>  m_cpEngine;
m_cpEngine.CoCreateInstance(CLSID_SpInprocRecognizer);
CComPtr<ISpObjectToken> pAudioToken;
HRESULT hr = SpGetDefaultTokenFromCategoryId(SPCAT_AUDIOIN, &pAudioToken);
if (FAILED(hr))  ::OutputDebugString("no input, aka microphone, detected");

более конкретно, hr вернет этот результат:

SPERR_NOT_FOUND 0x8004503a  -2147200966
The requested data item (data key, value, etc.) was not found.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...