Otomotiv Sesi

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:

Android sesleri ve akışları

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

Akış odaklı mimari şeması

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

Çok bölgeli sesi yapılandırma

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