Birleştirilmiş ses cihazı yönlendirme özelliği, aynı anda birden fazla ses cihazına ses akışı yapma desteği ekler. 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 özellik tarafından sağlanan herkese açık API'leri kullanarak ses cihazlarının özelliklerini daha hassas bir şekilde keşfedebilir. Android 11 ve önceki sürümlerde, ses çerçevesi uygulaması aynı türden birden fazla ses cihazının (ör. aynı anda bağlanan 2 Bluetooth A2DP kulaklık) sınırlı desteğine sahiptir. Varsayılan ses yönlendirme kuralları da kullanıcıların belirli bir kullanım alanı için aynı türden birden fazla cihaz seçmesine izin vermez.
Android 12'den itibaren, ses yayını, bir grup BLE ses kulaklığına çoklu yayın veya aynı anda birden fazla USB ses kartı seçme gibi yeni kullanım alanlarına izin vermek için bu sınırlamalar kaldırıldı. Aynı anda birden fazla USB cihaza yönlendirme desteklenmez.
Android 14'ten itibaren USB çerçevesi, USB cihazların farklı ses cihazı türlerinde olması ve birden fazla USB cihazın aynı anda bağlanması için çekirdek ve satıcı desteği olması koşuluyla birden fazla USB cihaza yönlendirmeyi destekler.
Bu sayfada, birden fazla ses cihazına ses akışı desteğinin nasıl uygulanacağı ve bu özelliğin uygulamanızda nasıl doğrulanacağı açıklanmaktadı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ı işler.
- Satıcı tarafından ses HAL'sinin bir parçası olarak uygulanan HIDL arayüzü, cihaz özelliklerini bildirir.
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ı yönetme
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 cihazda destekleniyordu.
Ses Politikası Yöneticisi, medya oynatma için seçilme olasılığı en yüksek olan cihazları tanımlamak amacıyla etkin medya cihazları kavramını sunar. Sökülebilir bir cihaz bağlandığında, bu cihaza yönlendirilebilen ses HAL çıkış akışlarının açılması ve desteklenen özellikler için araştırılması gerekebilir.
Çıkış akışı açılırken bir ses cihazı belirtilmelidir. Etkin medya cihazı, bu bağlamda çıkış akışları açıldığında kullanılan cihazdır.
Etkin medya cihazı seçimi, bağlı veya bağlantısı kesilmiş 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:
- Medya için tercih edilen tüm cihazlar kullanılabilirse hepsi etkin cihaz olarak seçilir.
- Aksi takdirde, son bağlanan çıkarılabilir cihaz seçilir.
- Çıkarılabilir cihaz bağlı değilse etkin cihazları seçmek için çıkış cihazlarını seçmeyle ilgili varsayılan ses politikası kuralları uygulanır.
Bir çıkış akışının yeniden açılıp etkin cihazlara yönlendirilmesi ve oynatma için en iyi yapılandırmanın seçilmesi için aşağıdaki ölçütleri karşılaması gerekir:
- Çıkış akışı, etkin cihazları desteklemelidir.
- Çıkış akışı, dinamik profilleri desteklemelidir.
- Çıkış akışı şu anda etkin cihazlara yönlendirilmemiş olmalıdır.
Yeni bir cihaz seçimi uygulamak için ses politikası yöneticisi, çıkış akışı boşta ise cihaz bağlantısı üzerine bir çıkış akışını kapatıp yeniden açar veya çıkış akışı bekleme moduna alındığında bunu erteler.
Ses Politikası Yöneticisi, aşağıdaki sistem API'leri listesini sunar(AudioManager.java
içinde tanımlandığı gibi):
setPreferredDeviceForStrategy
Belirli bir strateji için ses yönlendirmesinde tercih edilen cihazı ayarlar. Tercih edilen cihaz ayarlandığı sırada kullanılamayabilir ancak kullanıma sunulduğunda kullanılır.
removePreferredDeviceForStrategy
Daha önce
setPreferredDeviceForStrategy
veyasetPreferredDevicesForStrategy
ile ayarlanan tercih edilen ses cihazlarını kaldırır.getPreferredDeviceForStrategy
Daha önce
setPreferredDeviceForStrategy
veyasetPreferredDevicesForStrategy
ile ayarlanmış bir ses stratejisi için tercih edilen cihazı döndürür.setPreferredDevicesForStrategy
Belirli bir strateji için tercih edilen cihazları ayarlar.
getPreferredDevicesForStrategy
Daha önce
setPreferredDeviceForStrategy
veyasetPreferredDevicesForStrategy
ile ayarlanan 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
Stratejinin tercih ettiği ses cihazında yapılan değişikliklerden haberdar olmak için bir dinleyici ekler.
removeOnPreferredDevicesForStrategyChangedListener
Daha önce eklenen, stratejinin tercih ettiği ses cihazındaki değişikliklerin dinleyicisini kaldırır.
Cihaz özelliklerini raporlama
Tedarikçiler, Audio HAL uygulamasının bir parçası olarak cihaz özelliklerinin bildirilmesini destekleyen API'leri uygular. Bu bölümde, cihaz özelliklerini bildirmek için kullanılan veri türleri ve yöntemler açıklanmakta, ayrıca birden fazla cihazı desteklemek için ses HIDL HAL V7'de yapılan bazı değişiklikler listelenmektedir.
Veri türleri
Ses HIDL HAL V7'de cihaz özellikleri, AudioProfile
ve AudioTransport
yapıları kullanılarak bildirilir. AudioTransport
yapısı, bilinen ses biçimleri için AudioProfile
ile veya platform tarafından bilinmeyen biçimler için ham donanım tanımlayıcılarıyla bir ses bağlantı noktasının özelliğini açıklar. AudioProfile
yapısı, types.hal
'dan alınan aşağıdaki kod bloğunda gösterildiği gibi ses biçimini, 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;
};
Ses HIDL HAL V7'de AudioPort
veri türü, cihazın özelliklerini açıklamak için AudioTransport
ve AudioProfile
yapılarıyla tanımlanır.
Ses HAL yöntemleri
Ses Politikası Yöneticisi, cihazın özelliklerini sorgulamak için aşağıdaki yöntemleri kullanır:
getParameters:
Desteklenen ses biçimleri ve ilgili örnekleme hızları gibi tedarikçiye özel parametre değerlerini almak için kullanılan genel bir yöntem.getAudioPort:
Belirli bir ses bağlantı noktası için desteklenen özelliklerin (ör. örnekleme hızları, biçimler, kanal maskeleri, kazanç denetleyicileri) listesini döndürür.
IDevice.hal
adresindeki aşağıdaki kodda, getAudioPort
yönteminin arayüzü gösterilmektedir:
/**
* 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
Eski API'nin 3.2 sürümü, birden fazla ses profilini desteklemek için audio_port_v7
adlı yeni bir yapı ekler. Daha fazla bilgi için kaynak koduna bakın.
audio_port_v7
eklendiğinden, eski API'nin 3.2 sürümünde audio_port_v7
yapısını kullanarak cihazların özelliklerini sorgulamak için get_audio_port_v7
adlı yeni bir API ekleniyor.
audio.h
kaynağındaki aşağıdaki kodda get_audio_port_v7
API'sinin tanımı gösterilmektedir:
/**
* 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 get_audio_port
API'sinden alınan veriler, eski API sürümü 3.2'den düşük ve HIDL HAL sürümü 7 veya üzeri olduğunda yeni AudioPort
biçimine doldurulmalıdır. Bu durumda, get_audio_port
kaynağından bildirilen tüm örnekleme hızlarının ve kanal maskelerinin, döndürülen tüm biçimler için desteklendiği varsayılır. Böylece, get_audio_port
değerlerinden yeni AudioPort
yapısına doğrudan eşleme yapılabilir.
Ö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ığı ve kullanıldığına dair bazı örnekler için bu yöntemlere bakın.
setPreferredDevicesForStrategy
,
getPreferredDevicesForStrategy
, removePreferredDeviceForStrategy
ve
OnPreferredDevicesForStrategyChangedListener
sistem API'lerinin kullanımına ilişkin bir örnek, GTS'de bulunan
PreferredDeviceRoutingTest
yöntemindedir.
AudioDeviceInfo
içinde yeni yapının kullanımına dair bir örnek görmek için CTS'de bulunan AudioManagerTest#testGetDevices
yöntemine bakın.
get_audio_port_v7
için uygulama örneği audio_hal.c
içinde yer alır ve özelliklerin birden fazla cihaz için nasıl sorgulandığını gösterir.
Doğrulama
Bu bölümde, Ses Yöneticisi'nin CTS ve GTS (Google Mobil Hizmetleri Test Paketi) doğrulaması hakkında bilgi verilmektedir.
CTS testleri
CTS testleri android.media.cts.AudioManagerTest
konumunda bulunur.
Kullanılabilen Ses Yöneticisi testlerinin listesini aşağıda bulabilirsiniz:
AudioManagerTest#testGetDevices
Ses cihazının tam özelliklerini doğrular. Ayrıca,
AudioDeviceInfo
yapısında döndürülen ses profillerinin, eski ve düzleştirilmiş dizi biçimindeki içeriği koruduğunu ancak yeniAudioProfile
biçiminde olduğunu doğrular.AudioManagerTest#testPreferredDevicesForStrategy
veAudioManagerTest#testPreferredDeviceForCapturePreset
Strateji ve yakalama ön ayarı ile ilgili API testlerinin başarıyla tamamlandığını doğrulayın.
GTS testleri
GTS testleri com.google.android.gts.audioservice.AudioServiceHostTest
konumunda yapılır.
Strateji ve önceden ayarlanmış yakalama için tercih edilen cihazların API'lerinin doğru şekilde çalıştığını doğrulamak üzere AudioServiceHostTest#testPreferredDeviceRouting
ve AudioServiceHostTest#testPreferredDeviceRoutingForCapturePreset
testlerini çalıştırın.