記事のマスターリンクのこのシリーズ:テーマ別のサブディレクトリのAndroid Frameworkクラスオーディオ・サブシステム
この章の要点の概要と説明:
この章では主に、上記のマインドマップの下のオーディオシステムフレームワーク部分に焦点を当てます。主にオーディオシステムフレームワークの基本的な知識があります。
1 Android Audio System Frameworkの概要
オーディオシステムの全体的なフレーム図は次のとおりです。
このフレーム画像について。いくつかの主要な音声クラスを説明します。
- AudioFlinger:複数のアプリからデータを受信し、それをマージして配信します。オーディオデバイスとの通信方法、既存のシステムでオーディオデバイスを維持する方法、複数のオーディオストリームの混合を処理する方法など、戦略の実行者になります。それによって行われなければなりません。
- AudioPolicyService:出力用に選択するデバイスを決定し、ヘッドホンをヘッドホンに接続し、BluetoothデバイスをBluetoothに接続します。これは、オーディオインターフェースデバイスを開くタイミングや、特定のオーディオのストリームタイプに対応するデバイスなどのポリシーメーカーです。
- AudioTrack:エージェントのAPPは、AudioTrack(バインダー通信、JavaレイヤーとC ++レイヤーに分かれています)を介してAudioFlingerにアクセスします。
次に、AndioTrack、AudioFlinger、AudioHALの観点から、Audioフレームワークをより詳細に解釈します
この図から、次の基本的な知識を理解する必要があります。
- 1つのサウンドカードは、1つまたは複数のデバイスに対応します。(デバイスとは、スピーカー、マイク、ヘッドフォンなどを指します。)
- 1つ以上のデバイスが1つのデバイスノードに対応します。
- 1つ以上のデバイスノード(/ dev / snd / pcmc0d0pなど)は出力に対応し、出力は複数のデバイスの組み合わせであり、これらのデバイスは同じハードウェアの異なるポートに属しています。これらのデバイスは、同じパラメーター、サンプリングレート、およびチャネルをサポートします。
- 1つの出力は1つのスレッドスレッドに対応します。
- スレッドに1つ以上のトラックがあります。サウンドを再生するとき、複数の音源があります。
- 1つのトラックは1つまたは複数のAudioTrackに対応します。
2オーディオフレームワークシステムの基本概念
@ 1デバイス:たとえば、サウンドカード、ヘッドフォン、Bluetoothなどのスピーカーは、デバイスと呼ばれます。JavaレイヤーAudioSystemの出力デバイスdeviceは、次のように定義されています。
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出力:管理を容易にするために、デバイス上の同じパラメーターを持つデバイスのグループを出力と呼びます。実際にサポートされているいくつかのデバイスについて説明しています(実際のハードウェアを使用)。
@ 3モジュール:ハードウェアモジュールは、Androidシステムのハードウェア(サウンドカード)にアクセスするために使用されます。モジュールはハードウェア操作ライブラリです。どの出力がモジュールをサポートでき、どのデバイスが出力をサポートできますか?構成ファイル/system/etc/audio_policy.confを使用して説明文
@ 4プロファイル:出力を説明するために使用される構成、サポートできるデバイス(論理的にのみサポートされ、必ずしも実際のハードウェアでサポートされるわけではありません。ヘッドセット出力は、ヘッドセットを接続した後、長期間サポートされます。ヘッドセットなしではサポートされませんが、プロファイルは常にサポートされています) 。
@ 5出力フラグ:たとえば、プロのアプリの場合、HDMIからの音声のみを再生します。現時点では、出力フラグをAUDIO_OUTPUT_FLAG_DIRECTとして指定できます。これにより、最終的な音声がミキシングせずに対応するデバイスに直接出力されます。
@ 6ストリームタイプ:アプリはサウンドを再生する必要があり、サウンドタイプを指定する必要があります。これらのサウンドタイプはストリームタイプと呼ばれます。その値は、C ++レイヤー(AudioTrack.cpp)に次のように実装されます。
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;
その値は、次のようにJava(AudioTrack.java)レイヤーに実装されます。
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戦略:使用する戦略に属するタイプ(戦略)に応じて、ストリームタイプには多くのタイプがあります。同時に、それがスピーカー、ヘッドフォン、またはBluetoothであるかどうか、戦略に基づいて再生するデバイスを決定することも必要です。デバイスに応じて出力を設定します。戦略の取得方法は次のように実装されます。
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ポリシー:ストリームが最終的にデバイスを選択する方法、これらのストリームが互いにどのように影響するか(高優先度のサウンドは他のサウンドを消音します)など。まとめてポリシーと呼ばれます。
@ 9オーディオ出力デバイスにおけるいくつかの一般的な用語:
- ヘッドセット:イヤホンとマイクの両方を示します
- headPhone:イヤホンのみがあり、マイクがないことを示します
- lineOut:スピーカーデバイスにアナログ信号を出力します
3関連するドキュメントの簡単な説明
上記のコードは、主に3つの部分、AudioFlinger、AudioPolicyService、アプリケーション部分(Java部分とC ++部分)に分かれています。
一部のAudioFlingerの関連ファイルとディレクトリの場所は次のとおりです。
- 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(ハードウェア/ libhardware_legacy /オーディオ/ Audio_hw_hal.cpp)
- AudioHardware.cpp(device / friendly-arm / common / libaudio / AudioHardware.cpp)
AudioPolicyServiceセクションの関連ファイルとディレクトリの場所は次のとおりです。
- 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)
アプリケーションAPPの関連ファイルとディレクトリの場所は次のとおりです。
- 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)