Aracılığıyla paylaş


Ses oluşturucu akışı

Akış ses işleyicisi (SAR), sesi işleyen bir medya havuzudur. SAR'nin her örneği tek bir ses akışı oluşturur. Birden çok akışı işlemek için SAR'nin birden çok örneğini kullanın.

SAR oluşturmak için aşağıdaki işlevlerden birini çağırın:

Bir etkinleştirme nesnesi döndüren ikinci işlev, korumalı içerik oynatıyorsanız gereklidir, çünkü etkinleştirme nesnesi korumalı işlemde seri hale getirilmelidir. Net içerik için iki işlevden birini kullanabilirsiniz.

SAR, PCM veya IEEE kayan nokta biçiminde sıkıştırılmamış ses alabilir. Kayıttan yürütme hızı 1×'den hızlı veya yavaşsa, SAR perdeyi otomatik olarak ayarlar.

Ses oluşturucuyu yapılandırma

SAR, çeşitli yapılandırma özniteliklerini destekler. Bu öznitelikleri ayarlama mekanizması, SAR'yi oluşturmak için hangi işlevi çağırdığınıza bağlıdır. MFCreateAudioRenderer işlevini kullanıyorsanız aşağıdakileri yapın:

  1. MFCreateAttributesçağırarak yeni bir öznitelik deposu oluşturun.
  2. Öznitelikleri öznitelik deposuna ekleyin.
  3. pAudioAttributes parametresindeki MFCreateAudioRenderer işlevine öznitelik depoyu geçirin.

MFCreateAudioRendererActivate işlevini kullanırsanız, işlev ppActivate parametresindeki IMFAttributes arabirimine bir işaretçi döndürür. Öznitelikleri eklemek için bu işaretçiyi kullanın.

Yapılandırma özniteliklerinin listesi için bkz. Ses oluşturucu Öznitelikleri.

Ses Uç Noktası Cihazını Seçme

ses uç noktası cihazı ses işleyen veya yakalayan bir donanım cihazıdır. Örnek olarak hoparlörler, kulaklıklar, mikrofonlar ve CD çalarlar verilebilir. SAR her zaman bir ses işleme cihazı kullanır. Cihazı seçmenin iki yolu vardır.

İlk yaklaşım, IMMDeviceEnumerator arabirimini kullanarak sistemdeki ses işleme cihazlarını listelemektir. Bu arabirim, çekirdek ses API'sinin belgelerinde belgelenmiştir.

  1. Cihaz numaralandırıcı nesnesini oluşturun.
  2. Ses işleme cihazlarını listelemek için cihaz numaralandırıcısını kullanın. Her cihaz, IMMCihaz arabirimine bir işaretçiyle gösterilir.
  3. Cihaz özelliklerine veya kullanıcının seçimine göre bir cihaz seçin.
  4. Cihaz tanımlayıcısını almak için IMMDevice::GetIdçağırın.
  5. Cihaz tanımlayıcısını MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID özniteliğinin değeri olarak ayarlayın.

Cihazları listelemek yerine, ses cihazını rolüne göre belirtebilirsiniz. Ses rolü, genel bir kullanım kategorisini tanımlar. Örneğin, konsolu rolü oyunlar ve sistem bildirimleri için tanımlanırken, multimedya rolü müzik ve filmler için tanımlanır. Her role atanmış bir ses işleme cihazı vardır ve kullanıcı bu atamaları değiştirebilir. Bir cihaz rolü belirtirseniz, SAR bu rol için atanmış olan ses cihazını kullanır. Cihaz rolünü belirtmek için MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ROLE özniteliğini ayarlayın.

Bu bölümde listelenen iki öznitelik birbirini dışlar. Bunlardan herhangi birini ayarlamazsanız, SAR eConsole rolüne atanan ses cihazını kullanır.

Aşağıdaki kod ses işleme cihazlarını numaralandırır ve listedeki ilk cihazı SAR'ye atar. Bu örnek, SAR oluşturmak için MFCreateAudioRenderer işlevini kullanır.

#include <mmdeviceapi.h>

HRESULT hr = S_OK;

IMMDeviceEnumerator *pEnum = NULL;      // Audio device enumerator.
IMMDeviceCollection *pDevices = NULL;   // Audio device collection.
IMMDevice *pDevice = NULL;              // An audio device.
IMFAttributes *pAttributes = NULL;      // Attribute store.
IMFMediaSink *pSink = NULL;             // Streaming audio renderer (SAR)

LPWSTR wstrID = NULL;                   // Device ID.

// Create the device enumerator.
hr = CoCreateInstance(
    __uuidof(MMDeviceEnumerator), 
    NULL,
    CLSCTX_ALL, 
    __uuidof(IMMDeviceEnumerator), 
    (void**)&pEnum
    );

// Enumerate the rendering devices.
if (SUCCEEDED(hr))
{
    hr = pEnum->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, &pDevices);
}

// Get ID of the first device in the list.
if (SUCCEEDED(hr))
{
    hr = pDevices->Item(0, &pDevice);
}

if (SUCCEEDED(hr))
{
    hr = pDevice->GetId(&wstrID);
}

// Create an attribute store and set the device ID attribute.
if (SUCCEEDED(hr))
{
    hr = MFCreateAttributes(&pAttributes, 2);
}

if (SUCCEEDED(hr))
{
    hr = pAttributes->SetString(
        MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID, 
        wstrID
        );
}

// Create the audio renderer.
if (SUCCEEDED(hr))
{
    hr = MFCreateAudioRenderer(pAttributes, &pSink);    
}

SAFE_RELEASE(pEnum);
SAFE_RELEASE(pDevices);
SAFE_RELEASE(pDevice); 
SAFE_RELEASE(pAttributes);
CoTaskMemFree(wstrID);

SAR için etkinleştirme nesnesini oluşturmak için, çağrıdan sonra görüntülenen kodu IMMDevice::GetId olarak değiştirin:

IMFActivate *pActivate = NULL;          // Activation object.

if (SUCCEEDED(hr))
{
    hr = MFCreateAudioRendererActivate(&pActivate);    
}

if (SUCCEEDED(hr))
{
    hr = pActivate->SetString(
        MF_AUDIO_RENDERER_ATTRIBUTE_ENDPOINT_ID, 
        wstrID
        );
}

SAFE_RELEASE(pActivate);

Ses Oturumunu Seçme

Ses oturumu, bir uygulamanın toplu olarak yönetebileceği ilgili ses akışları grubudur. Uygulama, her oturumun ses düzeyini ve sessiz durumunu denetleyebiliyor. Oturumlar GUID ile tanımlanır. SAR için ses oturumunu belirtmek için MF_AUDIO_RENDERER_ATTRIBUTE_SESSION_ID özniteliğini kullanın. Bu özniteliği ayarlamazsanız, SAR bu işlem için GUID_NULLtarafından tanımlanan varsayılan oturuma katılır.

Varsayılan olarak, bir ses oturumu işleme özgüdür, yani yalnızca arama işleminden akışlar içerir. İşlemler arası oturuma katılmak için MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS özniteliğini MF_AUDIO_RENDERER_ATTRIBUTE_FLAGS_CROSSPROCESSdeğeriyle ayarlayın.

SAR'yi oluşturduktan sonra, IMFAudioPolicy arabirimini kullanarak oturumu bir grup oturuma eklersiniz ve bunların tümü denetim masasında aynı ses denetimi tarafından denetlenmektedir. Bu arabirimi, ses denetiminde görünen adı ve simgeyi ayarlamak için de kullanabilirsiniz.

Ses Düzeylerini Denetleme

SAR'nin ses oturumundaki tüm akışların ana ses düzeyini denetlemek için IMFSimpleAudioVolume arabirimini kullanın. Tek bir akışın hacmini denetlemek veya bir akıştaki tek tek kanalların hacmini denetlemek için IMFAudioStreamVolume arabirimini kullanın. Her iki arabirim de IMFGetService::GetServiceçağrılarak elde edilir. GetService doğrudan SAR'da veya Medya Oturumu'nda çağırabilirsiniz. Birim düzeyleri, azaltma değerleri olarak ifade edilir. Her kanal için, azaltma düzeyi ana birimin ve kanal hacminin ürünüdür.

Ses/Video Kayıttan Yürütme