Sous-système audio du cadre Android (02) Cadre du système audio

Cette série d'articles lien Master: sous-répertoire thématique cadre Android classe Sous - système audio


Résumé et description des points clés de ce chapitre:

Ce chapitre se concentre principalement sur ➕ la partie du cadre du système audio sous la carte mentale ci-dessus. A principalement une compréhension de base du cadre du système audio.


1 Introduction à Android Audio System Framework

Le schéma de trame complet du système audio est le suivant:

Pour cette image de cadre. Expliquez plusieurs classes audio clés:

  1. AudioFlinger: recevoir des données de plusieurs applications, les fusionner et les livrer; être l'exécuteur de la stratégie, par exemple, comment communiquer avec les périphériques audio, comment maintenir les périphériques audio dans le système existant et comment gérer le mixage de plusieurs flux audio Cela doit être fait par lui.
  2. AudioPolicyService: Décidez quel appareil choisir pour la sortie, connectez le casque pour les écouteurs et connectez le périphérique Bluetooth pour Bluetooth; c'est le décideur, comme quand ouvrir le périphérique d'interface audio, lequel correspond à un certain type de flux audio, etc.
  3. AudioTrack: un agent, APP accède à AudioFlinger via AudioTrack (communication de reliure, divisée en couche Java et couche C ++).

Ensuite, du point de vue d'AndioTrack, AudioFlinger, AudioHAL, interpréter le cadre audio plus en détail

De cette figure, nous devons comprendre les connaissances de base suivantes:

  1. Une carte son correspond à un ou plusieurs appareils. (L'appareil fait référence à: haut-parleurs, microphones, écouteurs, etc.)
  2. Un ou plusieurs périphériques correspondent à un nœud de périphérique.
  3. Un ou plusieurs nœuds de périphérique (tels que / dev / snd / pcmc0d0p) correspondent à une sortie, et la sortie est une combinaison de plusieurs périphériques; ces périphériques appartiennent à différents ports sur le même matériel. Ces appareils prennent en charge les mêmes paramètres, taux d'échantillonnage et canaux.
  4. Une sortie correspond à un thread de thread.
  5. Il y a une ou plusieurs pistes dans un fil. Lors de la lecture d'un son, il existe plusieurs sources sonores.
  6. Une piste correspond à un / plusieurs AudioTrack.

2 Concepts de base du système de cadre audio

@ 1 appareil: par exemple, les haut-parleurs de la carte son, des écouteurs ou Bluetooth, etc., ce sont des appareils. Le périphérique de périphérique de sortie dans la couche Java AudioSystem est défini comme suit:

public class AudioSystem
{
    //...
    public static final int DEVICE_OUT_EARPIECE = 0x1;    //听筒
    public static final int DEVICE_OUT_SPEAKER = 0x2;	  //扬声器
    public static final int DEVICE_OUT_WIRED_HEADSET = 0x4; //带话筒耳机
    public static final int DEVICE_OUT_WIRED_HEADPHONE = 0x8; //不带话筒耳机
    public static final int DEVICE_OUT_BLUETOOTH_SCO = 0x10; //蓝牙,面向 SCO方式,主要用于话音传输
    public static final int DEVICE_OUT_BLUETOOTH_SCO_HEADSET = 0x20; //蓝牙耳机,带话筒
    public static final int DEVICE_OUT_BLUETOOTH_SCO_CARKIT = 0x40; //蓝牙车载设备
    public static final int DEVICE_OUT_BLUETOOTH_A2DP = 0x80;		//蓝牙立体声
    public static final int DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = 0x100; //蓝牙立体声耳机
    public static final int DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER = 0x200;    //蓝牙话筒
    public static final int DEVICE_OUT_AUX_DIGITAL = 0x400;		//HDMI相关
	//...
}

@ 2 sortie: pour faciliter la gestion, un groupe d'appareils avec les mêmes paramètres sur un appareil est appelé sortie. Il décrit certains appareils réellement pris en charge (avec le matériel réel)

@ 3 module: un module matériel est utilisé pour accéder au matériel (carte son) dans le système Android. Un module est une bibliothèque d'opérations matérielles. Quelle sortie un module peut-il prendre en charge et quels périphériques une sortie peut-elle prendre en charge? La description

@ 4 profile: configuration, utilisée pour décrire la sortie, quels appareils peuvent être pris en charge (pris en charge uniquement de manière logique, pas nécessairement avec le matériel réel, comme la sortie du casque est prise en charge pendant une longue période après avoir branché le casque, elle n'est pas prise en charge sans brancher le casque, mais le profil a toujours pris en charge) .

@ 5 indicateur de sortie: par exemple, pour une application professionnelle, il lit uniquement le son provenant de HDMI. À ce stade, vous pouvez spécifier l'indicateur de sortie comme AUDIO_OUTPUT_FLAG_DIRECT, ce qui entraînera la sortie du son final directement vers l'appareil correspondant sans mixage.

@ 6 type de flux: l'application souhaite lire des sons, vous devez spécifier le type de son, ces types de sons sont appelés type de flux. Sa valeur est implémentée dans la couche C ++ (AudioTrack.cpp) comme suit:

typedef enum {
    /* These values must kept in sync with
     * frameworks/base/media/java/android/media/AudioSystem.java
     */
    AUDIO_STREAM_DEFAULT          = -1,
    AUDIO_STREAM_MIN              = 0,
    AUDIO_STREAM_VOICE_CALL       = 0,//电话语音
    AUDIO_STREAM_SYSTEM           = 1,//系统声音
    AUDIO_STREAM_RING             = 2,//铃声 声音
    AUDIO_STREAM_MUSIC            = 3,//音乐铃声
    AUDIO_STREAM_ALARM            = 4,//警告音
    AUDIO_STREAM_NOTIFICATION     = 5,//通知音
    AUDIO_STREAM_BLUETOOTH_SCO    = 6,
    AUDIO_STREAM_ENFORCED_AUDIBLE = 7, /* Sounds that cannot be muted by user
                                        * and must be routed to speaker
                                        */
    AUDIO_STREAM_DTMF             = 8,//DTMF 键盘拨号音
    AUDIO_STREAM_TTS              = 9,  /* Transmitted Through Speaker.
                                         * Plays over speaker only, silent on other devices.
                                         */
    AUDIO_STREAM_ACCESSIBILITY    = 10, /* For accessibility talk back prompts */
    AUDIO_STREAM_REROUTING        = 11, /* For dynamic policy output mixes */
    AUDIO_STREAM_PATCH            = 12, /* For internal audio flinger tracks. Fixed volume */
    AUDIO_STREAM_PUBLIC_CNT       = AUDIO_STREAM_TTS + 1,
    AUDIO_STREAM_CNT              = AUDIO_STREAM_PATCH + 1,
} audio_stream_type_t;

Sa valeur est implémentée dans la couche Java (AudioTrack.java) comme suit:

public class AudioSystem
{
    /* These values must be kept in sync with system/audio.h */
    /*
     * If these are modified, please also update Settings.System.VOLUME_SETTINGS
     * and attrs.xml and AudioManager.java.
     */
    /* The default audio stream */
    public static final int STREAM_DEFAULT = -1;
    /* The audio stream for phone calls */
    public static final int STREAM_VOICE_CALL = 0;//电话语音
    /* The audio stream for system sounds */
    public static final int STREAM_SYSTEM = 1;//系统声音
    /* The audio stream for the phone ring and message alerts */
    public static final int STREAM_RING = 2;//铃声声音
    /* The audio stream for music playback */
    public static final int STREAM_MUSIC = 3;//音乐声音
    /* The audio stream for alarms */
    public static final int STREAM_ALARM = 4;//警告音
    /* The audio stream for notifications */
    public static final int STREAM_NOTIFICATION = 5;//通知音
    /* @hide The audio stream for phone calls when connected on bluetooth */
    public static final int STREAM_BLUETOOTH_SCO = 6;
    /* @hide The audio stream for enforced system sounds in certain countries (e.g camera in Japan) */
    public static final int STREAM_SYSTEM_ENFORCED = 7;
    /* @hide The audio stream for DTMF tones */
    public static final int STREAM_DTMF = 8;//DTMF键盘拨号音
    /* @hide The audio stream for text to speech (TTS) */
    public static final int STREAM_TTS = 9;
    /**
     * @deprecated Use {@link #numStreamTypes() instead}
     */
    public static final int NUM_STREAMS = 5;
	//...
}

@ 7 stratégie: Il existe de nombreux types de type de flux, selon le type (stratégie) auquel il appartient d'utiliser la stratégie. Dans le même temps, il est également nécessaire de déterminer quel appareil jouer en fonction de la stratégie, qu'il s'agisse d'un haut-parleur, d'un casque ou de Bluetooth. Réglez la sortie en fonction de l'appareil. La méthode de stratégie d'acquisition est mise en œuvre comme suit:

AudioPolicyManagerBase::routing_strategy AudioPolicyManagerBase::getStrategy(
        AudioSystem::stream_type stream) {
    // stream to strategy mapping
    switch (stream) {
    case AudioSystem::VOICE_CALL:
    case AudioSystem::BLUETOOTH_SCO:
        return STRATEGY_PHONE;
    case AudioSystem::RING:
    case AudioSystem::ALARM:
        return STRATEGY_SONIFICATION;
    case AudioSystem::NOTIFICATION:
        return STRATEGY_SONIFICATION_RESPECTFUL;
    case AudioSystem::DTMF:
        return STRATEGY_DTMF;
    default:
        ALOGE("unknown stream type");
    case AudioSystem::SYSTEM:
        // NOTE: SYSTEM stream uses MEDIA strategy because muting music and switching outputs
        // while key clicks are played produces a poor result
    case AudioSystem::TTS:
    case AudioSystem::MUSIC:
        return STRATEGY_MEDIA;
    case AudioSystem::ENFORCED_AUDIBLE:
        return STRATEGY_ENFORCED_AUDIBLE;
    }
}

@ 8 stratégie: comment un flux sélectionne finalement un périphérique, comment ces flux s'influencent-ils les uns les autres (un son de haute priorité fera taire les autres sons), etc., collectivement appelés stratégie.

@ 9 Plusieurs termes courants dans les périphériques de sortie audio:

  • casque: indique à la fois l'écouteur et le micro
  • headPhone: indique qu'il n'y a qu'un écouteur, pas de micro
  • lineOut: consiste à émettre des signaux analogiques vers le haut-parleur

3 Brève description des documents impliqués

Le code ci-dessus est principalement divisé en 3 parties, AudioFlinger, AudioPolicyService, partie application (partie Java et partie C ++)

Les fichiers et emplacements de répertoires pertinents de certains AudioFlinger sont les suivants:

  • AudioFlinger.cpp (frameworks / av / services / audioflinger / AudioFlinger.cpp)
  • Threads.cpp (frameworks / av / services / audioflinger / Threads.cpp)
  • Tracks.cpp (frameworks / av / services / audioflinger / Tracks.cpp)
  • audio_hw_hal.cpp (matériel / libhardware_legacy / audio / Audio_hw_hal.cpp)
  • AudioHardware.cpp (périphérique / bras convivial / commun / libaudio / AudioHardware.cpp)

Les fichiers et emplacements de répertoire appropriés de la section AudioPolicyService sont les suivants:

  • AudioPolicyService.cpp (frameworks / av / services / audiopolicy / AudioPolicyService.cpp)
  • AudioPolicyClientImpl.cpp (frameworks / av / services / audiopolicy / AudioPolicyClientImpl.cpp)
  • AudioPolicyInterfaceImpl.cpp (frameworks / av / services / audiopolicy / AudioPolicyInterfaceImpl.cpp)
  • AudioPolicyManager.cpp (frameworks / av / services / audiopolicy / AudioPolicyManager.cpp)

Les fichiers et emplacements de répertoire pertinents de l'application APP sont les suivants:

  • AudioTrack.java (frameworks / base / media / java / android / media / AudioTrack.java)
  • android_media_AudioTrack.cpp (frameworks / base / core / jni / android_media_AudioTrack.cpp)
  • AudioTrack.cpp (frameworks / av / media / libmedia / AudioTrack.cpp)
  • AudioSystem.cpp (frameworks / av / media / libmedia / AudioSystem.cpp)
Publié 289 articles originaux · loué 47 · 30 000+ vues

Je suppose que tu aimes

Origine blog.csdn.net/vviccc/article/details/105265359
conseillé
Classement