Android FrameWork 오디 오 관리 AudioManager 의 한 가지 해석 (계속)
android\frameworks\base\media\java\android\media\AudioService.java
android\frameworks\base\media\java\android\media\IAudioService.aidl
그 중에서 adjustStreamVolume (int streamType, int direction, int flags) 함수 의 성명 은 AudioService. aidl 에 있 고 함수 의 실현 은 AudioService. java 에 있 습 니 다.
다음은 구체 적 으로 소스 코드 를 볼 수 있다.
/** @see AudioManager#adjustStreamVolume(int, int, int) */
public void adjustStreamVolume(int streamType, int direction, int flags) {
if (DEBUG_VOL) Log.d(TAG, "adjustStreamVolume() stream="+streamType+", dir="+direction);
ensureValidDirection(direction);
ensureValidStreamType(streamType);
// use stream type alias here so that streams with same alias have the same behavior,
// including with regard to silent mode control (e.g the use of STREAM_RING below and in
// checkForRingerModeChange() in place of STREAM_RING or STREAM_NOTIFICATION)
int streamTypeAlias = mStreamVolumeAlias[streamType];
VolumeStreamState streamState = mStreamStates[streamTypeAlias];
final int device = getDeviceForStream(streamTypeAlias);
// get last audible index if stream is muted, current index otherwise
final int aliasIndex = streamState.getIndex(device,
(streamState.muteCount() != 0) /* lastAudible */);
boolean adjustVolume = true;
// convert one UI step (+/-1) into a number of internal units on the stream alias
int step = rescaleIndex(10, streamType, streamTypeAlias);
// If either the client forces allowing ringer modes for this adjustment,
// or the stream type is one that is affected by ringer modes
if (((flags & AudioManager.FLAG_ALLOW_RINGER_MODES) != 0) ||
(streamTypeAlias == getMasterStreamType())) {
int ringerMode = getRingerMode();
// do not vibrate if already in vibrate mode
if (ringerMode == AudioManager.RINGER_MODE_VIBRATE) {
flags &= ~AudioManager.FLAG_VIBRATE;
}
// Check if the ringer mode changes with this volume adjustment. If
// it does, it will handle adjusting the volume, so we won't below
adjustVolume = checkForRingerModeChange(aliasIndex, direction, step);
if ((streamTypeAlias == getMasterStreamType()) &&
(mRingerMode == AudioManager.RINGER_MODE_SILENT)) {
streamState.setLastAudibleIndex(0, device);
}
}
// If stream is muted, adjust last audible index only
int index;
final int oldIndex = mStreamStates[streamType].getIndex(device,
(mStreamStates[streamType].muteCount() != 0) /* lastAudible */);
if (streamState.muteCount() != 0) {
if (adjustVolume) {
// Post a persist volume msg
// no need to persist volume on all streams sharing the same alias
streamState.adjustLastAudibleIndex(direction * step, device);
sendMsg(mAudioHandler,
MSG_PERSIST_VOLUME,
SENDMSG_QUEUE,
PERSIST_LAST_AUDIBLE,
device,
streamState,
PERSIST_DELAY);
}
index = mStreamStates[streamType].getIndex(device, true /* lastAudible */);
} else {
if (adjustVolume && streamState.adjustIndex(direction * step, device)) {
// Post message to set system volume (it in turn will post a message
// to persist). Do not change volume if stream is muted.
sendMsg(mAudioHandler,
MSG_SET_DEVICE_VOLUME,
SENDMSG_QUEUE,
device,
0,
streamState,
0);
}
index = mStreamStates[streamType].getIndex(device, false /* lastAudible */);
}
sendVolumeUpdate(streamType, oldIndex, index, flags);
}
위의 함 수 를 분석 하면 알 수 있 듯 이 함 수 는 처음에 앞의 두 매개 변수 에 대한 유효성 검 측 이 있 고 구체 적 인 검 측 코드 를 붙 일 것 입 니 다. private void ensureValidDirection(int direction) {
if (direction < AudioManager.ADJUST_LOWER || direction > AudioManager.ADJUST_RAISE) {
throw new IllegalArgumentException("Bad direction " + direction);
}
}
private void ensureValidSteps(int steps) {
if (Math.abs(steps) > MAX_BATCH_VOLUME_ADJUST_STEPS) {
throw new IllegalArgumentException("Bad volume adjust steps " + steps);
}
}
private void ensureValidStreamType(int streamType) {
if (streamType < 0 || streamType >= mStreamStates.length) {
throw new IllegalArgumentException("Bad stream type " + streamType);
}
}
소스 코드 를 계속 따라 가면 볼 수 있 습 니 다.int step = rescaleIndex(10, streamType, streamTypeAlias);
이 매개 변 수 는 스텝 수 치 를 조정 하기 위 한 것 입 니 다.
다음 판단 조건 if (streamState. muteCount ()! = 0) 는 음소 거 상태 에서 시 작 된 볼 륨 조정 여 부 를 판단 하기 위해 서로 다른 조작 을 할 수 있 습 니 다.
함수 의 마지막 에
sendVolumeUpdate(streamType, oldIndex, index, flags);
이 함 수 는 시스템 볼 륨 바 를 업데이트 하 는 데 사 용 됩 니 다.
// UI update and Broadcast Intent
private void sendVolumeUpdate(int streamType, int oldIndex, int index, int flags) {
if (!mVoiceCapable && (streamType == AudioSystem.STREAM_RING)) {
streamType = AudioSystem.STREAM_NOTIFICATION;
}
mVolumePanel.postVolumeChanged(streamType, flags);
oldIndex = (oldIndex + 5) / 10;
index = (index + 5) / 10;
Intent intent = new Intent(AudioManager.VOLUME_CHANGED_ACTION);
if (streamType == AudioManager.STREAM_VOICE_CALL)
streamType = AudioManager.STREAM_MUSIC;
intent.putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, streamType);
intent.putExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, index);
intent.putExtra(AudioManager.EXTRA_PREV_VOLUME_STREAM_VALUE, oldIndex);
mContext.sendBroadcast(intent);
}
원본 코드 에서 호출 된 것 을 볼 수 있 습 니 다.\android\frameworks\base\core\java\android\view\VolumePanel.java
그 중에서 VolumePanel. 자바 는 시스템 볼 륨 바 를 표시 하 는 데 사 용 됩 니 다. 그 중에서 구체 적 으로 코드 를 참고 할 수 있 는 방법 을 표시 합 니 다.또한 이 부분 코드 는 시스템 의 모든 볼 륨 과 관련 된 아이콘 표시 와 관련 되 며 수정 미화 등 작업 을 해 야 할 경우 자원 파일 을 구체 적 으로 찾 아 수정 할 수 있 습 니 다.
구체 적 인 경 로 는
android\frameworks\base\core\res\res
또 다른 볼 륨 을 설정 하 는 방법 은 setStreamVolume (int streamType, int index, int flags) 도 상기 코드 에서 찾 을 수 있 습 니 다. 볼 륨 조정 부분 에 대한 분석 은 이 기본 으로 끝나 고 상기 절 차 를 잠시 알 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Fragmenta의 각서라고 할까, 그것 밖에 발견되지 않았기 때문에 시도해보기로 했습니다. 다만, 내용을 보면 어플리케이션을 만드는 프레임워크로서 사용되는 것도 의식하고 있는 것 같습니다. 하지만, 지금은 정확하지 않은 것 같기 때문에,...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.