Birleşik ses cihazı yönlendirme

Birleşik ses cihazı yönlendirme özelliği, aynı anda birden fazla ses cihazına ses akışı desteği sağlar. Bu özelliği kullanarak ayrıcalıklı uygulamalar, sistem API'leri aracılığıyla belirli bir strateji için birden fazla tercih edilen cihazı seçebilir. Uygulamalar, bu özelliğin sağladığı genel API'leri kullanarak ses cihazlarının yeteneklerini daha kesin bir şekilde keşfedebilir. Android 11 ve önceki sürümleri için, ses çerçevesi uygulamasının, aynı anda bağlanan aynı türden birden fazla ses cihazı (örneğin, 2 Bluetooth A2DP kulaklık) için sınırlı desteği vardır. Varsayılan ses yönlendirme kuralları, kullanıcıların belirli bir kullanım durumu için aynı türden birden fazla cihazı seçmesine de izin vermez.

Android 12'den başlayarak, ses yayını, bir grup BLE ses kulaklığına çoklu yayın yapma veya aynı anda birden fazla USB ses kartını seçme gibi yeni kullanım durumlarına izin vermek için bu sınırlamalar kaldırılmıştır. Aynı anda birden fazla USB cihazına yönlendirme desteklenmez.

Android 14'ten başlayarak USB çerçevesi, USB cihazlarının farklı ses cihazı türlerinde olması ve birden fazla USB cihazını aynı anda bağlamak için çekirdek ve satıcı desteği olması koşuluyla birden fazla USB cihazına yönlendirmeyi destekler.

Bu sayfada birden fazla ses cihazına ses akışı desteğinin nasıl uygulanacağı ve bu özelliğin uygulanmasının nasıl doğrulanacağı anlatılmaktadır.

Birden fazla ses cihazına ses akışını destekleme

Android 12'de bu özelliği destekleyen iki API grubu vardır:

  • Sistem API'leri bir strateji için birden fazla tercih edilen cihazı yönetir.
  • Satıcı tarafından ses HAL'nin bir parçası olarak uygulanan HIDL arayüzü, cihazın yeteneklerini rapor eder.

Aşağıdaki bölümlerde bu API'lerin her biri daha ayrıntılı olarak ele alınmaktadır.

Bir strateji için birden fazla tercih edilen cihazı kullanın

Ses Politikası Yöneticisi, aynı anda birden fazla ses cihazına ses akışını daha iyi desteklemek için sistem API'leri sunar. Bu sistem API'leri, belirli bir strateji için birden fazla tercih edilen cihazın ayarlanmasını, alınmasını ve kaldırılmasını sağlar. Android 12'ye kadar bu özellik yalnızca tek bir cihaz için destekleniyordu.

Ses Politikası Yöneticisi, medya oynatmak için seçilmesi en muhtemel cihazları tanımlamak üzere aktif medya cihazları kavramını sunar. Çıkarılabilir bir cihaz bağlandığında, bu cihaza yönlendirilebilecek ses HAL çıkış akışlarının açılması ve desteklenen özellikler açısından incelenmesi gerekebilir.

Bir çıkış akışını açarken bir ses cihazının belirtilmesi gerekir. Aktif medya cihazı bu bağlamda çıkış akışları açıldığında kullanılan cihazdır.

Etkin medya cihazı seçimi, bağlanan veya bağlantısı kesilen gerçek cihazlara bağlı olarak değişebilir. Ses Politikası Yöneticisi, etkin medya cihazlarını seçmek için aşağıdaki kural dizisini kullanır:

  1. Medya için tercih edilen cihazların tümü mevcutsa hepsi aktif cihaz olarak seçilir.
  2. Aksi takdirde son bağlanan çıkarılabilir cihaz seçilir.
  3. Bağlı çıkarılabilir aygıt yoksa, etkin aygıtları seçmek için çıkış aygıtlarını seçmeye ilişkin varsayılan ses politikası kuralları uygulanır.

Bir çıkış akışının, oynatma için en iyi konfigürasyonun seçilebilmesi amacıyla yeniden açılması ve aktif cihazlara yönlendirilmesi için aşağıdaki kriterleri karşılaması gerekir:

  • Çıkış akışının aktif cihazları desteklemesi gerekir.
  • Çıkış akışının dinamik profilleri desteklemesi gerekir.
  • Çıkış akışının şu anda etkin cihazlara yönlendirilmemesi gerekir.

Yeni bir cihaz seçimi uygulamak için, Ses Politikası Yöneticisi, çıkış akışı boştaysa cihaz bağlantısı üzerine bir çıkış akışını kapatır ve yeniden açar veya çıkış akışının bekleme durumuna alınmasını erteler.

Ses Politikası Yöneticisi aşağıdaki sistem API'lerinin listesini sunar ( AudioManager.java tanımlandığı gibi):

  • setPreferredDeviceForStrategy

    Belirli bir strateji için ses yönlendirmesi için tercih edilen cihazı ayarlar. Tercih edilen cihaz ayarlandığında cihazın kullanılamayabileceğini, ancak kullanılabilir hale getirildikten sonra kullanılacağını unutmayın.

  • removePreferredDeviceForStrategy

    setPreferredDeviceForStrategy veya setPreferredDevicesForStrategy ile önceden ayarlanan tercih edilen ses aygıtlarını kaldırır.

  • getPreferredDeviceForStrategy

    setPreferredDeviceForStrategy veya setPreferredDevicesForStrategy ile önceden ayarlanmış bir ses stratejisi için tercih edilen cihazı döndürür.

  • setPreferredDevicesForStrategy

    Belirli bir strateji için tercih edilen cihazları ayarlar.

  • getPreferredDevicesForStrategy

    setPreferredDeviceForStrategy veya setPreferredDevicesForStrategy ile önceden ayarlanmış bir ses stratejisi için tercih edilen cihazları döndürür.

  • OnPreferredDevicesForStrategyChangedListener

    Belirli bir ses stratejisi için ayarlanan tercih edilen ses cihazlarındaki değişikliklerin bildirilmesi için bir arayüz tanımlar.

  • addOnPreferredDevicesForStrategyChangedListener

    Strateji tercihli ses cihazındaki değişikliklerden haberdar olmak için bir dinleyici ekler.

  • removeOnPreferredDevicesForStrategyChangedListener

    Strateji tercihli ses cihazına yapılan değişikliklerin önceden eklenmiş bir dinleyicisini kaldırır.

Cihaz yeteneklerini bildirme

Ses HAL uygulamasının bir parçası olarak satıcılar, raporlama cihazı özelliklerini destekleyen API'leri uygular. Bu bölümde cihaz yeteneklerini raporlamak için kullanılan veri türleri ve yöntemler açıklanmakta ve birden fazla cihazı desteklemek için ses HIDL HAL V7'de yapılan bazı değişiklikler listelenmektedir.

Veri tipleri

Audio HIDL HAL V7'de cihaz yetenekleri AudioProfile ve AudioTransport yapıları kullanılarak raporlanır. AudioTransport yapısı, bilinen ses formatları için AudioProfile sahip bir ses bağlantı noktasının veya platform tarafından bilinmeyen formatlar için ham donanım tanımlayıcılarına sahip bir ses bağlantı noktasının yeteneğini açıklar. AudioProfile yapısı, types.hal aşağıdaki kod bloğunda gösterildiği gibi ses formatını, profil tarafından desteklenen örnekleme hızlarını ve kanal maskelerinin listesini içerir:

/**
* Configurations supported for a certain audio format.
*/
struct AudioProfile {
   AudioFormat format;
   /** List of the sample rates (in Hz) supported by the profile. */
   vec<uint32_t> sampleRates;
   /** List of channel masks supported by the profile. */
   vec<AudioChannelMask> channelMasks;
};

Audio HIDL HAL V7'de AudioPort veri türü, cihazın yeteneklerini açıklamak için AudioTransport ve AudioProfile yapılarıyla tanımlanır.

Ses HAL yöntemleri

Ses Politikası Yöneticisi, cihazın yeteneklerini sorgulamak için aşağıdaki yöntemleri kullanır:

  • getParameters: Desteklenen ses formatları ve ilgili örnekleme hızları gibi satıcıya özgü parametre değerlerini almak için genel bir yöntem.
  • getAudioPort: Belirli bir ses bağlantı noktası için desteklenen özelliklerin (örnekleme oranları, formatlar, kanal maskeleri, kazanç denetleyicileri gibi) listesini döndürür.

IDevice.hal aşağıdaki kod, getAudioPort yönteminin arayüzünü gösterir:

   /**
    * Returns the list of supported attributes for a given audio port.
    *
    * As input, 'port' contains the information (type, role, address etc...)
    * needed by the HAL to identify the port.
    *
    * As output, 'resultPort' contains possible attributes (sampling rates,
    * formats, channel masks, gain controllers...) for this port.
    *
    * @param port port identifier.
    * @return retval operation completion status.
    * @return resultPort port descriptor with all parameters filled up.
    */
   getAudioPort(AudioPort port)
           generates (Result retval, AudioPort resultPort);

Eski API'de yapılan değişiklikler

Birden fazla ses profilini desteklemek için eski API'nin 3.2 sürümü, audio_port_v7 adı verilen yeni bir yapı ekler. Daha fazla ayrıntı için kaynak koduna bakın.

audio_port_v7 eklenmesi nedeniyle, eski API'nin 3.2 sürümü, audio_port_v7 yapısını kullanarak cihazların yeteneklerini sorgulamak için get_audio_port_v7 adlı yeni bir API ekler.

audio.h aşağıdaki kod get_audio_port_v7 API'sinin tanımını gösterir:

/**
 * Fills the list of supported attributes for a given audio port.
 * As input, "port" contains the information (type, role, address etc...)
 * needed by the HAL to identify the port.
 * As output, "port" contains possible attributes (sampling rates,
 * formats, channel masks, gain controllers...) for this port. The
 * possible attributes are saved as audio profiles, which contains audio
 * format and the supported sampling rates and channel masks.
 */
 int (*get_audio_port_v7)(struct audio_hw_device *dev,
                          struct audio_port_v7 *port);

Eski API sürümü 3.2'nin altında ve HIDL HAL sürümü 7 veya üstü olduğunda, eski get_audio_port API'sinden gelen verilerin yeni AudioPort biçimine doldurulması gerekir. Bu durumda, get_audio_port rapor edilen tüm örnek hızların ve kanal maskelerinin, döndürülen tüm formatlar için desteklendiği varsayılır ve böylece get_audio_port değerlerinden yeni AudioPort yapısına basit bir eşleme sağlanır.

Örnek API uygulamaları

Bu bölümde, önceki bölümlerde ele alınan API'leri kullanan yöntemleri içeren çeşitli test paketleri açıklanmaktadır. Bu API'lerin nasıl uygulandığına ve kullanıldığına ilişkin bazı örnekler için bu yöntemlere bakın.

setPreferredDevicesForStrategy , getPreferredDevicesForStrategy , removePreferredDeviceForStrategy ve OnPreferredDevicesForStrategyChangedListener sistem API'lerinin kullanımına bir örnek, GTS'de bulunan PreferredDeviceRoutingTest yöntemindedir.

Kullanılan AudioDeviceInfo yeni yapının bir örneğini görmek için CTS'de bulunan AudioManagerTest#testGetDevices yöntemine bakın.

get_audio_port_v7 uygulamasının bir örneği audio_hal.c bulunur ve birden fazla cihaz için yeteneklerin nasıl sorgulandığını gösterir.

Doğrulama

Bu bölümde Ses Yöneticisinin CTS ve GTS (Google Mobil Hizmetler Test Paketi) doğrulaması hakkında bilgi verilmektedir.

CTS testleri

CTS testleri android.media.cts.AudioManagerTest dosyasında bulunur.

Aşağıda mevcut Ses Yöneticisi testlerinin listesi yer almaktadır:

  • AudioManagerTest#testGetDevices

    Ses cihazının kesin yeteneklerini doğrular. Ayrıca AudioDeviceInfo yapısındaki döndürülen ses profillerinin eski, düzleştirilmiş dizi biçimindeki içeriği koruduğunu ancak yeni AudioProfile biçiminde olduğunu da doğrular.

  • AudioManagerTest#testPreferredDevicesForStrategy and AudioManagerTest#testPreferredDeviceForCapturePreset

    Strateji ve yakalama için tercih edilen cihazların önceden ayarlanmış API testlerinin başarıyla tamamlandığını doğrulayın.

GTS testleri

GTS testleri com.google.android.gts.audioservice.AudioServiceHostTest adresinde bulunur.

Strateji ve yakalama ön ayarına yönelik tercih edilen cihazlara yönelik API'lerin doğru çalışıp çalışmadığını doğrulamak için AudioServiceHostTest#testPreferredDeviceRouting ve AudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset testlerini çalıştırın.