PKEY_AudioEndpoint_StableId 속성은 오디오 엔드포인트에 대해 불투명한 추가 식별자를 제공합니다. Windows 운영 체제 업데이트 및 오디오 드라이버 업데이트에서 이 식별자를 유지하려고 시도합니다.
IMMDevice::GetId에서 반환되는 일반 엔드포인트 ID가 안정적이지 않습니다. 운영 체제 업데이트 또는 오디오 드라이버 업데이트로 인해 동일한 실제 주변 디바이스에 다른 엔드포인트 ID가 할당될 수 있습니다. 따라서 앱은 일반 엔드포인트 ID를 사용하여 실제 오디오 엔드포인트를 안정적으로 추적할 수 없습니다. 사용 가능한 경우 PKEY_AudioEndpoint_StableId 속성을 사용하여 실제 오디오 엔드포인트를 추적할 수 있습니다. 예제 시나리오는 사용자가 선택한 마이크 또는 스피커를 기억하고 이후 세션에서 해당 선택을 복원하는 통신 앱입니다.
PROPVARIANT 구조체의 vt 멤버는 VT_LPWSTR 설정됩니다.
PROPVARIANT 구조체의 pwszVal 멤버는 오디오 엔드포인트 디바이스에 대한 안정적인 식별자를 포함하는 null로 끝나는 와이드 문자열을 가리킵니다. 엔드포인트에 안정적인 ID가 없으면 속성 값이 VT_EMPTY. 모든 엔드포인트에 안정적인 ID가 보장되는 것은 아닙니다.
비고
속성 값을 대/소문자를 구분하는 불투명 문자열로 처리하고 대/소문자를 구분하여 비교합니다. 값을 수정, 정규화, 재구성 또는 구문 분석하지 않으며 내부 부분 문자열을 추출하거나 사용하지 마세요. 문자열의 내부 형식은 구현 세부 정보입니다. 나중에 동일한 엔드포인트를 다시 식별하기 위해서만 값을 캐시합니다.
안정적인 ID를 디바이스의 모든 특성에 대해 변경할 수 없는 식별자로 취급하지 마세요. 다른 엔드포인트 속성(예: 이름 및 형식 특성)은 안정적인 ID가 동일하게 유지되는 동안 변경할 수 있습니다. 캐시된 안정적인 ID에서 디바이스를 확인하면 앱이 종속된 변경 가능한 속성을 다시 쿼리합니다.
안정적인 ID는 일반 엔드포인트 ID보다 내구성이 뛰어나지만 절대 변경되지는 않습니다. Windows 운영 체제 및 오디오 드라이버 업데이트에서 유지하려고 시도합니다. 이 값을 유지하는 Windows 기능은 오디오 드라이버, 주변 장치 펌웨어, 버스 유형(예: USB 및 Bluetooth) 및 주변 장치가 노출하는 정보에 따라 달라집니다. 소수의 주변 장치는 운영 체제 또는 드라이버 업그레이드 후 다른 안정적인 ID를 받을 수 있습니다.
앱은 다음 각 사례를 처리해야 합니다.
- 속성 값이 VT_EMPTY.
- 속성 저장소 읽기가 실패합니다.
- 캐시된 안정적인 ID는 IMMDeviceEnumerator::GetDevice를 통해 더 이상 엔드포인트로 확인되지 않습니다.
안정적인 ID 검색
사용자가 선택한 엔드포인트의 안정적인 ID를 검색하려면 다음을 수행합니다.
- 선택한 엔드포인트에 대한 IMMDevice 인터페이스로 시작합니다.
- STGM_READ 플래그를 사용하여 IMMDevice::OpenPropertyStore 메서드를 호출합니다.
- PKEY_AudioEndpoint_StableId 속성 키를 사용하여 IPropertyStore::GetValue 메서드를 호출합니다.
- 반환된 PROPVARIANT의 vt 멤버가 VT_LPWSTR 경우 전체 pwszVal 문자열을 유지합니다.
- 속성을 사용할 수 없거나 VT_LPWSTR 않은 경우(예: 이전 버전의 Windows 또는 값이 VT_EMPTY 경우) 필요에 따라 IMMDevice::GetId로 대체합니다. 대체 값은 내구성이 낮으며 운영 체제 또는 오디오 드라이버 업데이트 후에 부실해질 수 있습니다.
다음 예제에서는 안정적인 ID를 검색하고 유지합니다.
wil::unique_cotaskmem_string deviceId;
wil::com_ptr_nothrow<IPropertyStore> propertyStore;
if (SUCCEEDED(userSelectedEndpoint->OpenPropertyStore(STGM_READ, &propertyStore)))
{
wil::unique_prop_variant var;
if (SUCCEEDED(propertyStore->GetValue(PKEY_AudioEndpoint_StableId, &var)))
{
if (var.vt == VT_LPWSTR)
{
deviceId.reset(var.release().pwszVal);
}
}
}
나중에 디바이스 복원
이후 세션에서 디바이스를 복원하려면 CoCreateInstance를 호출하여 MMDeviceEnumerator 개체를 만든 다음 캐시된 stable-ID 문자열을 pwstrId 인수로 IMMDeviceEnumerator::GetDevice 메서드에 전달하여 IMMDevice 인터페이스를 다시 가져옵니다. 일치하는 엔드포인트를 찾을 수 없는 오류 사례를 처리합니다.
HRESULT GetUserAudioEndpoint(_In_ PCWSTR endpointStableId, _COM_Outptr_ IMMDevice** userSelectedEndpoint)
{
*userSelectedEndpoint = nullptr;
wil::com_ptr_nothrow<IMMDeviceEnumerator> enumerator;
RETURN_IF_FAILED(CoCreateInstance(__uuidof(MMDeviceEnumerator), nullptr, CLSCTX_ALL, IID_PPV_ARGS(&enumerator)));
RETURN_IF_FAILED(enumerator->GetDevice(endpointStableId, userSelectedEndpoint));
return S_OK;
}
요구 사항
| 요구 사항 | Value |
|---|---|
| 지원되는 최소 클라이언트 |
Windows 11 버전 24H2(빌드 26100) [데스크톱 앱만 해당] |
| 지원되는 최소 서버 |
Windows Server 2025(빌드 26100) [데스크톱 앱만 해당] |
| Header |
|