問題の原因は次のとおりです。
コードの場所: Frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
私が見た奇妙な現象の理由は、 報道が行われたためであることがわかりました
SourceInsight を使って Android のソースコードを調べていると、こんな場所がありました。
status_t AudioPolicyManager::startOutput(audio_io_handle_t output,
audio_stream_type_t stream,
audio_session_t session)
{
//前面省略
//就是这个地方,真讨厌!!!!!!1
ALOGV("before startSource");
status_t status = startSource(outputDesc, stream, newDevice, &delayMs);
ALOGV("after startSource");
//以下省略
}
コードの場所: Frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
あなたはそれを見ましたか?startSource 関数です。クリックしてジャンプします。
status_t AudioPolicyManager::startSource(sp<AudioOutputDescriptor> outputDesc,
audio_stream_type_t stream,
audio_devices_t device,
uint32_t *delayMs)
{
ALOGV("AudioPolicyManager::startSource()");
その結果、呼び出されたログを印刷できなくなります。本当に久しぶりに会いました、本当に。現在のディレクトリとその近くのディレクトリを検索しました。他の実装は見当たりませんでした。変。
ついに見つけました
クラス AudioPolicyManagerCustom: public AudioPolicyManager
実際にはサブカテゴリがあります。本当にあります
startSource
そして同じ名前です。パラメータの数とパラメータの種類は同じです。
さて、AudioPolicyManager クラスの定義に戻ります。
virtual status_t startSource(sp<AudioOutputDescriptor> outputDesc,
audio_stream_type_t stream,
audio_devices_t device,
uint32_t *delayMs);
仮想関数
物事はここにあり、基本的には明らかです。
それでは、C++ 入門の xxxx ページに進み、C++ でカバーされる知識を確認してください。
そうですね、スクリーンショットを撮ることはできませんし、本も手元にないので、スクリーンショットを手に取ってください。
覆盖是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。
私が見た奇妙な現象の理由は、 報道が行われたためであることがわかりました
また、呼び出し先は実際にはポインタで呼ばれており(既成のサンプルの多くはポインタで書かれています)、この場所にこのポインタが隠されています。
それは何の役に立つでしょうか?たとえば、Andorid システムについて説明します。Google が標準バージョンを提供しています。元のシステムを変更する必要はありません。自分でクラスを作成し、元のクラスを上書きすることができます。これがカスタマイズです。