오디오 세션

오디오 세션은 WASAPI 클라이언트가 전체적으로 관리할 수 있는 관련 오디오 스트림 그룹입니다. 클라이언트는 각 개별 세션의 볼륨 수준 및 음소거 상태를 제어할 수 있습니다. 시스템은 클라이언트 지정 볼륨 및 음소거 설정을 세션의 모든 스트림에 균일하게 적용합니다.

클라이언트가 오디오 스트림을 초기화하면 오디오 스트림이 오디오 세션에 할당됩니다. 자세한 내용은 IAudioClient::Initialize를 참조하세요.

오디오 세션에는 렌더링 스트림 또는 캡처 스트림이 포함되지만 둘 다 포함되지는 않습니다. 기본적으로 렌더링 세션에 대한 볼륨 및 음소거 설정은 시스템 다시 시작에서 지속됩니다. 캡처 세션에 대한 볼륨 및 음소거 설정은 영구적이지 않습니다. 루프백 모드에서 작동하는 스트림이 포함된 세션은 캡처 세션과 동일하게 처리됩니다. 즉, 세션 설정은 영구적이지 않습니다. 루프백 모드에 대한 자세한 내용은 루프백 기록을 참조하세요.)

모든 오디오 스트림은 정확히 하나의 세션에 속합니다. 클라이언트는 스트림 개체를 초기화할 때 특정 세션에 오디오 스트림을 할당합니다. 스트림은 스트림의 수명 동안 세션의 멤버 자격을 유지합니다. 스트림 개체를 만든 후 클라이언트가 개체에 마지막으로 계산된 참조를 해제한 다음 개체가 삭제될 때까지 개체가 존재합니다.

클라이언트는 기존 스트림이 할당된 세션을 변경할 수 없지만 스트림을 삭제하고(모든 참조를 해제하여) 삭제된 스트림을 대체할 새 스트림을 만들고 새 스트림을 다른 세션에 할당하여 비슷한 효과를 얻을 수 있습니다.

각 렌더링 세션은 특정 오디오 엔드포인트 디바이스를 통해 재생되는 전역 혼합을 형성하는 스트림의 하위 집합을 나타냅니다. 글로벌 조합은 디바이스를 공유하는 모든 애플리케이션의 모든 세션을 결합합니다.

종종 여러 스트림이 있는 애플리케이션은 모든 스트림을 동일한 세션에 할당합니다. 그러나 애플리케이션은 옵션으로 다른 스트림을 다른 세션에 할당할 수 있습니다. 애플리케이션이 세션에 명시적으로 할당하지 않는 모든 스트림은 기본 세션에 속합니다.

일반적인 오디오 애플리케이션은 세션에 대한 볼륨 및 음소거 설정을 수정하지 않아야 합니다. 대신 사용자는 제어 프로그램의 사용자 인터페이스를 통해 이러한 설정을 제어합니다. 예를 들어 Windows Vista에서 시스템 제공 프로그램인 Sndvol.exe 시스템의 각 활성 또는 최근 활성 렌더링 세션에 대한 볼륨 제어 및 음소거 컨트롤을 표시합니다. 이러한 컨트롤을 통해 사용자는 시스템의 모든 세션에 대한 볼륨 및 음소거 설정을 조정할 수 있습니다.

Sndvol 프로그램은 현재 오디오 렌더링 엔드포인트 디바이스에 대한 볼륨 컨트롤만 표시합니다. 오디오 캡처 디바이스에 대한 볼륨 컨트롤은 표시되지 않습니다.

세션이 하나 이상의 활성 스트림을 포함하는 경우 활성 상태입니다. 활성 스트림이 실행 중 상태입니다. 비활성 스트림이 중지된 상태입니다. 첫 번째 스트림이 활성화되면 세션이 활성화됩니다. 마지막 활성 스트림이 비활성 상태가 되면 세션이 비활성 상태가 됩니다. 일정 기간 동안 세션이 비활성 상태가 된 후 시스템은 세션의 상태를 비활성 상태에서 만료됨으로 변경합니다.

Sndvol은 모든 활성 및 비활성 렌더링 세션에 대한 볼륨 및 음소거 컨트롤을 표시합니다. Sndvol은 세션 상태가 비활성 상태에서 만료됨으로 변경되거나 세션이 종료될 때 세션에 대한 볼륨 및 음소거 컨트롤을 제거합니다. (세션은 마지막 스트림이 삭제되면 종료됩니다. 즉, 클라이언트가 세션의 마지막 남은 스트림 개체에 대한 최종 참조 수를 해제할 때입니다.) 이 규칙의 한 가지 예외는 시스템 알림 소리에 대한 것입니다. Sndvol은 이러한 소리에 대한 세션 상태에 관계없이 시스템 알림 소리에 대한 볼륨 및 음소거 컨트롤을 항상 표시합니다.

일반적으로 스트림은 스트림을 만든 애플리케이션을 포함하는 프로세스에만 적용되는 세션에 속합니다. 그러나 애플리케이션에는 둘 이상의 프로세스에서 스트림을 결합하는 프로세스 간 세션을 정의하는 옵션이 있습니다.

WASAPI는 다음을 위해 주로 프로세스 간 세션을 지원합니다.

  • Sndvol 프로그램은 사용자에게 단일 볼륨 제어를 제공하여 모든 애플리케이션에서 시스템 알림 소리를 관리할 수 있습니다.
  • 한 프로세스에서 실행되는 미디어 플레이어는 보호된 콘텐츠를 다른 프로세스에서 실행되는 암호 해독 프로그램으로 스트리밍할 수 있습니다.

프로세스별 렌더링 세션에 대한 컨트롤 설정과 마찬가지로 교차 프로세스 렌더링 세션에 대한 컨트롤 설정은 기본적으로 시스템 다시 시작에서 지속됩니다. WASAPI는 주로 시스템 알림 소리의 이점을 위해 이 동작을 제공하며, 애플리케이션 조합이 시간에 따라 다르므로 사용자의 볼륨 및 음소거 설정을 유지해야 합니다.

Sndvol 프로그램은 각 세션의 볼륨 컨트롤에 표시 이름과 아이콘을 레이블로 지정합니다. 클라이언트에는 표시 이름과 아이콘을 세션에 명시적으로 할당하는 옵션이 있습니다. 클라이언트가 이러한 항목을 제공하지 않으면 Sndvol은 기본 이름과 기본 아이콘을 대신 표시합니다. 기본 이름은 애플리케이션 창의 제목과 같은 정보를 통합합니다. 기본 아이콘은 애플리케이션 창의 아이콘입니다. 프로세스별 세션의 경우에만 이러한 기본값은 사용자에게 의미 있는 정보를 제공합니다. 프로세스 간 세션은 둘 이상의 애플리케이션과 연결할 수 있습니다. 이 경우 클라이언트에서 제공하는 표시 이름 및 아이콘만 의미가 있습니다.

렌더링 세션에 대한 볼륨 및 음소거 설정은 기본적으로 시스템 다시 시작에서 영구적이지만 클라이언트에서 제공한 표시 이름과 아이콘은 적용되지 않습니다. Sndvol이 클라이언트에서 제공한 이름과 아이콘을 표시하도록 하려면 클라이언트가 세션에 첫 번째 스트림을 할당할 때 클라이언트가 세션에 이름과 아이콘을 명시적으로 할당해야 합니다. 시스템은 세션이 종료될 때까지만 세션의 표시 이름과 아이콘을 유지합니다.

각 세션은 세션 GUID로 식별됩니다. 클라이언트가 스트림을 열 때 클라이언트는 해당 스트림을 특정 세션에 할당합니다. 클라이언트는 해당 세션을 식별하기 위해 다음 두 가지 정보를 제공합니다.

  • 세션 GUID입니다.
  • 세션이 크로스 프로세스 또는 프로세스별 세션인지 여부- 프로세스별 세션에는 클라이언트 프로세스의 스트림만 포함됩니다.

이 정보는 특정 세션을 동일한 컴퓨터의 다른 모든 세션과 구분하기에 충분합니다. 프로세스별 세션에 대한 세션 GUID는 세션을 소유하는 프로세스 범위 내에서만 세션을 고유하게 식별합니다. 반면, 크로스 프로세스 세션에 대한 세션 GUID는 컴퓨터에서 실행되는 모든 프로세스의 범위 내에서 고유합니다.

프로세스별 세션의 경우 시스템은 세션 GUID와 프로세스 ID의 조합을 사용하여 컴퓨터 범위 내에서 세션을 고유하게 식별합니다. 따라서 서로 다른 두 프로세스의 클라이언트가 동일한 세션 GUID가 있는 두 개의 프로세스별 세션에 해당 스트림을 할당하는 경우 프로세스 ID가 다르기 때문에 시스템은 세션을 별도의 세션으로 처리합니다. 또한 프로세스 간 세션이 하나 이상의 프로세스별 세션과 동일한 세션 GUID를 사용하는 경우 시스템은 동일한 세션 GUID를 공유하더라도 프로세스별 세션과 구분되는 프로세스 간 세션을 처리합니다.

예를 들어 Windows Vista에서 Windows 멀티미디어 waveOutXxx 함수 및 DirectSound와 같은 상위 수준 API는 일반적으로 세션 GUID 값 GUID_NULL 식별되는 기본 프로세스별 세션으로 만드는 오디오 스트림을 할당합니다. 이러한 API의 클라이언트의 경우 세션에 동일한 세션 GUID가 있더라도 각 클라이언트 프로세스의 기본 세션은 다른 클라이언트 프로세스의 기본 세션과 별개입니다. 또한 하나 이상의 애플리케이션이 GUID_NULL 세션 GUID 값으로 식별되는 프로세스 간 세션에 스트림을 할당하는 경우 시스템은 이 프로세스 간 세션을 동일한 세션 GUID를 공유하는 기본 프로세스별 세션과는 별도로 처리합니다. 따라서 Sndvol 프로그램은 각 클라이언트의 기본 프로세스별 세션에 대해 별도의 볼륨 컨트롤을 표시하고 해당 세션이 있는 경우 GUID_NULL 세션 GUID 값으로 식별되는 프로세스 간 세션에 대한 추가 볼륨 컨트롤을 표시합니다.

각 세션은 하나의 오디오 엔드포인트 디바이스와만 연결됩니다. 두 세션에 동일한 세션 GUID 및 프로세스 ID가 있지만 다른 디바이스와 연결된 경우 시스템은 두 세션을 별도의 세션으로 처리합니다. 캡처 스트림은 캡처 디바이스에만 연결할 수 있고 렌더링 스트림은 렌더링 디바이스에만 연결할 수 있으므로 세션에는 캡처 스트림과 렌더링 스트림을 모두 포함할 수 없습니다.

앞에서 설명한 것처럼 세션에 대한 볼륨 및 음소거 설정은 시스템 다시 시작에서 지속됩니다. 애플리케이션의 두 개 이상의 인스턴스는 동일한 세션 GUID를 사용하여 프로세스별 세션을 만들 수 있습니다. Sndvol 프로그램을 통해 사용자는 각 세션에 대해 서로 다른 볼륨 및 음소거 설정을 선택할 수 있습니다. 이러한 세션이 종료되면 시스템은 종료할 마지막 세션인 이러한 세션 중 하나의 제어 설정만 유지합니다. 나중에 애플리케이션의 새 인스턴스가 이전과 동일한 세션 GUID를 사용하여 프로세스별 세션을 만드는 경우 해당 세션은 이전에 저장된 볼륨 및 음소거 설정을 상속합니다.

애플리케이션은 관련이 없는 다른 애플리케이션이 소유한 세션의 볼륨 수준에 스트림을 추가하거나 제어하려고 시도해서는 안 됩니다. 또한 애플리케이션은 알림 소리에 대한 시스템 관리 세션의 볼륨 수준을 제어하려고 시도해서는 안 됩니다. 그러나 애플리케이션은 PlaySound 함수를 호출하여 알림 소리를 위해 시스템 세션을 통해 소리를 재생할 수 있습니다. 자세한 내용은 레거시 오디오 애플리케이션에 대한 알림 소리를 참조하세요.

애플리케이션은 세션 상태가 변경될 때 알림을 받도록 등록할 수 있습니다. 자세한 내용은 오디오 세션 이벤트를 참조하세요.

드문 경우로, 프로세스별 세션을 만드는 애플리케이션은 Sndvol의 단일 볼륨 제어에서 둘 이상의 애플리케이션 인스턴스에 대한 프로세스별 세션의 제어를 통합해야 할 수 있습니다. 자세한 내용은 그룹화 매개 변수를 참조하세요.

프로그래밍 가이드