AAOS'de bir giriş cihazı bağlayın

Android'de ses çalmak için aşağıdaki mekanizmaları kullanabilirsiniz:

Her mekanizma, Android'de ses oynatılmasına olanak tanır. Radyo oynatma veya giriş cihazlarından oynatma için bu seçenekler yeterli olmayabilir. Bununla birlikte, her biri ses yakalama veya MediaRecorder sınıfıyla birlikte kullanılabilir. Böylece önce ses yakalanır, ardından Android'de oynatılır. Özellikle sistem uygulamaları için aşağıdaki bilgiler, AAOS'ta bir giriş cihazını çıkış karıştırıcısına bağlamak amacıyla kullanılabilir.

HwAudioSource oynatıcı

HwAudioSource, ses kaynağı cihazını doğrudan bir Android miksere bağlar.

Motivasyonlar

Android ile cihazlar arası veya donanım ses yaması kullanılırken çeşitli sınırlamalar ortaya çıkabilir. Her seçenek OYNAT, DURAKLAT ve DURDUR gibi medya anahtarı etkinliklerini alamaz ve Android'in ses yığınını atladıkları için her biri, yamayı Android'deki diğer seslerle karıştırmak için donanım gerektirir.

HwAudioSource'ı kullanma

HwAudioSource, yazılım yaması olarak tasarlanmış yeni bir oynatıcı türüdür. Bu, bu oynatıcıyı kullanan uygulamaların medya anahtar etkinliklerini almasını ve çıkış akışının Android tarafından karıştırılıp yönlendirilmesini sağlar.

mHwAudioSource = new HwAudioSource.Builder()
                .setAudioDeviceInfo(AudioDeviceInfo: info)
                .setAudioAttributes(new AudioAttributes.Builder()
                        .setUsage(AudioAttributes.USAGE_MEDIA)
                        .build())
                .build();
mHwAudioSource.play();
mHwAudioSource.stop();

Ses HAL'inde yapılan değişiklikler

Bu yeni oynatıcıda, ses HAL'i için aşağıdaki beklentileri göz önünde bulundurun. Örneğin, device/generic/car/emulator/audio/driver/audio_hw.c.

  • adev_create_audio_patch, bir cihazdan karıştırıcıya ses bağlantısı oluşturma isteğini bekler.

  • adev_open_input_stream, audio_source değerinin AUDIO_SOURCE_FM_TUNER olmasını bekler.

  • in_read, ses arabelleğini radyo yayını ses verileriyle doldurur.

audio_policy_configuration.xml'te AUDIO_DEVICE_IN_FM_TUNER türüne sahip bir tuner cihazı yapılandırmanızı öneririz:

<devicePort
    tagName="Tuner_source"
    type="AUDIO_DEVICE_IN_FM_TUNER"
    role="source"
    address="tuner0">
    <profile
        name=""
        format="AUDIO_FORMAT_PCM_16_BIT"
        samplingRates="48000"
        channelMasks="AUDIO_CHANNEL_IN_STEREO"/>
</devicePort>

Bu cihaz yapılandırmasıyla, AudioDeviceInfo.TYPE_FM_TUNER ile birlikte AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS'ü kullanarak FM radyo giriş cihazını bulmayı kolaylaştırabilirsiniz.

Ses yamaları oluşturma

İki ses bağlantı noktası (miks bağlantı noktası veya cihaz bağlantı noktası) arasında ses bağlantısı oluşturabilirsiniz. Karışım bağlantı noktasından cihaz bağlantı noktasına giden ses yaması genellikle oynatma içindir. Ters yön ise kayıt içindir.

Örneğin, FM_TUNER kaynağından gelen ses örneklerini doğrudan medya havuzuna yönlendiren bir ses yaması, yazılım karıştırıcıyı atlar. Ardından, Android'deki ses örneklerini ve FM_TUNER'ü karıştırmak için bir donanım karıştırıcı kullanmanız gerekir. Doğrudan FM_TUNER kaynağından medya havuzuna ses yaması oluştururken:

  • Ses seviyesi kontrolü, medya alıcısı için geçerlidir ve hem Android hem de FM_TUNER seslerini etkiler.

  • Kullanıcılar basit bir uygulama anahtarı aracılığıyla Android ve FM_TUNER ses arasında geçiş yapabilir (belirli bir medya kaynağı seçimi gerekmez).

Otomotiv uygulamalarında, iki cihaz bağlantı noktası arasında ses yaması oluşturmak da gerekebilir. Bunu yapmak için önce audio_policy_configuration.xml içinde cihaz bağlantı noktalarını ve olası rotaları tanımlamanız, ardından mixport'ları cihaz bağlantı noktalarıyla ilişkilendirmeniz gerekir.

Örnek yapılandırma

Bu örnek yapılandırmaya bakın, device/generic/car/emulator/audio/audio_policy_configuration.xml.

<audioPolicyConfiguration>
    <modules>
        <module name="primary" halVersion="3.0">
            <attachedDevices>
                <item>bus0_media_out</item>
                <item>bus1_audio_patch_test_in</item>
            </attachedDevices>
            <mixPorts>
                <mixPort name="mixport_bus0_media_out" role="source"
                        flags="AUDIO_OUTPUT_FLAG_PRIMARY">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000"
                            channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
                </mixPort>
                <mixPort name="mixport_audio_patch_in" role="sink">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                           samplingRates="48000"
                           channelMasks="AUDIO_CHANNEL_IN_STEREO"/>
                </mixPort>
            </mixPorts>
            <devicePorts>
                <devicePort tagName="bus0_media_out" role="sink" type="AUDIO_DEVICE_OUT_BUS"
                        address="bus0_media_out">
                    <profile balance="" 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>
                <devicePort tagName="bus1_audio_patch_test_in" type="AUDIO_DEVICE_IN_BUS" role="source"
                        address="bus1_audio_patch_test_in">
                    <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                            samplingRates="48000" channelMasks="AUDIO_CHANNEL_IN_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_media_out" sources="mixport_bus0_media_out,bus1_audio_patch_test_in"/>
                <route type="mix" sink="mixport_audio_patch_in" sources="bus1_audio_patch_test_in"/>
            </routes>
        </module>
    </modules>
</audioPolicyConfiguration>

Ses sürücü API'si

Mevcut kaynakların (adresle tanımlanır) listesini almak için getExternalSources()'ü kullanabilir, ardından bu kaynaklar ile alıçı bağlantı noktaları arasında ses kullanımlarına göre ses yamaları oluşturabilirsiniz. Ses HAL'indeki ilgili giriş noktaları IDevice.hal'te görünür:

Interface IDevice {
...
/
*   Creates an audio patch between several source and sink ports.  The handle
*   is allocated by the HAL and must be unique for this audio HAL module.
*
*   @param sources patch sources.
*   @param sinks patch sinks.
*   @return retval operation completion status.
*   @return patch created patch handle.
*/
createAudioPatch(vec<AudioPortConfig> sources, vec<AudioPortConfig> sinks)
       generates (Result retval, AudioPatchHandle patch);

*   Release an audio patch.
*
*   @param patch patch handle.
*   @return retval operation completion status.
*/
releaseAudioPatch(AudioPatchHandle patch) generates (Result retval);
...
}

Radyo alıcısı

Radyo uygulaması oluştururken hem yamayı oluşturmayı hem de medya anahtarı etkinliklerini işlemek için medya oturumunu işlediği için HwAudioSource kullanmanızı öneririz. Aynı kaynak ve ses özellikleri için birden fazla ses kaynağı oluşturulabilir. Normal radyo kullanımı için bir kanal, trafik duyuruları için de ikinci bir kanal oluşturabilirsiniz.

FM_TUNER kaydı yapılıyorsa Android 11'de bu işlem için izin android.permission.CAPTURE_AUDIO_OUTPUT olarak değiştirildi. Artık yalnızca mikrofonlar için geçerli olan OP_RECORD_AUDIO izin kontrolü uygulanmıyor. FM_TUNER zaten erişim için SYSTEM_API izni gerektirdiğinden bu durum uygulamaları etkilemez.

Radyo uygulaması oluşturma hakkında ayrıntılı bilgi için Radyo uygulamasını uygulama başlıklı makaleyi inceleyin.