Otomotiv Sesi

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:

Android sesleri ve akışları

Otomotiv ses sistemleri aşağıdaki sesleri ve akışları yönetir:

Akış merkezli mimari diyagramı

Ş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.

Çok bölgeli sesi yapılandırma

Ş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>