Как отличить наушники от встроенного звука в ПК
Я использую удивительный фреймворк NAudio, чтобы получить список аудиоустройств.
Но, как я вижу, невозможно понять, какое аудиоустройство является встроенным звуком ПК, а какое - наушниками. Я имею в виду, что они имеют одинаковое имя, и только если мы подключим наушники Active
государство.
Представьте себе, если я запускаю приложение с подключенными наушниками, как узнать, является ли текущее устройство наушниками, а не встроенным звуком ПК?
Я имею в виду, можем ли мы обнаружить через NAduio, что подключенное аудиоустройство является внешним аудиоустройством и является ли это наушниками?
var enumerator = new NAudio.CoreAudioApi.MMDeviceEnumerator();
// Allows you to enumerate rendering devices in certain states
var endpoints = enumerator.EnumerateAudioEndPoints(
DataFlow.Render,
DeviceState.Unplugged | DeviceState.Active);
foreach (var endpoint in endpoints)
{
Console.WriteLine("{0} - {1}", endpoint.DeviceFriendlyName, endpoint.State);
}
// Aswell as hook to the actual event
enumerator.RegisterEndpointNotificationCallback(new NotificationClient());
Где NotificationClient реализован следующим образом:
class NotificationClient : NAudio.CoreAudioApi.Interfaces.IMMNotificationClient
{
void IMMNotificationClient.OnDeviceStateChanged(string deviceId, DeviceState newState)
{
Console.WriteLine("OnDeviceStateChanged\n Device Id -->{0} : Device State {1}", deviceId, newState);
}
void IMMNotificationClient.OnDeviceAdded(string pwstrDeviceId) { }
void IMMNotificationClient.OnDeviceRemoved(string deviceId) { }
void IMMNotificationClient.OnDefaultDeviceChanged(DataFlow flow, Role role, string defaultDeviceId) { }
void IMMNotificationClient.OnPropertyValueChanged(string pwstrDeviceId, PropertyKey key) { }
}
2 ответа
Размещенный фрагмент является неполным, вам нужно взглянуть на свойства устройства (возможно, нового) аудиоустройства по умолчанию. В частности, форм-фактор, вы захотите обнаружить гарнитуру или наушники. Примерно так:
void IMMNotificationClient.OnDeviceStateChanged(string deviceId, DeviceState newState) {
Console.WriteLine("OnDeviceStateChanged\n Device Id -->{0} : Device State {1}", deviceId, newState);
var endp = new NAudio.CoreAudioApi.MMDeviceEnumerator().GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
bool isHeadPhone = false;
PropertyKey key = PropertyKeys.PKEY_AudioEndpoint_FormFactor;
var store = endp.Properties;
for (var index = 0; index < store.Count; index++) {
if (store.Get(index).Equals(key)) {
var value = (uint)store.GetValue(index).Value;
const uint formHeadphones = 3;
const uint formHeadset = 5;
if (value == formHeadphones || value == formHeadset) {
isHeadPhone = true;
break;
}
}
}
// Use isHeadPhone
// etc...
}
Этот проект, кажется, делает то, что вы ищете. Однако из моего исследования кажется, что то, что вы пытаетесь сделать, называется "обнаружение гнезда", так что, возможно, это поможет еще больше продвинуть ваши поиски.
Из связанного проекта:
Описание проекта Это простое приложение, подключенное к iTunes, для приостановки воспроизведения музыки, когда наушники отключены. Последний раз редактировалось 2 апреля 2011 в 23:24 пользователем yzraeu, версия 2
Он не использует NAUDIO, но наиболее актуальный код здесь:
const string HEAD_PHONE_GUID = "46d16a2c-5654-41c0-911e-7860d2bce7ee";
const string HEAD_PHONE_PLUGGED_VALUE = "1";
void CheckHeadphone()
{
var device = new MMDeviceEnumerator().GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
if (device.Properties[new Guid(HEAD_PHONE_GUID)].Value.ToString() == HEAD_PHONE_PLUGGED_VALUE)
IsHeadphonePlugged = true;
else
IsHeadphonePlugged = false;
}
Настоящая "магия" всего этого - MMDeviceEnumerator, вот еще немного информации об этом.