Android Automotive OS (AAOS), bir araçta bilgi-eğlence sistemi olarak çalışmaya yönelik kullanım örneklerini desteklemek için çekirdek Android ses yığınını temel alır. AAOS bilgi-eğlence seslerinden (yani medya, navigasyon ve iletişim) sorumludur ancak kesin kullanılabilirlik ve zamanlama gereksinimleri olan zil seslerinden ve uyarılardan doğrudan sorumlu değildir. AAOS, aracın sesi yönetmesine yardımcı olacak sinyaller ve mekanizmalar sağlarken, sonuçta sürücü ve yolcular için hangi seslerin çalınması gerektiğine karar vermek araca kalmıştır; güvenlik açısından kritik seslerin ve düzenleyici seslerin, kesinti.
Android, aracın medya deneyimini yönettiğinden, radyo alıcısı gibi harici medya kaynaklarının, kaynak için ses odağını ve medya anahtar olaylarını yönetebilen uygulamalar tarafından temsil edilmesi gerekir.
Android 11, otomotivle ilgili ses desteğinde aşağıdaki değişiklikleri içerir:
- İlgili Kullanıcı Kimliğine göre otomatik ses bölgesi seçimi
- Otomotive özgü sesleri desteklemek için yeni sistem kullanımları
- HAL ses odaklama desteği
- Geçici olmayan akışlar için gecikmeli ses odağı
- Navigasyon ve aramalar arasındaki etkileşimi kontrol etmek için kullanıcı ayarı
Android sesleri ve akışları
Otomotiv ses sistemleri aşağıdaki sesleri ve akışları yönetir:
Şekil 1. Akış merkezli mimari diyagramı
Android, Android uygulamalarından gelen sesleri yönetir, bu uygulamaları kontrol eder ve seslerin türüne göre seslerini HAL'deki çıkış cihazlarına yönlendirir:
- Temel ses terminolojisinde kaynaklar olarak bilinen mantıksal akışlar , Ses Nitelikleri ile etiketlenir.
- Çekirdek ses terminolojisinde cihazlar olarak bilinen fiziksel akışlar , miksaj sonrasında hiçbir bağlam bilgisine sahip değildir.
Güvenilirlik açısından harici sesler (emniyet kemeri uyarı sesleri gibi bağımsız kaynaklardan gelen) Android dışında, HAL'ın altında ve hatta ayrı bir donanımda yönetilir. Sistem uygulayıcıları, Android'den gelen bir veya daha fazla ses girişi akışını kabul eden ve daha sonra bu akışları aracın gerektirdiği harici ses kaynaklarıyla uygun bir şekilde birleştiren bir mikser sağlamalıdır.
HAL uygulaması ve harici mikser, güvenlik açısından kritik harici seslerin duyulmasını sağlamaktan ve Android tarafından sağlanan akışlarda karıştırılıp bunları uygun hoparlörlere yönlendirmekten sorumludur.
Android sesleri
Uygulamalar, bir veya daha fazla mantıksal ses verisi akışı sağlamak üzere standart Android API'leri (örneğin, odak kontrolü için AudioManager veya akış için MediaPlayer ) aracılığıyla etkileşime giren bir veya daha fazla oynatıcıya sahip olabilir. Bu veriler tek kanallı mono veya 7.1 surround olabilir ancak tek bir kaynak olarak yönlendirilir ve işlenir. Uygulama akışı, sesin nasıl ifade edilmesi gerektiğine ilişkin sisteme ipuçları veren AudioAttributes ile ilişkilidir.
Mantıksal akışlar AudioService aracılığıyla gönderilir ve her biri AudioFlinger içindeki bir mikserin çıkışı olan mevcut fiziksel çıkış akışlarından birine (ve yalnızca birine) yönlendirilir. Ses nitelikleri fiziksel bir akışa karıştırıldıktan sonra artık kullanılamazlar.
Daha sonra her fiziksel akış, donanımda işlenmek üzere Ses HAL'e iletilir. Otomotiv uygulamalarında işleme donanımı, yerel kodlayıcılar (mobil cihazlara benzer) veya aracın fiziksel ağı üzerindeki uzak bir işlemci olabilir. Her iki durumda da, gerçek örnek verileri iletmek ve bunların duyulabilir hale gelmesini sağlamak Audio HAL uygulamasının görevidir.
Dış akışlar
Android üzerinden yönlendirilmemesi gereken ses akışları (sertifika veya zamanlama nedenleriyle) doğrudan harici miksere gönderilebilir. Android 11'den itibaren HAL, medyayı duraklatmak veya başkalarının odaklanmasını önlemek gibi uygun eylemleri gerçekleştirebilmesi için Android'i bilgilendirmek amacıyla artık bu harici seslere odaklanma talebinde bulunabiliyor.
Harici akışlar, Android'in oluşturduğu ses ortamıyla etkileşime girmesi gereken medya kaynaklarıysa (örneğin, harici tuner açıldığında MP3 oynatmanın durdurulması), bu harici akışların bir Android uygulaması tarafından temsil edilmesi gerekir. Böyle bir uygulama, HAL yerine medya kaynağı adına ses odağı talep eder ve Android odaklama politikasına uymak için gerektiği şekilde harici kaynağı başlatarak/durdurarak odak bildirimlerine yanıt verir. Uygulama aynı zamanda oynatma/duraklatma gibi önemli medya olaylarını yönetmekten de sorumludur. Bu tür harici cihazları kontrol etmek için önerilen mekanizmalardan biri HwAudioSource'tur .
Çıktı cihazları
Ses HAL düzeyinde, AUDIO_DEVICE_OUT_BUS
cihaz türü, araç ses sistemlerinde kullanım için genel bir çıkış cihazı sağlar. Veri yolu cihazı, adreslenebilir bağlantı noktalarını (her bağlantı noktasının fiziksel bir akışın bitiş noktası olduğu) destekler ve bir araçta desteklenen tek çıkış cihazı türü olması beklenir.
Bir sistem uygulaması tüm Android sesleri için tek bir veri yolu bağlantı noktası kullanabilir; bu durumda Android her şeyi bir araya getirir ve tek bir akış olarak sunar. Alternatif olarak HAL, herhangi bir ses tipinin eş zamanlı iletilmesine olanak sağlamak amacıyla her CarAudioContext
için bir veri yolu bağlantı noktası sağlayabilir. Bu, HAL uygulamasının farklı sesleri istenildiği gibi karıştırıp azaltmasını mümkün kılar.
Ses bağlamlarının çıkış cihazlarına atanması car_audio_configuration.xml
aracılığıyla yapılır.
Mikrofon girişi
Sesi yakalarken Audio HAL, mikrofon girişinin nasıl işlenmesi gerektiğini belirten bir AudioSource
bağımsız değişkeni içeren bir openInputStream
çağrısı alır.
VOICE_RECOGNITION
kaynağı (özellikle Google Asistan), yankı giderme etkisine sahip (varsa) ancak kendisine başka hiçbir işlem uygulanmayan bir stereo mikrofon akışı bekler. Hüzmelemenin Asistan tarafından yapılması bekleniyor.
Çok kanallı mikrofon girişi
İkiden fazla kanalı (stereo) olan bir cihazdan ses yakalamak için konumsal indeks maskesi ( CHANNEL_IN_LEFT
gibi) yerine bir kanal indeks maskesi kullanın. Örnek:
final AudioFormat audioFormat = new AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setSampleRate(44100) .setChannelIndexMask(0xf /* 4 channels, 0..3 */) .build(); final AudioRecord audioRecord = new AudioRecord.Builder() .setAudioFormat(audioFormat) .build(); audioRecord.setPreferredDevice(someAudioDeviceInfo);
Hem setChannelMask
hem de setChannelIndexMask
ayarlandığında, AudioRecord
yalnızca setChannelMask
tarafından ayarlanan değeri kullanır (maksimum iki kanal).
Eşzamanlı yakalama
Android 10'dan itibaren Android çerçevesi, girişlerin eşzamanlı olarak yakalanmasını desteklemektedir, ancak kullanıcının gizliliğini korumak için kısıtlamalar bulunmaktadır. Bu kısıtlamaların bir parçası olarak, AUDIO_SOURCE_FM_TUNER
gibi sanal kaynaklar göz ardı edilir ve bu nedenle, normal bir girişle (mikrofon gibi) eşzamanlı olarak yakalanmasına izin verilir. HwAudioSources
ayrıca eşzamanlı yakalama kısıtlamalarının bir parçası olarak değerlendirilmez.
AUDIO_DEVICE_IN_BUS
cihazlarıyla veya ikincil AUDIO_DEVICE_IN_FM_TUNER
cihazlarıyla çalışmak üzere tasarlanan uygulamalar, Android'in varsayılan kaynak seçimi mantığını atlamak için bu cihazları açıkça tanımlamaya ve AudioRecord.setPreferredDevice()
kullanmaya dayanmalıdır.
Ses kullanımları
AAOS, yönlendirme, ses düzeyi ayarlamaları ve odak yönetimi için öncelikli olarak AudioAttributes.AttributeUsages
kullanır. Kullanımlar, akışın "neden" oynatıldığının bir temsilidir. Bu nedenle, tüm akışlar ve ses odaklama istekleri, ses oynatımına yönelik bir kullanım belirtmelidir. Bir AudioAttributes nesnesi oluşturulurken özel olarak ayarlanmadığında, kullanım varsayılan olarak USAGE_UNKNOWN
olarak ayarlanacaktır. Bu şu anda USAGE_MEDIA
ile aynı şekilde ele alınsa da, medya oynatma için bu davranışa güvenilmemelidir.
Sistem kullanımları
Android 11'de sistem kullanımları tanıtıldı. Bu kullanımlar, android.permission.MODIFY_AUDIO_ROUTING
yanı sıra sistem API'lerinin de kullanılmasını gerektirmesi dışında önceden belirlenmiş kullanımlara benzer şekilde davranır. Yeni sistem kullanımları şöyle:
-
USAGE_EMERGENCY
-
USAGE_SAFETY
-
USAGE_VEHICLE_STATUS
-
USAGE_ANNOUNCEMENT
Sistem kullanımıyla bir AudioAttributes
oluşturmak için setUsage
yerine AudioAttributes.Builder#setSystemUsage
kullanın. Bu yöntemin sistem dışı bir kullanımla çağrılması, IllegalArgumentException
oluşmasına neden olur. Ayrıca, bir oluşturucuda hem sistem kullanımı hem de kullanım ayarlanmışsa, oluşturma sırasında bir IllegalArgumentException
oluşturacaktır.
Bir AudioAttributes
örneğiyle hangi kullanımın ilişkilendirildiğini kontrol etmek için AudioAttributes#getSystemUsage
çağırın. Bu, ilişkili kullanımı veya sistem kullanımını döndürür.
Ses bağlamları
AAOS ses yapılandırmasını basitleştirmek için benzer kullanımlar CarAudioContext
altında gruplandırılmıştır. Bu ses bağlamları, CarAudioService
genelinde yönlendirmeyi, ses seviyesi gruplarını ve ses odak yönetimini tanımlamak için kullanılır.
Android 11'deki ses bağlamları şunlardır:
ArabaAudioContext | İlişkili Özellik Kullanımları |
---|---|
MUSIC | UNKNOWN, GAME, MEDIA |
NAVIGATION | ASSISTANCE_NAVIGATION_GUIDANCE |
VOICE_COMMAND | ASSISTANT, ASSISTANCE_ACCESSIBILITY |
CALL_RING | NOTIFICATION_RINGTONE |
CALL | VOICE_COMMUNICATION, VOICE_COMMUNICATION_SIGNALING |
ALARM | ALARM |
NOTIFICATION | NOTIFICATION, NOTIFICATION_* |
SYSTEM_SOUND | ASSISTANCE_SONIFICATION |
EMERGENCY | EMERGENCY |
SAFETY | SAFETY |
VEHICLE_STATUS | VEHICLE_STATUS |
ANNOUNCEMENT | ANNOUNCEMENT |
Ses bağlamları ve kullanımları arasında eşleme. Vurgulanan satırlar yeni sistem kullanımları içindir.
Çok bölgeli ses
Otomotivle birlikte, platformla etkileşime giren ve ayrı medya tüketmek isteyen eşzamanlı kullanıcılarla ilgili yeni bir dizi kullanım senaryosu geliyor. Örneğin, bir sürücü kabinde müzik çalabilirken, arka koltuktaki yolcular arka ekranda bir YouTube videosu izleyebilir. Çok bölgeli ses, farklı ses kaynaklarının aracın farklı alanlarında aynı anda çalınmasına izin vererek bunu mümkün kılar.
Android 10'da başlayan çok bölgeli ses, OEM'lerin sesi ayrı bölgelerde yapılandırmasına olanak tanır. Her bölge, araç içindeki kendi hacim gruplarına, bağlamlara yönelik yönlendirme yapılandırmasına ve odak yönetimine sahip cihazların bir koleksiyonudur. Bu şekilde, ana kabin bir ses bölgesi olarak yapılandırılabilirken arka ekranın kulaklık jakları ikinci bir bölge olarak yapılandırılabilir.
Bölgeler car_audio_configuration.xml
dosyasının parçası olarak tanımlanır. CarAudioService
daha sonra yapılandırmayı okur ve AudioService'in ses akışlarını ilgili bölgelere göre yönlendirmesine yardımcı olur. Her bölge yine de bağlamlara ve uygulama kullanıcı kimliğine dayalı olarak yönlendirme kurallarını tanımlar. Bir oynatıcı oluşturulduğunda CarAudioService
, oynatıcının hangi bölgeyle ilişkilendirildiğini ve ardından kullanıma bağlı olarak AudioFlinger'ın sesi hangi cihaza yönlendirmesi gerektiğini belirler.
Odaklanma ayrıca her ses bölgesi için bağımsız olarak korunur. Bu, farklı bölgelerdeki uygulamaların birbirlerine müdahale etmeden bağımsız olarak ses üretmesine olanak tanırken, uygulamaların kendi bölgelerindeki odak değişikliklerine hâlâ saygı göstermesini sağlar. CarAudioService
içindeki CarZonesAudioFocus
her bölgeye yönelik odağın yönetilmesinden sorumludur.
Şekil 2. Çok bölgeli sesi yapılandırma
Ses HAL'i
Otomotiv ses uygulamaları, aşağıdakileri içeren standart Android Audio HAL'a dayanır:
-
IDevice.hal
. Giriş ve çıkış akışları oluşturur, ana ses seviyesini ve sessize almayı yönetir ve şunları kullanır:-
createAudioPatch
. Cihazlar arasında harici-harici yamalar oluşturmak için. -
IDevice.setAudioPortConfig()
her fiziksel akış için ses düzeyi sağlar.
-
-
IStream.hal
. Giriş ve çıkış değişkenlerinin yanı sıra, ses örneklerinin donanıma ve donanımdan akışını yönetir.
Otomotiv cihaz türleri
Aşağıdaki cihaz türleri otomotiv platformları için geçerlidir.
Cihaz tipi | Tanım |
---|---|
AUDIO_DEVICE_OUT_BUS | Android'den birincil çıkış (Android'den gelen tüm ses araca bu şekilde iletilir). Her bağlam için akışların belirsizliğini ortadan kaldırmak için adres olarak kullanılır. |
AUDIO_DEVICE_OUT_TELEPHONY_TX | İletim için hücresel radyoya yönlendirilen ses için kullanılır. |
AUDIO_DEVICE_IN_BUS | Başka şekilde sınıflandırılmamış girdiler için kullanılır. |
AUDIO_DEVICE_IN_FM_TUNER | Yalnızca radyo yayını girişi için kullanılır. |
AUDIO_DEVICE_IN_TV_TUNER | Varsa bir TV cihazı için kullanılır. |
AUDIO_DEVICE_IN_LINE | AUX giriş jakı için kullanılır. |
AUDIO_DEVICE_IN_BLUETOOTH_A2DP | Müzik Bluetooth üzerinden alındı. |
AUDIO_DEVICE_IN_TELEPHONY_RX | Bir telefon görüşmesiyle ilişkili hücresel radyodan alınan ses için kullanılır. |
Ses cihazlarını yapılandırma
Android tarafından görülebilen ses cihazları, aşağıdaki bileşenleri içeren /audio_policy_configuration.xml
dosyasında tanımlanmalıdır:
- Modül Adı. "Birincil" (otomotiv kullanım durumları için kullanılır), "A2DP", "remote_submix" ve "USB"yi destekler. Modül adı ve karşılık gelen ses sürücüsü
audio.primary.$(variant).so
dosyasına derlenmelidir. - cihaz Bağlantı Noktaları. Bu modülden erişilebilen tüm giriş ve çıkış aygıtları (kalıcı olarak bağlanan aygıtlar ve çıkarılabilir aygıtlar dahil) için aygıt tanımlayıcılarının bir listesini içerir.
- Her çıkış cihazı için, milibel cinsinden min/maks/varsayılan/adım değerlerinden oluşan kazanç kontrolünü tanımlayabilirsiniz (1 milibel = 1/100 dB = 1/1000 bel).
- DevicePort örneğindeki adres özelliği,
AUDIO_DEVICE_OUT_BUS
ile aynı cihaz türüne sahip birden fazla cihaz olsa bile cihazı bulmak için kullanılabilir. - mixPort'lar. Ses HAL tarafından sunulan tüm çıkış ve giriş akışlarının bir listesini içerir. Her mixPort örneği, Android AudioService'e fiziksel bir akış olarak düşünülebilir.
- rotalar. Giriş ve çıkış aygıtları arasındaki veya akış ve aygıt arasındaki olası bağlantıların listesini tanımlar.
Aşağıdaki örnek, tüm Android ses akışlarının mikser_bus0_phone_out tarafından karıştırıldığı bir çıkış cihazı bus0_phone_out'u tanımlar. Rota, mixer_bus0_phone_out
çıkış akışını aygıt bus0_phone_out
götürür.
<audioPolicyConfiguration version="1.0" xmlns:xi="http://www.w3.org/2001/XInclude"> <modules> <module name="primary" halVersion="3.0"> <attachedDevices> <item>bus0_phone_out</item> <defaultOutputDevice>bus0_phone_out</defaultOutputDevice> <mixPorts> <mixPort name="mixport_bus0_phone_out" role="source" flags="AUDIO_OUTPUT_FLAG_PRIMARY"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> </mixPort> </mixPorts> <devicePorts> <devicePort tagName="bus0_phone_out" role="sink" type="AUDIO_DEVICE_OUT_BUS" address="BUS00_PHONE"> <profile name="" format="AUDIO_FORMAT_PCM_16_BIT" samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/> <gains> <gain name="" mode="AUDIO_GAIN_MODE_JOINT" minValueMB="-8400" maxValueMB="4000" defaultValueMB="0" stepValueMB="100"/> </gains> </devicePort> </devicePorts> <routes> <route type="mix" sink="bus0_phone_out" sources="mixport_bus0_phone_out"/> </routes> </module> </modules> </audioPolicyConfiguration>