Android Automotive OS (AAOS), bir araçta bilgi-eğlence sistemi olarak çalışmayla ilgili kullanım alanlarını desteklemek için temel Android ses yığınını temel alır. AAOS, bilgi-eğlence seslerinden (ör. medya, navigasyon ve iletişim) sorumludur ancak katı kullanılabilirlik ve zamanlama koşullarına sahip zil sesleri ve uyarılardan doğrudan sorumlu değildir. AAOS, aracın sesi yönetmesine yardımcı olacak sinyaller ve mekanizmalar sağlar. Ancak sürücü ve yolcular için hangi seslerin çalınacağına karar vermek, aracın görevidir. Bu sayede, güvenlik açısından kritik sesler ve yasal sesler kesintisiz olarak düzgün bir şekilde duyulur.
Android, aracın medya deneyimini yönettiğinden radyo tuner gibi harici medya kaynakları, kaynak için ses odağını ve medya anahtar etkinliklerini yönetebilen uygulamalarla temsil edilmelidir.
Android 11, otomotivle ilgili ses desteğinde aşağıdaki değişiklikleri içerir:
- İlişkili User-ID'ye göre otomatik ses bölgesi seçimi
- Otomotive özgü sesleri desteklemek için yeni sistem kullanımları
- HAL ses odak desteği
- Geçici olmayan yayınlar için gecikmeli ses odak noktası
- Gezinme ve aramalar arasındaki etkileşimi kontrol eden kullanıcı ayarı
Android sesleri ve akışları
Otomotiv ses sistemleri aşağıdaki sesleri ve akışları işler:
Şekil 1. Akış odaklı mimari şeması
Android, Android uygulamalarından gelen sesleri yönetir, bu uygulamaları kontrol eder ve ses türlerine göre seslerini HAL'deki çıkış cihazlarına yönlendirir:
- Temel ses terminolojisinde kaynaklar olarak bilinen mantıksal akışlar, ses özellikleri ile etiketlenir.
- Temel ses terminolojisinde cihaz olarak bilinen fiziksel akışlar, karıştırma işleminden sonra bağlam bilgisi içermez.
Güvenilirlik için harici sesler (emniyet kemeri uyarı zilleri gibi bağımsız kaynaklardan gelen sesler) Android'in dışında, HAL'in altında veya hatta ayrı bir donanımda yönetilir. Sistem uygulayıcıları, Android'den bir veya daha fazla ses girişi akışı kabul eden ve ardından bu akışları aracın gerektirdiği harici ses kaynaklarıyla uygun şekilde birleştiren bir karıştırıcı sağlamalıdır.
Güvenlik açısından kritik olan harici seslerin duyulmasını sağlamanın yanı sıra Android tarafından sağlanan akışları karıştırıp uygun hoparlörlere yönlendirmekten HAL uygulaması ve harici karıştırıcı sorumludur.
Android sesleri
Uygulamalarda, bir veya daha fazla mantıksal ses verisi akışı yayınlamak için standart Android API'leri (ör. odaklanma kontrolü için AudioManager veya akış için MediaPlayer) aracılığıyla etkileşime geçen bir veya daha fazla oynatıcı olabilir. Bu veriler tek kanallı mono veya 7.1 surround olabilir ancak tek bir kaynak olarak yönlendirilir ve işlenir. Uygulama akışı, sisteme sesin nasıl ifade edilmesi gerektiğiyle ilgili ipuçları veren AudioAttributes ile ilişkilendirilir.
Mantıksal akışlar AudioService üzerinden gönderilir ve mevcut fiziksel çıkış akışlarından birine (ve yalnızca birine) yönlendirilir. Bu akışların her biri AudioFlinger'daki bir karıştırıcının çıkışıdır. Ses özellikleri fiziksel bir akışa karıştırıldıktan sonra artık kullanılamaz.
Ardından her fiziksel akış, donanımda oluşturma işlemi için Audio HAL'e iletilir. Otomotiv uygulamalarında oluşturma donanımı yerel codec'ler (mobil cihazlara benzer) veya aracın fiziksel ağındaki uzak bir işlemci olabilir. Her iki durumda da gerçek örnek verileri yayınlamak ve sesli hale getirmek Audio HAL uygulamasının işidir.
Harici akışlar
Android üzerinden yönlendirilmemesi gereken ses akışları (sertifika veya zamanlama nedeniyle) doğrudan harici miksere gönderilebilir. Android 11'den itibaren HAL, Android'i bilgilendirmek için bu harici sesler için odaklanmayı isteyebilir. Böylece Android, medyayı duraklatma veya diğer seslerin odaklanmasını engelleme gibi uygun işlemleri yapabilir.
Harici akışlar, Android'in oluşturduğu ses ortamıyla etkileşime geçmesi gereken medya kaynaklarıysa (ör. harici bir tuner açıldığında MP3 oynatmayı durdurma) bu harici akışlar bir Android uygulaması tarafından temsil edilmelidir. Bu tür bir uygulama, HAL yerine medya kaynağı adına ses odağını ister ve Android odak politikasına uymak için gerektiğinde harici kaynağı başlatarak/durdurarak odak bildirimlerine yanıt verir. Uygulama, oynatma/duraklatma gibi medya önemli etkinliklerini işlemekten de sorumludur. Bu tür harici cihazları kontrol etmek için önerilen mekanizmalardan biri HwAudioSource'dır.
Çıkış cihazları
Ses HAL düzeyinde AUDIO_DEVICE_OUT_BUS
cihaz türü, araç ses sistemlerinde kullanılmak üzere genel bir çıkış cihazı sağlar. Otobüs cihazı, adreslenebilir bağlantı noktalarını (her bağlantı noktasının fiziksel bir akış için uç nokta 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 otobüs bağlantı noktası kullanabilir. Bu durumda Android her şeyi birlikte karıştırır ve tek bir akış olarak sunar.
Alternatif olarak HAL, herhangi bir ses türünün eşzamanlı olarak iletilmesine izin vermek için her CarAudioContext
için bir otobüs bağlantı noktası sağlayabilir. Bu sayede HAL uygulaması, farklı sesleri istediğiniz gibi karıştırabilir ve azaltabilir.
Ses bağlamlarının çıkış cihazlarına atanması car_audio_configuration.xml
üzerinden yapılır.
Mikrofon girişi
Ses HAL'i, ses kaydederken mikrofon girişinin nasıl işleneceğ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ı iptali efekti (varsa) olan ancak başka bir işleme uygulanmamış bir stereo mikrofon akışı bekler.
Işın şekillendirmenin Asistan tarafından yapılması beklenir.
Çok kanallı mikrofon girişi
İkiden fazla kanala (stereo) sahip bir cihazdan ses yakalamak için konumsal dizin maskesi yerine kanal dizini maskesi (ör. CHANNEL_IN_LEFT
) 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 (en fazla iki kanal).
Eşzamanlı yakalama
Android 10'dan itibaren Android çerçevesi, girişlerin eşzamanlı olarak yakalanmasını destekler ancak kullanıcının gizliliğini korumak için kısıtlamalar uygulanır. Bu kısıtlamalar kapsamında, AUDIO_SOURCE_FM_TUNER
gibi sanal kaynaklar yoksayılır ve bu nedenle normal bir girişle (ör. mikrofon) aynı anda yakalanmasına izin verilir.
HwAudioSources
, eşzamanlı yakalama kısıtlamalarının bir parçası olarak da kabul edilmez.
AUDIO_DEVICE_IN_BUS
cihazlarla veya ikincil AUDIO_DEVICE_IN_FM_TUNER
cihazlarla çalışmak üzere tasarlanmış uygulamalar, bu cihazları açıkça tanımlamalı ve Android'in varsayılan kaynak seçim mantığını atlamak için AudioRecord.setPreferredDevice()
kullanmalıdır.
Ses kullanımları
AAOS, yönlendirme, ses ayarları ve odak yönetimi için öncelikle
AudioAttributes.AttributeUsages
'ü kullanır. Kullanımlar, yayının "neden" oynatıldığının bir temsilidir. Bu nedenle, tüm akışlar ve ses odak isteklerinde ses oynatma için bir kullanım belirtilmelidir. Bir AudioAttributes nesnesi oluşturulurken özel olarak ayarlanmadığında kullanım varsayılan olarak USAGE_UNKNOWN
olur. Bu değer ş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ı kullanıma sunulmuştur. Bu kullanımlar, daha önce oluşturulan kullanımlara benzer şekilde çalışır. Bununla birlikte, android.permission.MODIFY_AUDIO_ROUTING
'ün yanı sıra sistem API'lerinin de kullanılmasını gerektirir. Yeni sistem kullanımları şunlardır:
USAGE_EMERGENCY
USAGE_SAFETY
USAGE_VEHICLE_STATUS
USAGE_ANNOUNCEMENT
Sistem kullanımı içeren 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
değerinin atılmasına neden olur. Ayrıca, bir derleyicide hem sistem kullanımı hem de kullanım ayarlandıysa derleme sırasında bir IllegalArgumentException
hatası oluşur.
Bir AudioAttributes
örneğiyle ilişkili kullanım bilgisini kontrol etmek için AudioAttributes#getSystemUsage
işlevini çağırın.
Bu, ilişkilendirilmiş kullanım veya sistem kullanımını döndürür.
Ses bağlamları
AAOS sesinin yapılandırmasını basitleştirmek için benzer kullanımlar CarAudioContext
altında gruplandırılmıştır. Bu ses bağlamları, yönlendirme, ses seviyesi grupları ve ses odak yönetimi tanımlamak için CarAudioService
'te kullanılır.
Android 11'deki ses bağlamları şunlardır:
CarAudioContext | İlişkili AttributeUsages |
---|---|
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
Otomotiv, platformla etkileşime geçen ve ayrı medya tüketmek isteyen eşzamanlı kullanıcılarla ilgili yeni bir kullanım alanı sunar. Örneğin, sürücü kabinde müzik çalarken arka koltuktaki yolcular arka ekranda YouTube videosu izleyebilir. Çok bölgeli ses, farklı ses kaynaklarının aracın farklı bölgelerinde eşzamanlı olarak çalınmasına olanak tanıyarak bunu sağlar.
Android 10'dan itibaren çok bölgeli ses, OEM'lerin sesi ayrı bölgelere yapılandırmasına olanak tanır. Her bölge, kendi ses gruplarına, bağlamlar için yönlendirme yapılandırmasına ve odak yönetimine sahip araç içindeki bir cihaz koleksiyonudur. Bu şekilde, ana kabin bir ses bölgesi olarak, arka ekranın kulaklık jakları ise ikinci bir bölge olarak yapılandırılabilir.
Bölgeler car_audio_configuration.xml
kapsamında tanımlanır.
Ardından CarAudioService
, yapılandırmayı okur ve AudioService'in ses akışlarını ilişkili bölgelerine göre yönlendirmesine yardımcı olur. Her bölge, bağlamlara ve uygulamaların kimlik bilgilerine göre yönlendirme kurallarını yine tanımlar. Bir oynatıcı oluşturulduğunda CarAudioService
, oynatıcının hangi bölgeyle ilişkili olduğunu belirler ve ardından AudioFlinger'ın sesi hangi cihaza yönlendireceğini kullanıma göre belirler.
Odak, her ses bölgesi için bağımsız olarak da korunur. Bu sayede, farklı bölgelerdeki uygulamalar birbirlerini etkilemeden bağımsız olarak ses üretebilir ve kendi bölgelerinde odaktaki değişikliklere uymaya devam edebilir. CarAudioService
içindeki CarZonesAudioFocus
, her bölgenin odağını yönetmekten sorumludur.
Şekil 2. Çok bölgeli sesi yapılandırma
Ses HAL'si
Otomotiv ses uygulamaları, aşağıdakileri içeren standart Android Audio HAL'i kullanır:
IDevice.hal
. Giriş ve çıkış akışları oluşturur, ana ses seviyesini ve sessize alma özelliğini yönetir ve şunları kullanır:createAudioPatch
. Cihazlar arasında harici-harici yamalar oluşturmak için.IDevice.setAudioPortConfig()
değerini kullanarak her fiziksel akış için ses seviyesi sağlayabilirsiniz.
IStream.hal
. Giriş ve çıkış varyantlarının yanı sıra, donanıma ve donanımdan ses örneklerinin aktarılmasını yönetir.
Otomotiv cihaz türleri
Aşağıdaki cihaz türleri otomotiv platformlarıyla ilgilidir.
Cihaz türü | Açıklama |
---|---|
AUDIO_DEVICE_OUT_BUS |
Android'den gelen birincil çıkış (Android'deki tüm sesler araca bu şekilde aktarılır). Her bağlam için akışların anlamını açıklığa kavuşturma adresi olarak kullanılır. |
AUDIO_DEVICE_OUT_TELEPHONY_TX |
Aktarım için hücresel radyoya yönlendirilen ses için kullanılır. |
AUDIO_DEVICE_IN_BUS |
Başka şekilde sınıflandırılmayan girişler 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 TV cihazı için kullanılır. |
AUDIO_DEVICE_IN_LINE |
AUX giriş jakı için kullanılır. |
AUDIO_DEVICE_IN_BLUETOOTH_A2DP |
Bluetooth üzerinden alınan müzikler. |
AUDIO_DEVICE_IN_TELEPHONY_RX |
Telefon aramasıyla 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
içinde tanımlanmalıdır:
- modül adını girin. "primary" (otomotiv kullanım alanları için kullanılır), "A2DP", "remote_submix" ve "USB" desteklenir. Modül adı ve ilgili ses sürücüsü
audio.primary.$(variant).so
olarak derlenmelidir. - devicePorts. Bu modülden erişilebilen tüm giriş ve çıkış cihazlarının (kalıcı olarak bağlı cihazlar ve çıkarılabilir cihazlar dahil) cihaz tanımlayıcılarının listesini içerir.
- Her çıkış cihazı için milibelde (1 milibel = 1/100 dB = 1/1000 bel) minimum/maksimum/varsayılan/adım değerleri içeren kazanç kontrolü tanımlayabilirsiniz.
AUDIO_DEVICE_OUT_BUS
ile aynı cihaz türüne sahip birden fazla cihaz olsa bile cihazı bulmak için devicePort örneğindeki adres özelliği kullanılabilir.- mixPorts. Ses HAL'i tarafından sunulan tüm çıkış ve giriş akışlarının listesini içerir. Her mixPort örneği, Android AudioService için fiziksel bir akış olarak düşünülebilir.
- rotalar. Giriş ve çıkış cihazları ya da akış ile cihaz arasındaki olası bağlantıların listesini tanımlar.
Aşağıdaki örnekte, tüm Android ses akışlarının mixer_bus0_phone_out tarafından karıştırıldığı bir çıkış cihazı bus0_phone_out tanımlanmaktadır. Rota, mixer_bus0_phone_out
cihazının çıkış akışını bus0_phone_out
cihazına yönlendirir.
<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>