DirectSound 애플리케이션에 대한 디바이스 역할

참고

MMDevice API는 디바이스 역할을 지원합니다. 그러나 Windows Vista의 사용자 인터페이스는 이 기능에 대한 지원을 구현하지 않습니다. 디바이스 역할에 대한 사용자 인터페이스 지원은 이후 버전의 Windows에서 구현될 수 있습니다. 자세한 내용은 Windows Vista의 디바이스 역할을 참조하세요.

 

DirectSound API는 애플리케이션이 사용자가 특정 디바이스 역할에 할당한 오디오 엔드포인트 디바이스를 선택할 수 있는 수단을 제공하지 않습니다. 그러나 Windows Vista에서는 핵심 오디오 API를 DirectSound 애플리케이션과 함께 사용하여 디바이스 역할에 따라 디바이스를 선택할 수 있습니다. 핵심 오디오 API의 도움으로 애플리케이션은 특정 역할에 할당된 오디오 엔드포인트 디바이스를 식별하고, 엔드포인트 디바이스에 대한 DirectSound 디바이스 GUID를 가져와서 DirectSoundCreate 또는 DirectSoundCaptureCreate 함수를 호출하여 엔드포인트 디바이스를 캡슐화하는 IDirectSound 또는 IDirectSoundCapture 인터페이스 instance 만들 수 있습니다. DirectSound에 대한 자세한 내용은 Windows SDK 설명서를 참조하세요.

다음 코드 예제에서는 특정 디바이스 역할에 현재 할당된 렌더링 또는 캡처 디바이스에 대한 DirectSound 디바이스 GUID를 가져오는 방법을 보여 줍니다.

//-----------------------------------------------------------
// Get the DirectSound or DirectSoundCapture device GUID for
// an audio endpoint device. If flow = eRender, the function
// gets the DirectSound device GUID for the rendering device
// with the specified device role. If flow = eCapture, the
// function gets the DirectSoundCapture device GUID for the
// capture device with the specified device role.
//-----------------------------------------------------------
#define EXIT_ON_ERROR(hr)  \
              if (FAILED(hr)) { goto Exit; }
#define SAFE_RELEASE(punk)  \
              if ((punk) != NULL)  \
                { (punk)->Release(); (punk) = NULL; }

HRESULT GetDirectSoundGuid(EDataFlow flow, ERole role, GUID* pDevGuid)
{
    HRESULT hr = S_OK;
    IMMDeviceEnumerator *pEnumerator = NULL;
    IMMDevice *pDevice = NULL;
    IPropertyStore *pProps = NULL;

    PROPVARIANT var;
    PropVariantInit(&var);

    if (pDevGuid == NULL)
    {
        return E_POINTER;
    }

    // Get a device enumerator for the audio endpoint
    // devices in the system.
    hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),
                          NULL, CLSCTX_INPROC_SERVER,
                          __uuidof(IMMDeviceEnumerator),
                          (void**)&pEnumerator);
    EXIT_ON_ERROR(hr)

    // Get the endpoint device with the specified dataflow
    // direction (eRender or eCapture) and device role.
    hr = pEnumerator->GetDefaultAudioEndpoint(flow, role,
                                              &pDevice);
    EXIT_ON_ERROR(hr)

    hr = pDevice->OpenPropertyStore(STGM_READ, &pProps);
    EXIT_ON_ERROR(hr)

    // Get the DirectSound or DirectSoundCapture device GUID
    // (in WCHAR string format) for the endpoint device.
    hr = pProps->GetValue(PKEY_AudioEndpoint_GUID, &var);
    EXIT_ON_ERROR(hr)

    // Convert the WCHAR string to a GUID structure.
    hr = CLSIDFromString(var.pwszVal, pDevGuid);
    EXIT_ON_ERROR(hr)

Exit:
    PropVariantClear(&var);
    SAFE_RELEASE(pEnumerator);
    SAFE_RELEASE(pDevice);
    SAFE_RELEASE(pProps);
    return hr;
}

앞의 코드 예제에서 GetDirectSoundGuid 함수는 데이터 흐름 방향(eRender 또는 eCapture) 및 디바이스 역할(eConsole, eMultimedia 또는 eCommunications)을 입력 매개 변수로 허용합니다. 세 번째 매개 변수는 함수가 애플리케이션이 DirectSoundCreate 또는 DirectSoundCaptureCreate 함수에 입력 매개 변수로 제공할 수 있는 디바이스 GUID를 작성하는 포인터입니다.

앞의 코드 예제에서는 다음을 통해 DirectSound 디바이스 GUID를 가져옵니다.

  • 지정된 데이터 흐름 방향 및 디바이스 역할이 있는 오디오 엔드포인트 디바이스를 나타내는 IMMDevice 인터페이스 instance 만듭니다.
  • 오디오 엔드포인트 디바이스의 속성 저장소를 엽니다.
  • 속성 저장소에서 PKEY_AudioEndpoint_GUID 속성을 가져옵니다. 속성 값은 오디오 엔드포인트 디바이스에 대한 DirectSound 디바이스 GUID의 문자열 표현입니다.
  • CLSIDFromString 함수를 호출하여 디바이스 GUID의 문자열 표현을 GUID 구조체로 변환합니다. CLSIDFromString에 대한 자세한 내용은 Windows SDK 설명서를 참조하세요.

GetDirectSoundGuid 함수에서 디바이스 GUID를 가져온 후 애플리케이션은 이 GUID를 사용하여 DirectSoundCreate 또는 DirectSoundCaptureCreate 를 호출하여 오디오 엔드포인트 디바이스를 캡슐화하는 DirectSound 렌더링 또는 캡처 디바이스를 만들 수 있습니다. DirectSound는 이러한 방식으로 디바이스를 만들 때 항상 디바이스의 오디오 스트림을 기본 세션에 할당합니다. 세션 GUID 값으로 식별되는 프로세스별 오디오 세션은 GUID_NULL.

애플리케이션에서 교차 프로세스 오디오 세션 또는 NULL이 아닌 세션 GUID가 있는 세션에 스트림을 할당해야 하는 경우 이전 코드 예제에 표시된 기술을 사용하는 대신 IMMDevice::Activate 메서드를 호출하여 IDirectSound 또는 IDirectSoundCapture 개체를 만들어야 합니다. Activate 메서드를 사용하여 스트림에 대해 교차 프로세스 오디오 세션 또는 NULL이 아닌 세션 GUID를 지정하는 방법을 보여 주는 코드 예제는 DirectShow 애플리케이션에 대한 디바이스 역할을 참조하세요. 이 섹션의 코드 예제에서는 DirectShow 필터를 만드는 방법을 보여 주지만 약간의 수정으로 DirectSound 디바이스를 만들도록 코드를 조정할 수 있습니다.

이전 코드 예제의 GetDirectSoundGuid 함수는 CoCreateInstance 함수를 호출하여 시스템의 오디오 엔드포인트 디바이스에 대한 열거자를 만듭니다. 이전에 COM 라이브러리를 초기화하기 위해 CoInitialize 또는 CoInitializeEx 함수를 호출한 호출 프로그램이 아니면 CoCreateInstance 호출이 실패합니다. CoCreateInstance, CoInitialize 및 CoInitializeEx에 대한 자세한 내용은 Windows SDK 설명서를 참조하세요.

레거시 오디오 API와의 상호 운용성