Podłącz urządzenie wejściowe w AAOS

Możesz użyć tych mechanizmów do odtwarzania dźwięku w Androidzie:

Każdy mechanizm pozwala na odtwarzanie dźwięku w systemie Android. W przypadku odtwarzania radia lub odtwarzania z urządzeń wejściowych te opcje mogą nie wystarczyć, chociaż każdą z nich można połączyć z przechwytywaniem dźwięku lub klasą MediaRecorder , aby najpierw przechwycić dźwięk, a następnie odtworzyć go z systemu Android. W szczególności w przypadku aplikacji systemowych poniższe informacje mogą służyć do podłączenia urządzenia wejściowego do miksera wyjściowego w AAOS.

Odtwarzacz HwAudioSource

HwAudioSource łączy urządzenie źródłowe audio bezpośrednio z mikserem Android.

Motywacje

W przypadku korzystania z poprawki audio typu „urządzenie na urządzenie” lub sprzętowej w systemie Android może pojawić się kilka ograniczeń. Każda opcja nie jest w stanie odbierać kluczowych zdarzeń multimedialnych, takich jak PLAY , PAUSE i STOP , a ponieważ omijają stos audio Androida, każda z nich wymaga sprzętu, aby zmiksować łatkę z innym dźwiękiem z Androida.

Użyj HwAudioSource

HwAudioSource to nowy typ odtwarzacza zaprojektowany jako łatka oprogramowania. Umożliwia to aplikacjom korzystającym z tego odtwarzacza odbieranie kluczowych zdarzeń multimedialnych oraz miksowanie i kierowanie strumienia wyjściowego przez system Android.

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

Zmiany w audio HAL

W przypadku tego nowego odtwarzacza należy wziąć pod uwagę te oczekiwania dotyczące audio HAL. Na przykład device/generic/car/emulator/audio/driver/audio_hw.c .

  • adev_create_audio_patch oczekuje, że żądanie ustanowienia poprawki audio z urządzenia do miksera.

  • adev_open_input_stream oczekuje, że audio_source będzie AUDIO_SOURCE_FM_TUNER .

  • in_read wypełnia bufor audio danymi audio nadawanymi przez radio.

Zalecamy skonfigurowanie tunera z typem AUDIO_DEVICE_IN_FM_TUNER w audio_policy_configuration.xml :

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

Dzięki tej konfiguracji urządzenia można ułatwić znalezienie urządzenia wejściowego radia FM za pomocą AudioManager.getDevices(AudioManager.GET_DEVICES_INPUTS w połączeniu z AudioDeviceInfo.TYPE_FM_TUNER .

Twórz poprawki audio

Można utworzyć patch audio pomiędzy dwoma portami audio, portem miksującym lub portem urządzenia. Zazwyczaj ścieżka dźwiękowa z portu miksowania do portu urządzenia służy do odtwarzania, podczas gdy kierunek odwrotny służy do przechwytywania.

Na przykład patch audio, który kieruje próbki audio ze źródła FM_TUNER bezpośrednio do odbiornika multimediów, omija mikser programowy. Następnie musisz użyć miksera sprzętowego, aby zmiksować próbki audio z Androida i FM_TUNER do zlewu. Podczas tworzenia poprawki audio bezpośrednio ze źródła FM_TUNER do zlewu multimediów:

  • Regulacja głośności dotyczy zlewu multimediów i powinna wpływać zarówno na dźwięk w systemie Android, jak i FM_TUNER .

  • Użytkownicy mogą przełączać się między systemem Android a dźwiękiem FM_TUNER za pomocą prostego przełącznika aplikacji (nie jest wymagany żaden wyraźny wybór źródła multimediów).

Wdrożenia motoryzacyjne mogą również wymagać utworzenia łatki audio między dwoma portami urządzenia. Aby to zrobić, musisz najpierw zadeklarować porty urządzeń i możliwe trasy w audio_policy_configuration.xml , a następnie powiązać porty miksujące z portami urządzeń.

Przykładowa konfiguracja

Zobacz tę przykładową konfigurację, 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>

API sterownika audio

Możesz użyć getExternalSources() , aby pobrać listę dostępnych źródeł (identyfikowanych na podstawie adresu), a następnie utworzyć poprawki audio pomiędzy tymi źródłami a portami ujścia w zależności od wykorzystania audio. Odpowiednie punkty wejścia na Audio HAL pojawiają się w IDevice.hal :

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);
...
}

Tuner radiowy

Podczas tworzenia aplikacji radiowej zalecamy użycie HwAudioSource , ponieważ obsługuje ono zarówno tworzenie łatki, jak i sesję medialną do obsługi zdarzeń związanych z kluczem multimedialnym. Można utworzyć wiele źródeł dźwięku dla tego samego źródła i atrybutów audio. Można mieć jeden do zwykłego korzystania z radia, a drugi do komunikatów drogowych.

Jeśli nagrywasz FM_TUNER , w Androidzie 11 pozwolenie na wykonanie zostało zmienione na android.permission.CAPTURE_AUDIO_OUTPUT . Nie przechodzi już kontroli uprawnień OP_RECORD_AUDIO , która dotyczy tylko mikrofonów. Nie powinno to mieć wpływu na aplikacje, ponieważ FM_TUNER wymaga już pozwolenia SYSTEM_API na dostęp.

Aby uzyskać szczegółowe informacje na temat tworzenia aplikacji radiowej, zobacz Implementowanie radia .