Otomotiv Ses

Android Automotive OS (AAOS), bir araçta bilgi-eğlence sistemi olarak kullanım durumlarını desteklemek için temel Android ses yığını üzerine kuruludur. AAOS, bilgi-eğlence seslerinden (yani medya, navigasyon ve iletişim) sorumludur, ancak kesin kullanılabilirlik ve zamanlama gereksinimleri olan çanlar ve uyarılardan doğrudan sorumlu değildir. AAOS, aracın sesi yönetmesine yardımcı olmak için sinyaller ve mekanizmalar sağlarken, sonuçta sürücü ve yolcular için hangi seslerin çalınması gerektiği konusunda karar vermek araca düşer ve güvenlik açısından kritik seslerin ve düzenleyici seslerin herhangi bir sorun olmadan doğru şekilde duyulmasını sağlar. kesinti.

Android, aracın medya deneyimini yönettiğinden, radyo alıcısı gibi harici medya kaynakları, kaynak için ses odağını ve medya önemli olaylarını işleyebilen uygulamalar tarafından temsil edilmelidir.

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 HAL'deki çıkış cihazlarına seslerini yönlendirir:

  • Temel ses terminolojisinde kaynaklar olarak bilinen mantıksal akışlar , Ses Nitelikleri ile etiketlenir.
  • Çekirdek ses terminolojisinde aygıtlar olarak bilinen fiziksel akışlar , miksajdan sonra bağlam bilgisine sahip değildir.

Güvenilirlik için, harici sesler (emniyet kemeri uyarı sesleri gibi bağımsız kaynaklardan gelen) Android dışında, HAL'nin altında veya hatta ayrı bir donanımda yönetilir. Sistem uygulayıcıları, Android'den bir veya daha fazla ses girişi akışını kabul eden ve ardından bu akışları aracın ihtiyaç duyduğu 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 dış seslerin duyulmasını sağlamaktan ve Android tarafından sağlanan akışlarda miksaj yapmaktan ve bunları uygun hoparlörlere yönlendirmekten sorumludur.

Android sesleri

Uygulamalar, bir veya daha fazla mantıksal ses verisi akışı yaymak için 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ği konusunda sisteme ipuçları veren AudioAttributes ile ilişkilendirilir.

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 öznitelikleri fiziksel bir akışa karıştırıldıktan sonra artık kullanılamazlar.

Her bir fiziksel akış daha sonra donanım üzerinde işlenmek üzere Audio HAL'a 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 teslim etmek ve duyulabilir hale gelmesini sağlamak Audio HAL uygulamasının işidir.

Harici akışlar

Android üzerinden yönlendirilmemesi gereken ses akışları (sertifikasyon veya zamanlama nedenleriyle) doğrudan harici miksere gönderilebilir. Android 11'den itibaren HAL, medyayı duraklatmak veya başkalarının odaklanmasını engellemek gibi uygun eylemleri gerçekleştirebilmesi için Android'i bilgilendirmek için bu harici seslere odaklanma talebinde bulunabilir.

Harici akışlar, Android'in oluşturduğu ses ortamıyla etkileşime girmesi gereken medya kaynaklarıysa (örneğin, harici bir tuner açıldığında MP3 oynatmayı durdurun), bu harici akışlar bir Android uygulaması tarafından temsil edilmelidir. Böyle bir uygulama, HAL yerine medya kaynağı adına ses odağını talep eder ve Android odak ilkesine uyması için gerektiğinde harici kaynağı başlatarak/durdurarak odak bildirimlerine yanıt verir. Uygulama ayrıca oynat/duraklat gibi medyayla ilgili önemli olayları işlemekten de sorumludur. Bu tür harici cihazları kontrol etmek için önerilen bir mekanizma HwAudioSource'dur .

Çıktı cihazları

Audio HAL düzeyinde, AUDIO_DEVICE_OUT_BUS aygıt türü, araç ses sistemlerinde kullanım için genel bir çıkış aygıtı sağlar. Veri yolu aygıtı adreslenebilir bağlantı noktalarını destekler (burada her bağlantı noktası fiziksel bir akış için bitiş noktasıdır) ve bir araçta desteklenen tek çıkış aygıtı türü olması beklenir.

Bir sistem uygulaması, tüm Android sesleri için bir veri yolu bağlantı noktası kullanabilir; bu durumda, Android her şeyi karıştırır ve tek bir akış olarak sunar. Alternatif olarak, HAL, herhangi bir ses türünün eşzamanlı teslimine izin vermek için her CarAudioContext için bir veri yolu bağlantı noktası sağlayabilir. Bu, HAL uygulamasının farklı sesleri istendiği gibi karıştırmasını ve dağıtması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

Ses 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 etkisi olan (varsa) ancak kendisine başka 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 konum indeks maskesi yerine bir kanal indeks maskesi kullanın ( CHANNEL_IN_LEFT gibi). Ö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 , girdilerin eşzamanlı olarak yakalanmasını destekler, ancak kullanıcının gizliliğini korumak için kısıtlamalar vardır. Bu kısıtlamaların bir parçası olarak, AUDIO_SOURCE_FM_TUNER gibi sanal kaynaklar yok sayılır ve bu nedenle normal bir girişle (mikrofon gibi) eşzamanlı olarak yakalanmalarına izin verilir. HwAudioSources ayrıca eşzamanlı yakalama kısıtlamalarının bir parçası olarak kabul edilmez.

AUDIO_DEVICE_IN_BUS cihazlarıyla veya ikincil AUDIO_DEVICE_IN_FM_TUNER cihazlarıyla çalışmak üzere tasarlanan uygulamalar, Android varsayılan kaynak seçim 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 öncelikle AudioAttributes.AttributeUsages kullanır. Kullanımlar, akışın "neden" oynatıldığının bir temsilidir. Bu nedenle, tüm akışlar ve ses odak istekleri, ses kayıttan yürütmeleri için bir kullanım belirtmelidir. Bir AudioAttributes nesnesi oluştururken özel olarak ayarlanmadığında, kullanım varsayılan olarak USAGE_UNKOWN olarak ayarlanı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, sistem API'lerinin yanı sıra android.permission.MODIFY_AUDIO_ROUTING kullanılmasını gerektirmeleri dışında, daha önce oluşturulmuş kullanımlara benzer şekilde davranır. Yeni sistem kullanımları şunlardır:

  • USAGE_EMERGENCY
  • USAGE_SAFETY
  • USAGE_VEHICLE_STATUS
  • USAGE_ANNOUNCEMENT

Sistem kullanımına sahip bir AudioAttributes oluşturmak için setUsage yerine setUsage AudioAttributes.Builder#setSystemUsage kullanın. Bu yöntemi sistem dışı bir kullanımla çağırmak, IllegalArgumentException atılmasına neden olur. Ayrıca, bir oluşturucuda hem sistem kullanımı hem de kullanım ayarlanmışsa, oluştururken bir IllegalArgumentException oluşturur.

Bir AudioAttributes örneğiyle hangi kullanımın ilişkili olduğunu kontrol etmek için AudioAttributes#getSystemUsage . 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 içinde gruplandırılmıştır. Bu ses bağlamları, yönlendirmeyi, ses gruplarını ve ses odak yönetimini tanımlamak için CarAudioService genelinde kullanılır.

Android 11'deki ses bağlamları şunlardır:

ArabaSesiİçerik İ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ılar etrafında yeni bir dizi kullanım durumu geliyor. Örneğin, bir sürücü arka koltuktaki yolcular arka ekranda bir YouTube videosu izlerken kabinde müzik çalabilir. Çok bölgeli ses, farklı ses kaynaklarının aracın farklı alanlarında aynı anda çalmasına izin vererek bunu sağlar.

Android 10'da başlayan çok bölgeli ses, OEM'lerin sesi ayrı bölgelere yapılandırmasına olanak tanır. Her bölge, kendi ses grupları, bağlamlar için yönlendirme yapılandırması ve odak yönetimi ile araç içindeki bir cihazlar topluluğudur. 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 bir parçası olarak tanımlanır. CarAudioService daha sonra yapılandırmayı okur ve AudioService'in ilişkili bölgelerine göre ses akışlarını yönlendirmesine yardımcı olur. Her bölge, bağlama ve uygulama kullanıcı kimliğine dayalı olarak hala yönlendirme kurallarını tanımlar. Bir oynatıcı oluşturulduğunda, CarAudioService oynatıcının hangi bölge için ilişkili olduğunu ve ardından kullanıma bağlı olarak AudioFlinger'ın sesi hangi cihaza yönlendirmesi gerektiğini belirler.

Odak ayrıca her ses bölgesi için bağımsız olarak korunur. Bu, farklı bölgelerdeki uygulamaların, kendi bölgelerindeki odak değişikliklerine saygı duymaya devam ederken, birbirlerine müdahale etmeden bağımsız olarak ses üretmelerini sağlar. CarZonesAudioFocus içindeki CarAudioService , her bölge için odağı yönetmekten sorumludur.

Çok bölgeli sesi yapılandırın

Şekil 2. Çok bölgeli sesi yapılandırın

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 birim ve sessize alma işlemlerini gerçekleştirir ve şunları kullanır:
    • createAudioPatch . Cihazlar arasında harici-harici yamalar oluşturmak için.
    • Her fiziksel akış için hacim sağlamak üzere IDevice.setAudioPortConfig() .
  • IStream.hal . Giriş ve çıkış değişkenleriyle birlikte, donanıma ve donanımdan ses örneklerinin akışını yönetir.

Otomotiv cihaz türleri

Aşağıdaki cihaz türleri otomotiv platformlarıyla ilgilidir.

Cihaz tipi Açıklama
AUDIO_DEVICE_OUT_BUS Android'den birincil çıktı (Android'den gelen tüm ses bu şekilde araca iletilir). Her bağlam için akışların belirsizliğini gidermek 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 Bluetooth üzerinden müzik 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 içinde 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 ilgili ses sürücüsü, audio.primary.$(variant).so olarak derlenmelidir.
  • cihaz Bağlantı noktaları. Bu modülden erişilebilen tüm giriş ve çıkış aygıtları (kalıcı olarak takılan 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ü tanımlayabilirsiniz (1 milibel = 1/100 dB = 1/1000 bel).
    • Bir devicePort örneğindeki adres özniteliği, AUDIO_DEVICE_OUT_BUS ile aynı aygıt türüne sahip birden fazla aygıt olsa bile aygıtı bulmak için kullanılabilir.
  • mixPorts. Ses HAL'ı tarafından sunulan tüm çıkış ve giriş akışlarının bir listesini içerir. Her mixPort örneği, Android AudioService için fiziksel bir akış olarak kabul edilebilir.
  • rotalar. Giriş ve çıkış cihazları veya akış ve cihaz arasındaki olası bağlantıların bir 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ığı bus0_phone_out çıkış cihazını tanımlar. Rota, mixer_bus0_phone_out çıkış akışını mixer_bus0_phone_out aygıtına bus0_phone_out .

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