Birleşik Ses Aygıtı Yönlendirme

Birleşik ses cihazı yönlendirme özelliği, aynı anda birden fazla ses cihazına ses akışı desteği ekler. Bu özelliği kullanarak, ayrıcalıklı uygulamalar belirli için birden tercih cihazları seçebilir stratejisi sistemi API'leri yoluyla. Uygulamalar, bu özellik tarafından sağlanan genel API'leri kullanarak ses cihazlarının özelliklerini daha kesin bir şekilde keşfedebilir. Android sürüm 11 ve altı için, ses çerçevesi uygulaması aynı anda bağlanan aynı türden birden fazla ses cihazı (örneğin, 2 Bluetooth A2DP kulaklık) için sınırlı desteğe sahiptir. 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 veya aynı anda birkaç USB ses kartı kullanma gibi yeni kullanım durumlarına izin vermek için bu sınırlamalar kaldırılmıştır.

Bu sayfa, birden fazla ses cihazına ses akışı desteğinin nasıl uygulanacağını ve bu özelliği uygulamanızın nasıl doğrulanacağını kapsar.

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 çok tercih edilen cihazı yönetir.
  • Satıcı tarafından ses HAL'ın bir parçası olarak uygulanan HIDL arabirimi, cihaz yeteneklerini bildirir.

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

Bir strateji için birden çok tercih edilen cihazı kullanma

Audio Policy Manager, aynı anda birden fazla ses cihazına ses akışını daha iyi desteklemek için sistem API'leri sunar. Bunlar sistem API'leri alma ve belirli bir strateji için birden tercih cihazlar kaldırarak, ayarını etkinleştirin. Android 12'ye kadar bu özellik yalnızca tek bir cihaz için destekleniyordu.

Ses Politika Yöneticisi medya oynatma için en olası alınmayı olan cihazları tanımlamak için aktif medya cihazlarının kavramını tanıtır. Ayrılabilir bir aygıt bağlandığında, bu aygıta yönlendirilebilen ses HAL çıkış akışlarının açılması ve desteklenen özniteliklerin araştırılması gerekebilir.

Bir çıkış akışı açılırken bir ses cihazı belirtilmelidir. Aktif medya cihazı, bu bağlamda çıkış akışları açıldığında kullanılan cihazdır.

Aktif medya cihazı seçimi, bağlanan veya bağlantısı kesilen gerçek cihazlara bağlı olarak değişebilir. Audio Policy Manager, aktif medya cihazlarını seçmek için aşağıdaki kurallar dizisini kullanır:

  1. Medya için tercih edilen tüm cihazlar mevcutsa, hepsi aktif cihazlar olarak seçilir.
  2. Aksi takdirde, en 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 yönelik varsayılan ses ilkesi kuralları uygulanır.

Bir çıkış akışının yeniden açılması ve etkin cihazlara yönlendirilmesi için aşağıdaki kriterleri karşılaması gerekir, böylece oynatma için en iyi yapılandırma seçilir:

  • Çıkış akımı aktif cihazları desteklemelidir.
  • Çıktı akışı dinamik profilleri desteklemelidir.
  • Çıkış akışı şu anda etkin cihazlara yönlendirilmemelidir.

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

Ses Politika Yöneticisi sistem API'larından aşağıdaki listeyi (tanımlandığı gibi sunuyor AudioManager.java ):

  • setPreferredDeviceForStrategy

    Belirli bir strateji için ses yönlendirmesi için tercih edilen cihazı ayarlar. Cihazın, tercih edilen cihaz ayarlandığı sırada mevcut olmayabileceğini, ancak kullanıma sunulduğunda kullanıldığını unutmayın.

  • removePreferredDeviceForStrategy

    Daha önceden belirlenen tercih ses cihaz (lar) kaldırır setPreferredDeviceForStrategy veya setPreferredDevicesForStrategy .

  • getPreferredDeviceForStrategy

    Daha önceden belirlenen bir ses stratejisi için tercih edilen bir aygıtı döndürür setPreferredDeviceForStrategy veya setPreferredDevicesForStrategy .

  • setPreferredDevicesForStrategy

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

  • getPreferredDevicesForStrategy

    Daha önce ayarlanan bir ses stratejisi için tercih cihazları döndürür setPreferredDeviceForStrategy veya setPreferredDevicesForStrategy .

  • OnPreferredDevicesForStrategyChangedListener

    Belirli bir ses stratejisi için ayarlanan tercih edilen ses cihazlarındaki değişikliklerin bildirimi için bir arabirim tanımlar.

  • addOnPreferredDevicesForStrategyChangedListener

    Strateji tarafından tercih edilen ses cihazındaki değişikliklerden haberdar olmak için bir dinleyici ekler.

  • removeOnPreferredDevicesForStrategyChangedListener

    Strateji tarafından tercih edilen ses cihazına önceden eklenmiş bir değişiklik dinleyicisini kaldırır.

Raporlama cihazı özellikleri

Satıcılar, Audio HAL uygulamasının bir parçası olarak, raporlama cihazı özelliklerini destekleyen API'leri uygular. Bu bölüm, aygıt yeteneklerini raporlamak için kullanılan veri türlerini ve yöntemleri açıklar ve birden çok aygıtı desteklemek için ses HIDL HAL V7'de yapılan bazı değişiklikleri listeler.

Veri tipleri

Ses HIDL HAL V7, cihaz yetenekleri kullanılarak raporlanır AudioProfile ve AudioTransport yapıları. AudioTransport yapısı ile bir ses limanın kapasitesinin tanımlanmasına AudioProfile bilinen ses formatları için, ya da platform tarafından bilinmeyen biçimleri için ham donanım tanımlayıcıları. AudioProfile aşağıdaki kod bloğu gösterilen yapı, ses formatı, profil tarafından desteklenen örnek oranları ve kanalı maskeleri listesini içerir types.hal :

/**
* 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;
};

Ses HIDL HAL V7, AudioPort veri türü ile tanımlanır AudioTransport ve AudioProfile cihazın işlevlerini açıklamak için yapılar.

Ses HAL yöntemleri

Audio Policy Manager, cihazın özelliklerini sorgulamak için aşağıdaki yöntemleri kullanır:

  • getParameters: , desteklenen ses formatları ve bunların ilgili örnekleme oranları olarak satıcıya özgü parametre değerlerini almak için kullanılan genel bir yöntem.
  • getAudioPort: Belirli bir ses portu için (örnekleme oranları, formatlar, kanal maskeleri, kazanç kontrolörleri gibi) desteklenen özelliklerin listesini döndürür.

Aşağıdaki kod IDevice.hal için arayüz gösterir getAudioPort yöntemi:

   /**
    * 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'deki değişiklikler

Birden çok ses profilleri, eski API sürümü 3.2 desteklemek için adı verilen yeni bir yapı ekler audio_port_v7 . Bkz kaynak kodu Daha fazla ayrıntı için.

Çünkü eklenmesi audio_port_v7 , eski API sürüm 3.2 adlı yeni API ekler get_audio_port_v7 kullanarak sorgu cihazların yetenekleri audio_port_v7 yapısını.

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

/**
 * 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 veriler get_audio_port API yeni içine doldurulması için olan AudioPort Eski API versiyonu aşağıda 3.2 ve HIDL HAL sürüm 7 veya üzerinde olduğunda biçimi. Bu durumda, tüm örnekleme hızları ve kanal maskeleri bildirdi get_audio_port gelen basit bir eşleme sağlayan tüm iade biçimler için desteklenecek varsayılır get_audio_port yeni değerler AudioPort yapısı.

Örnek API uygulamaları

Bu bölüm, önceki bölümlerde kapsanan API'leri kullanan yöntemleri içeren birkaç test paketini açıklar. Bu API'lerin nasıl uygulandığına ve kullanıldığına ilişkin bazı örnekler için bu yöntemlere bakın.

Kullanımına bir örnek setPreferredDevicesForStrategy , getPreferredDevicesForStrategy , removePreferredDeviceForStrategy ve OnPreferredDevicesForStrategyChangedListener sistemi API'leri olan PreferredDeviceRoutingTest GTS bulunur yöntem.

Yeni yapının bir örneğini görmek için AudioDeviceInfo kullanımda, bkz AudioManagerTest#testGetDevices CTS bulunur yöntem.

İçin uygulamaya örnek get_audio_port_v7 bulunan audio_hal.c ve yetenekleri birden fazla cihaz için sorgulanan gösterir.

doğrulama

Bu bölüm hakkında bilgi verir CTS ve GTS (Google Mobil Hizmetler Testi Suite) Audio Manager doğrulanması.

CTS testleri

CTS testleri bulunmaktadır android.media.cts.AudioManagerTest .

Kullanılabilir Audio Manager testlerinin listesi aşağıdadır:

  • AudioManagerTest#testGetDevices

    Ses cihazının kesin özelliklerini doğrular. Ayrıca doğrular döndürülen ses profilleri olduğunu AudioDeviceInfo yapısı daha eski, düzleşmiş dizi formatında içeriğini korumak, ancak yeni içindedir AudioProfile formatında.

  • AudioManagerTest#testPreferredDevicesForStrategy ve AudioManagerTest#testPreferredDeviceForCapturePreset

    Strateji ve yakalama ön ayarıyla ilgili API testleri için tercih edilen cihazların başarıyla tamamlandığını doğrulayın.

GTS testleri

GTS testler bulunmaktadır com.google.android.gts.audioservice.AudioServiceHostTest .

Doğrulamak için doğru şekilde strateji ve yakalama önceden iş için tercih edilen cihazlar için API çalıştırmak AudioServiceHostTest#testPreferredDeviceRouting ve AudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset testleri.