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) 도 상기 코드 에서 찾 을 수 있 습 니 다. 볼 륨 조정 부분 에 대한 분석 은 이 기본 으로 끝나 고 상기 절 차 를 잠시 알 수 있 습 니 다.

좋은 웹페이지 즐겨찾기