Otomotiv Sesi

Android Automotive OS (AAOS), temel Android ses yığınını temel alarak , bir araçta bilgi-eğlence sistemi olarak çalışmaya ilişkin kullanım alanlarını desteklemelidir. AAOS, bilgi-eğlence seslerinden (yani medya, navigasyon ve uyarı alır ancak bunlarla ilgili herhangi bir şey yapan zillerden ve katı kullanılabilirlik ve zamanlama gereksinimleri vardır. AAOS hem sinyal hem de sesi yönetmesine yardımcı olacak mekanizmalar bulmaktır. Sonuçta bu, aracın sürücü için hangi seslerin çalınması gerektiği ve güvenlikle ilgili önemli seslerin ve mevzuat seslerinin düzgün şekilde çalışmasını; hiçbir kesinti olmaksızın duyuldu.

Android, aracın medya deneyimini yönettiğinden Örneğin, radyo alıcısı, sesi işleyebilen uygulamalarla temsil edilmelidir. odak ve medya önemli etkinliklerini gösterir.

Android 11'de otomotivle ilgili seste yapılan aşağıdaki değişiklikler destek:

Android sesleri ve akışları

Otomotiv ses sistemleri aşağıdaki sesleri ve akışları işler:

Akış merkezli mimari diyagramı

Şekil 1. Akış merkezli mimari diyagramı

Android, Android uygulamalarından gelen sesleri yöneterek bu uygulamaları kontrol eder ve seslerini HAL'deki çıkış cihazlarına yönlendirerek ses:

  • Temel sesteki kaynaklar olarak bilinen mantıksal akışlar Ses Özellikleri ile etiketlenir.
  • Fiziksel yayınlar: Temel sesteki cihazlar olarak bilinir. bağlam bilgisi sunmaz.

Güvenilirlik için harici sesler (bağımsız emniyet kemeri uyarı zilleri gibi kaynaklar) Android dışında, HAL veya ayrı donanımlarda bile kullanılabilir. Sistem uygulayıcıları, aşağıdaki özelliklere sahip bir mikser sağlamalıdır: Android'den bir veya daha fazla ses girişi akışı kabul eder ve ardından bunları birleştirir harici ses kaynaklarından uygun şekilde yararlanabilirsiniz. kullanabilirsiniz.

HAL uygulaması ve harici karıştırıcı, güvenlik açısından kritik harici sesler duyuluyor ve Android tarafından sağlanan uygun konuşmacılara yönlendirmenize yardımcı olur.

Android sesleri

Uygulamalarda, standart Android üzerinden etkileşimde bulunan bir veya daha fazla oynatıcı olabilir API'ler (ör. AudioManager) odak denetimi veya MediaPlayer için akış için) kullanarak bir veya daha fazla mantıksal ses verisi akışı yayınlar. Bu veriler tek kanallı mono veya 7.1 surround olabilir ancak tek bir kaynak olarak kullanın. Uygulama akışı, AudioAttributes ile ilişkilidir sesin nasıl ifade edilmesi gerektiğiyle ilgili sistem ipuçları veren bir e-posta alırsınız.

Mantıksal akışlar AudioService üzerinden gönderilir ve bir akışa yönlendirilir (ve yalnızca biri) mevcut fiziksel çıkış akışlarının her biri (her biri çıktı) bir mikserin birleşimidir. Ses özellikleri karıştırıldıktan sonra atlanırsa artık kullanılamazlar.

Daha sonra her fiziksel yayın, oluşturma için Ses HAL'ye iletilir. donanım da dahil değil. Otomotiv uygulamalarında, oluşturma donanımı yerel codec'ler olabilir (mobil cihazlara benzer) ya da aracın fiziksel fiziksel ağ. Her iki durumda da, içeriği iletmek için Ses HAL uygulamasının işi ve sesli hâle gelmesine neden olabilir.

Harici akışlar

Android üzerinden yönlendirilmemesi gereken ses akışları (sertifikasyon veya zamanlama nedenleri) doğrudan harici miksere gönderilebilir. Android 11 itibarıyla HAL artık Android'e bilgi vermek için bu harici seslere odaklanmayı isteyebiliyor uygun işlemleri (ör. medyayı veya içeriği engelleme) odaklanmayı zorlaştırır.

Harici akışlar, sesle etkileşimde bulunması gereken medya kaynaklarıysa (örneğin, bir kod çalıştırıldığında MP3 çalmayı harici kanal varsa), bu harici akışlar bir Android uygulaması. Bu tür bir uygulama, medya kaynağı adına ses odağı ister seçiyor ve odak bildirimleriyle ilgili e-postalara Android odağına uymak için harici kaynağı gerektiği şekilde başlatma/durdurma politikası. Uygulama ayrıca aşağıdakiler gibi medya önemli etkinlikleri yönetmekten de sorumludur: Oynat/duraklat. Bu tür harici cihazları kontrol etmek için önerilen mekanizmalardan biri HwAudioSource'tur.

Çıkış cihazları

Ses HAL düzeyinde, cihaz türü AUDIO_DEVICE_OUT_BUS Araç ses sistemlerinde kullanılmak üzere genel bir çıkış cihazı sağlar. Otobüs adreslenebilir bağlantı noktalarını destekler (her bağlantı noktası bir cihazın fiziksel akış) ve şurada desteklenen tek çıkış cihazı türünün olması beklenmektedir: araç.

Bir sistem uygulaması, Android her şeyi bir araya getirerek tek bir akış olarak sunar. Alternatif olarak, HAL, izin vermek üzere her CarAudioContext için bir otobüs bağlantı noktası sağlayabilir. her ses türünde eşzamanlı yayın Bu, HAL'nin seslerin istenen şekilde karıştırılıp azaltılması için uygulanması gerekir.

Ses bağlamları, çıkış cihazlarına atanır. car_audio_configuration.xml

Mikrofon girişi

Ses kaydederken Ses HAL'si bir openInputStream alır çağrısının nasıl yapılacağını gösteren AudioSource argümanı mikrofon girişinin işlenmesi gereklidir.

VOICE_RECOGNITION kaynağı özellikle Google Asistan, ses ve görüntü kalitesine sahip olan stereo mikrofon akışı bekler yankı giderme efektidir (varsa) ancak başka bir işleme uygulanmaz. Işınlamanın Asistan tarafından yapılması beklenir.

Çok kanallı mikrofon girişi

İkiden fazla kanalı (stereo) olan bir cihazdan ses yakalamak için bir kanal dizini maskesi (örneğin, CHANNEL_IN_LEFT) bilgileri gösterilir. Ö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 olduğunda ayarlanırsa AudioRecord, yalnızca setChannelMask (en fazla iki kanal).

Eş zamanlı yakalama

Android 10 sürümünden itibaren Android çerçevesi, eşzamanlı yakalama özelliğini desteklemektedir. kullanıcı gizliliğini korumak için kısıtlamalarla uygulanabilir. Parçası Bu kısıtlamalar, AUDIO_SOURCE_FM_TUNER yoksayılır ve bu nedenle normal bir girişle (mikrofon gibi) eş zamanlı olarak yakalanır. HwAudioSources, eş zamanlının bir parçası olarak da kabul edilmez. yakalama kısıtlamalarını kullanabilirsiniz.

AUDIO_DEVICE_IN_BUS veya şu cihazlarla çalışacak şekilde tasarlanmış uygulamalar: ikincil AUDIO_DEVICE_IN_FM_TUNER cihazlarda açık bir şekilde bu cihazları tanımlayıp AudioRecord.setPreferredDevice() kullanmak .

Ses kullanımları

AAOS esas olarak AudioAttributes.AttributeUsages kullanıyor ses ayarları ve odak yönetimi gibi özellikler sunar. Kullanımlar "neden” sorusunun cevabını akış oynatılıyor. Dolayısıyla tüm akışlar ve ses odağı isteklerinde ses çalınmaları için bir kullanım biçimi belirtilmelidir. Zaman AudioAttributes nesnesi oluştururken özellikle ayarlanmadıysa kullanım varsayılan olarak USAGE_UNKNOWN değerine ayarlandı. Şu an için aynı şekilde ele alınsa da USAGE_MEDIA gibi medyalar için bu davranışa güvenilmemelidir oynatmaya devam edebilirsiniz.

Sistem kullanımları

Android 11'de sistem kullanımları kullanıma sunuldu. Bu kullanımlar, sistem API'leri gerektirmesi dışında, önceden yapılan kullanımlara benzer şekilde ve android.permission.MODIFY_AUDIO_ROUTING gibi kullanılacak. Yeni sistem kullanımları şunlardır:

  • USAGE_EMERGENCY
  • USAGE_SAFETY
  • USAGE_VEHICLE_STATUS
  • USAGE_ANNOUNCEMENT

Sistem kullanımıyla bir AudioAttributes oluşturmak için şunu kullanın: AudioAttributes.Builder#setSystemUsage (setUsage yerine) Sistem dışı kullanımla bu yöntemi çağırma bir IllegalArgumentException atılır. Ayrıca, bir derleyicide hem sistem kullanımı hem de kullanımı ayarlanmışsa Derleme sırasında IllegalArgumentException.

AudioAttributes ile hangi kullanımın ilişkili olduğunu kontrol etmek için AudioAttributes#getSystemUsage yöntemini çağırın. Bu, ilişkilendirilmiş kullanımı veya sistem kullanımını döndürür.

Ses bağlamları

AAOS seslerin yapılandırmasını kolaylaştırmak için benzer kullanımlar gruplandırıldı CarAudioContext hedefine. Bu ses bağlamları proje boyunca Yönlendirme, ses düzeyi grupları ve ses odağını tanımlamak için CarAudioService üzerine konuşalım.

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

CarAudioContext İlişkilendirilmiş Ö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 satır öğeleri içindir .

Çok bölgeli ses

Otomotiv, aynı anda kullananlara yönelik yeni bir dizi kullanım alanı sunar platformla etkileşimde bulunan ve ayrı medya tüketen Örneğin, örnek, bir sürücü arka koltukta oturan yolcular kabinde müzik çalabilir arka ekranda YouTube videosu izliyor. Çok bölgeli ses şu işlevi sağlar: Farklı ses kaynaklarının farklı alanlarda eşzamanlı olarak çalınmasına olanak tanıyarak görebilirsiniz.

Android 10'dan itibaren çok bölgeli ses, OEM'lerin sesi yapılandırmasına olanak tanır alt bölümlere ayrılabilir. Her bölge, araç içindeki cihazlardan oluşan bir koleksiyondur kendi birim grupları, bağlamlar için yönlendirme yapılandırması ve odak noktası üzerine konuşalım. Bu şekilde, ana kabin tek bir ses sistemi arka ekranın kulaklık jakı ikinci bölge olarak yapılandırılmalıdır.

Alt bölgeler, car_audio_configuration.xml kapsamında tanımlanır. CarAudioService, daha sonra yapılandırmayı okur ve AudioService'e yardımcı olur Ses akışlarını ilişkili bölgelerine göre yönlendirir. Her alt bölge hâlâ bağlamlara ve uygulama kimliğine dayalı yönlendirme kurallarını. Oyuncunun CarAudioService, oynatıcının hangi alt bölgede yer aldığını belirler ve ardından, AudioFlinger uygulamasının hangi cihazla ilişkili olduğunu ve hangi yönlendirmesi gerekir.

Odak, her ses bölgesi için bağımsız olarak da korunur. Bu durumda, ses üretmek için farklı bölgelerdeki uygulamalarla ve uygulamaların birbirlerine olan değişikliklere uymaya devam etmesini odaklanabildikleri anlamına gelir. CarZonesAudioFocus içinde CarAudioService her biri için odağı yönetmekten sorumludur bölge.

Çok bölgeli sesi yapılandırma

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

Ses HAL'si

Automotive ses uygulamaları, standart Android Audio HAL'yi kullanır. ve şunları içerir:

  • IDevice.hal Giriş ve çıkış akışları oluşturur. ana ses düzeyini ve sessize almayı yönetir ve şunları kullanır:
    • createAudioPatch Cihazlar arasında harici-harici yamalar oluşturmak için.
    • Her fiziksel yayının ses düzeyini sağlamak için IDevice.setAudioPortConfig().
  • IStream.hal Giriş ve çıkış varyantlarıyla birlikte donanımla ses örneklerinin akışını yönetir.

Otomotiv cihaz türleri

Aşağıdaki cihaz türleri, otomotiv platformları için geçerlidir.

Cihaz türü Açıklama
AUDIO_DEVICE_OUT_BUS Android'den birincil çıkış (Android'den gelen tüm sesler bu şekilde teslim edilir). Akışları belirginleştirmek için adres olarak kullanılır her bağlam için.
AUDIO_DEVICE_OUT_TELEPHONY_TX İletim için hücresel radyoya yönlendirilen seslerde kullanılır.
AUDIO_DEVICE_IN_BUS Başka şekilde sınıflandırılmamış 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üzik.
AUDIO_DEVICE_IN_TELEPHONY_RX Telefonla ilişkilendirilmiş hücresel radyodan alınan sesler için kullanılır çağrısına bir tıklama URL'si eklemeniz gerekir.

Ses cihazlarını yapılandırma

Android'in görebildiği ses sistemleri şurada tanımlanmalıdır: /audio_policy_configuration.xml, aşağıdaki bileşenleri içerir:

  • modülünü kullanabilirsiniz. "Birincil"i destekler (otomotiv kullanım alanları için kullanılır), "A2DP", "remote_submix" ve "USB". Modül adı ve ilgili ses sürücüsünün audio.primary.$(variant).so olarak derlenmesi gerekir.
  • devicePorts'a ekleyin. Tüm giriş ve çıkışlar için cihaz tanımlayıcıları listesini içerir cihazlar (kalıcı olarak eklenmiş ve çıkarılabilir cihazlar dahil) bu modülden erişebilirsiniz.
    • Her çıkış cihazı için şunları içeren kazanç kontrolü tanımlayabilirsiniz: Milibel cinsinden min/max/default/step değerleri (1 milibel = 1/100 dB = 1/1000 bel).
    • Bir devicePort örneğindeki adres özelliği, aynı cihaz türüne sahip birden çok cihaz olsa bile, AUDIO_DEVICE_OUT_BUS
  • mixPorts'u seçin. tarafından gösterilen tüm çıkış ve giriş akışlarının listesini içerir: ses HAL'si. Her mixPort örneği, gerçek bir akış olarak değerlendirilerek Android AudioService.
  • gösterir. Giriş ve çıkış arasındaki olası bağlantıların listesini tanımlar akış ve cihaz arasında geçiş yapabilirsiniz.

Aşağıdaki örnekte, tüm cihazların içindeki bus0_phone_out adlı çıkış Android ses akışları mixer_bus0_phone_out ile karıştırılır. Rota, cihaza mixer_bus0_phone_out çıkış akışı 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>