기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.

현재 ACPI 시스템 종료 시그날이 들어가면, 1회 짧게 들어간 경우 장치를 화면잠금 하고, 길게 들어간 경우 종료 동작을 선택하도록 팝업을 띄우도록 장치가 구성되어 있습니다.


소스를 갖고 있으나, 빌드를 위한 환경이 갖추어지지 않은 상태인데, 이 장치의 종료 동작은 어떠한 코드로 빌드 되어 있는지 어디의 설정을 확인하면 좋을지 알고 싶습니다.


수정하고 싶은 동작은, ACPI 시스템 종료 시그날이 들어가면 팝업 없이 곧장 시스템을 shutdown -h now 시키고 싶습니다.


C 코드라면 바이너리 생성이 필요하니 빌드가 필요할지 모르겠으나, 의외로 이런 부분은 시스템에 연관된 동작이라도 java나 XML등으로 구현되는 경우가 많던데, 7.1.1버젼에서 어떠한 구성으로 되어 있는지 알고 싶습니다. 조언좀 부탁드리겠습니다.


추가로, 이 시스템에는 alsa가 올라와 있는데, 출력이 S/PDIF 디지털 출력으로 되어 있어서 Passthrough로 처리를 하는지, 마스터 볼륨 조절시 볼륨 조절이 되지 않습니다. 아마도 Passthrough로 출력 음성 스트림을 일체의 레이어를 거치지 않고 곧장 내보내는것 같습니다. 이러한 시스템에 윈도우즈의 wasapi처럼 추가적 처리를 할 레이어를 올리는 것이 가능할까요? 현재는 볼륨조절을 하기 위해서는 시스템에 연결된 앰프의 gain을 조절하는 방법 밖에 없는듯 합니다.(시스템에 리눅스를 올려 보니 리눅스 alsa에서는 볼륨 조절이 되는듯 했으며, power amp등의 추가적인 SW 볼륨 조절 레이어를 가진 플레이어는 볼륨 조절이 되었습니다.)


아마도 후자는 추가적 빌드 없이는 설정파일/자바 소스 수정 등만으론 해결이 힘들지 않을까 싶네요.


감사합니다.


겟페우스

2017.06.09 07:38:42
*.153.72.75

전원 관련은 http://blog.kmckk.com/archives/3858349.html

이 글을 발견해서 소스를 보고 있습니다.


S/PDIF 볼륨 쪽은 아직 정보를 못찾았네요.

고도리

2017.06.11 01:15:19
*.15.241.70

질문을 제가 정확하게 이해했는지 잘 몰라서 간단하게 말씀드리면...


1. 안드로이드에서 volume조절은 하드웨어적인 조절은 단 한번만 이뤄집니다. 고정이라고 보시면 됩니다.

2. 부팅된 이후에는 전부 sw적으로 조절됩니다.


해서 하드웨어적인 볼륨을 조절하시려면 따로 방안을 마련하셔야 합니다.

ex> ndk를 쓰던지 audiopolicyService를 수정하시던지....등등...


쉽게 될 듯 한데 쉽게 안되는 부분이 안드로이드 오디오일겁니다. 가끔 화도 납니다...ㅠ.ㅠ

겟페우스

2017.06.11 02:59:42
*.153.72.75

아날로그 출력 쪽은 볼륨 조절이 가능한데 디지털 출력 시에만 조절이 되지 않습니다.


아마 별도의 SW 레이어를 거치지 않고 곧장 디지털 데이터를 출력 시켜 버리는것 같습니다.


결국, 안드로이드에 별도의 레이어를 두고, 디지털 데이터를 다른 포멧으로 한번 더 인코딩 해주도록 해야 문제가 해결 되지 않을까 하는 생각 입니다.(패스스루로 내보내 버리면, 조절이 안되는건 당연한듯 합니다.)

겟페우스

2017.06.12 17:41:24
*.131.11.254

죄송합니다, 확인 결과 리눅스에서 볼륨 조절이 되는 것은 alsa가 아닌, pulseaudio 레이어 덕이었습니다. alsa만 올리면 리눅스에서도 볼륨조절이 되지 않는 것을 확인 하였습니다.


추가 : 인터넷을 뒤지다 보니 이러한 링크를 발견 하였습니다.

https://community.nxp.com/thread/340441


아직 소스의 문맥을 보지 못하고 저 부분만 본 것이라 장담은 못하겠으나, 삭제한 1행 (((device == AUDIO_DEVICE_OUT_AUX_DIGITAL) && (mDeviceIsHdmidongle == false)) || 의 조건이 맞는 경우 반드시 max or mute로 조절 하도록 설계 되어 있는듯 합니다.


제 시스템이 어떠한 이유로AudioPolicyManagerBase.cpp의 저 함수에서 1이 return 되는지를 찾아 내어 조건문을 수정 하면 문제를 해결 하는데에 도움이 되지 않을까 하는 생각이 듭니다. 


제 소스의 해당 부분은 조금 다르군요.

    // if volume is not 0 (not muted), force media volume to max on digital output

    if (stream == AudioSystem::MUSIC &&

        index != mStreams[stream].mIndexMin &&

        (device == AUDIO_DEVICE_OUT_AUX_DIGITAL ||

         device == AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET)) {

        return 1.0;

    }

List of Articles
번호 제목 글쓴이 날짜 조회 수

사용자 로그인