Aracılığıyla paylaş


Ses Oturumu Olayları

Paylaşılan mod ses akışlarını yöneten bir uygulama, oturum olayları gerçekleştiğinde bildirim almak için kaydolabilir. Daha önce açıklandığı gibi, her akış birses oturumuna aittir. Oturum olayı, bir ses oturumunun durumundaki bir değişiklikle başlatılır.

İstemci uygulaması, aşağıdaki oturum olayı türlerinin bildirimlerini almak için kaydolabilir:

  • Oturum alt örneğinin ana birim düzeyi veya sessize alındı durumu değişti.
  • Oturum alt örneğinin bir veya daha fazla kanalının ses düzeyi değişti.
  • Oturumun bağlantısı kesildi.
  • Oturumun etkinlik durumu etkin, etkin değil veya süresi doldu olarak değiştirildi.
  • Oturuma yeni bir gruplandırma parametresi atandı.
  • Oturumun kullanıcı arabirimi özelliği (simge veya görünen ad) değişti.

İstemci, IAudioSessionEvents arabiriminin uygulanmasındaki yöntemler aracılığıyla bu olayların bildirimlerini alır. WASAPI sistem modülü tarafından uygulanan WASAPI'deki diğer arabirimlerden farklı olarak, istemci IAudioSessionEventsuygular. Bu arabirimdeki yöntemler, oturum olayları gerçekleştiğinde WASAPI sistem modülünden geri çağırmalar alır.

İstemci bildirimleri almaya başlamak için IAudioSessionControl::RegisterAudioSessionNotification yöntemini çağırarak IAudioSessionEvents arabirimini kaydeder. İstemci artık bildirim gerektirmediğinde, kaydı silmek için IAudioSessionControl::UnregisterAudioSessionNotification yöntemini çağırır.

Aşağıdaki kod örneği, IAudioSessionEvents arabiriminin olası bir uygulamasını gösterir:

//-----------------------------------------------------------
// Client implementation of IAudioSessionEvents interface.
// WASAPI calls these methods to notify the application when
// a parameter or property of the audio session changes.
//-----------------------------------------------------------
class CAudioSessionEvents : public IAudioSessionEvents
{
    LONG _cRef;

public:
    CAudioSessionEvents() :
        _cRef(1)
    {
    }

    ~CAudioSessionEvents()
    {
    }

    // IUnknown methods -- AddRef, Release, and QueryInterface

    ULONG STDMETHODCALLTYPE AddRef()
    {
        return InterlockedIncrement(&_cRef);
    }

    ULONG STDMETHODCALLTYPE Release()
    {
        ULONG ulRef = InterlockedDecrement(&_cRef);
        if (0 == ulRef)
        {
            delete this;
        }
        return ulRef;
    }

    HRESULT STDMETHODCALLTYPE QueryInterface(
                                REFIID  riid,
                                VOID  **ppvInterface)
    {
        if (IID_IUnknown == riid)
        {
            AddRef();
            *ppvInterface = (IUnknown*)this;
        }
        else if (__uuidof(IAudioSessionEvents) == riid)
        {
            AddRef();
            *ppvInterface = (IAudioSessionEvents*)this;
        }
        else
        {
            *ppvInterface = NULL;
            return E_NOINTERFACE;
        }
        return S_OK;
    }

    // Notification methods for audio session events

    HRESULT STDMETHODCALLTYPE OnDisplayNameChanged(
                                LPCWSTR NewDisplayName,
                                LPCGUID EventContext)
    {
        return S_OK;
    }

    HRESULT STDMETHODCALLTYPE OnIconPathChanged(
                                LPCWSTR NewIconPath,
                                LPCGUID EventContext)
    {
        return S_OK;
    }

    HRESULT STDMETHODCALLTYPE OnSimpleVolumeChanged(
                                float NewVolume,
                                BOOL NewMute,
                                LPCGUID EventContext)
    {
        if (NewMute)
        {
            printf("MUTE\n");
        }
        else
        {
            printf("Volume = %d percent\n",
                   (UINT32)(100*NewVolume + 0.5));
        }

        return S_OK;
    }

    HRESULT STDMETHODCALLTYPE OnChannelVolumeChanged(
                                DWORD ChannelCount,
                                float NewChannelVolumeArray[],
                                DWORD ChangedChannel,
                                LPCGUID EventContext)
    {
        return S_OK;
    }

    HRESULT STDMETHODCALLTYPE OnGroupingParamChanged(
                                LPCGUID NewGroupingParam,
                                LPCGUID EventContext)
    {
        return S_OK;
    }

    HRESULT STDMETHODCALLTYPE OnStateChanged(
                                AudioSessionState NewState)
    {
        char *pszState = "?????";

        switch (NewState)
        {
        case AudioSessionStateActive:
            pszState = "active";
            break;
        case AudioSessionStateInactive:
            pszState = "inactive";
            break;
        }
        printf("New session state = %s\n", pszState);

        return S_OK;
    }

    HRESULT STDMETHODCALLTYPE OnSessionDisconnected(
              AudioSessionDisconnectReason DisconnectReason)
    {
        char *pszReason = "?????";

        switch (DisconnectReason)
        {
        case DisconnectReasonDeviceRemoval:
            pszReason = "device removed";
            break;
        case DisconnectReasonServerShutdown:
            pszReason = "server shut down";
            break;
        case DisconnectReasonFormatChanged:
            pszReason = "format changed";
            break;
        case DisconnectReasonSessionLogoff:
            pszReason = "user logged off";
            break;
        case DisconnectReasonSessionDisconnected:
            pszReason = "session disconnected";
            break;
        case DisconnectReasonExclusiveModeOverride:
            pszReason = "exclusive-mode override";
            break;
        }
        printf("Audio session disconnected (reason: %s)\n",
               pszReason);

        return S_OK;
    }
};

Yukarıdaki kod örneğindeki CAudioSessionEvents sınıfı, IAudioSessionEvents arabiriminin bir uygulamasıdır. Bu özel uygulama, oturum olayları hakkındaki bilgileri Komut İstemi penceresine yazdıran bir konsol uygulamasının parçası olabilir. IAudioSessionEventsIUnknown'den devraldığından, sınıf tanımı AddRef, Releaseve QueryInterfaceIUnknown yöntemlerinin uygulamalarını içerir. Sınıf tanımında kalan genel yöntemler IAudioSessionEvents arabirimine özgü.

Bazı istemciler tüm oturum olay türlerini izlemekle ilgilenmeyebilir. Yukarıdaki kod örneğinde, CAudioSessionEvents sınıfındaki birkaç bildirim yöntemi hiçbir şey yapmaz. Örneğin, OnChannelVolumeChanged yöntemi, durum kodu S_OK döndürme dışında hiçbir şey yapmaz. Bu uygulama kanal birimlerini (IChannelAudioVolume arabirimindeki yöntemleri çağırarak) değiştirmediğinden kanal birimlerini izlemez ve oturumu kanal birimlerini değiştirebilecek diğer uygulamalarla paylaşmaz.

CAudioSessionEvents sınıfında oturum olaylarını kullanıcıya bildiren tek üç yöntem OnSimpleVolumeChanged, OnStateChangedve OnSessionDisconnected. Örneğin, kullanıcı sistem birim denetimi programı Sndvol'u çalıştırıyorsa ve uygulamanın birim düzeyini değiştirmek için Sndvol'deki birim denetimini kullanıyorsa OnSimpleVolumeChanged yeni birim düzeyini hemen yazdırır.

İstemcinin IAudioSessionEvents arabirimini kaydeden ve kaydını kaldıran bir kod örneği için bkz. Eski Ses Uygulamaları için Ses Olayları.

Ses Oturumları