reTONE
다운로드무료 · Android 4.0+

reTONE 앱은 현재 영어와 일본어로 제공됩니다. 다른 언어도 지원할 예정입니다.

기술 노트

사양, 변환과 출력의 원리, 테스트한 기기 등의 세부 사항입니다. 기능에서 이어지는 내용입니다.

주요 사양

Android4.0 이상
CPUARM (armeabi-v7a, arm64-v8a). Intel 빌드 (x86, x86_64)도 포함되어 있습니다 (Intel 휴대전화에서는 아직 테스트하지 않았습니다)
권한저장소 접근 등. 인터넷 접근은 Network features가 켜져 있을 때만 사용합니다
reTONE 엔진이 읽는 형식WAV, AIFF/AIFC, DSF, DFF (비압축), FLAC, ALAC, Opus (Opus는 ARM 휴대전화만)
reTONE 엔진이 처리하는 곡Android 4.x: 모든 FLAC과 WAV. Android 5 이상: Android의 믹서를 거치는 경로에서, 출력과 레이트가 다른 FLAC, WAV, ALAC, 그리고 비트 심도가 16비트를 넘는 곡 ("Conversion by reTONE" 설정으로 끌 수 있음)
샘플레이트 변환카이저 창 FIR 필터 (폴리페이즈). 20 kHz까지 ±0.001 dB 이내 (설계값. 44.1 kHz 이상의 레이트 사이의 변환일 때)
엔진이 Android에 넘기는 형식Android 5 이상은 32비트 float, 4.x는 16비트 (16비트로 정확히 표현할 수 없는 값에만 디더 적용). 휴대전화 출력의 비트 심도는 휴대전화에 따라 다릅니다
USB DACUSB Audio Class 2. Class 1도 지원합니다 (실제 환경에서의 테스트는 제한적). DAC가 지원하고 휴대전화가 전송할 수 있는 레이트의 곡은 리샘플링 없이 보냅니다. 32비트 컨테이너를 우선합니다 (없으면 24비트나 16비트). 일정한 조건에서 네이티브 DSD
서명배포하는 모든 버전은 같은 키로 서명합니다

지원 형식

휴대전화의 Android가 재생할 수 있는 형식은 휴대전화의 디코더와 음향 처리로 재생합니다. DSD, AIFF, 그리고 Android가 읽지 못하는 하이레조 FLAC과 WAV는 reTONE 엔진이 재생합니다.

Android가 재생FLAC, AAC, MP3, Ogg Vorbis, WAV, Opus 등
reTONE 엔진이 재생DSD (DSF, DFF), AIFF, 32비트 WAV, ALAC (휴대전화가 재생하지 못할 때). Android 4.x에서는 모든 FLAC과 WAV, 그리고 Opus (ARM 휴대전화). 또한 Android가 FLAC, WAV, AIFF, ALAC, Opus를 재생하지 못하면 reTONE의 엔진이 대신 재생을 시도합니다 (ALAC과 Opus는 오류 없이 재생이 멈춘 경우에도)
지원하지 않음DST 압축 DFF, APE, WMA Lossless

기술 세부 사항

무손실이나 비압축 곡이라면, 올바르게 만들어진 디코더는 어느 것이든 같은 데이터를 복원합니다. 휴대전화의 음향 효과를 제외하면, 소리가 바뀌는 곳은 주로 세 군데입니다: 샘플레이트 변환, 비트 심도의 절삭, 그리고 음량 계산과 믹서. reTONE은 이 부분을 다룹니다.

배경: 음질에 영향을 주는 것

FLAC 같은 무손실 곡과 WAV 같은 비압축 곡은, 어느 앱으로 재생하든 올바르게 만들어진 디코더라면 원래 데이터 그대로 복원됩니다. 소리를 바꿀 수 있는 것은 디코딩 다음의 처리입니다 (아래의 세 단계와 휴대전화의 음향 효과).

샘플레이트 변환

많은 Android 휴대전화는 출력을 48 kHz 같은 레이트로 고정합니다. CD 음원이나 하이레조 음원처럼 레이트가 다른 곡은 재생할 때마다 리샘플링됩니다. 그 변환의 품질은 휴대전화마다 다릅니다.

비트 심도의 절삭

오래된 Android 버전에서는 24비트 곡이 16비트로 잘립니다.

음량 계산과 믹서

음량 계산과 다른 앱의 소리와의 믹싱도 출력 직전에 이루어집니다.

reTONE은 이 부분을 다룹니다. 변환이 필요한 곳에서는 reTONE이 직접 변환하고, 피할 수 있는 곳에서는 변환하지 않습니다. USB DAC에서는 Android의 오디오 처리를 거치지 않고 DAC로 보냅니다. USB DAC에서 조건이 갖춰지면 (아래의 "USB DAC의 음량" 참고), 플레이어에서 여는 신호 경로 화면에 BIT-PERFECT가 표시됩니다. 내장 스피커나 이어폰 단자에서는 Android 이후에 휴대전화가 오디오를 어떻게 처리하는지 확인할 방법이 없으므로, 비트 퍼펙트 출력을 보증할 수 없습니다.

샘플레이트 변환은 휴대전화마다 다릅니다

Android는 모든 오디오를 재생하기 전에 휴대전화의 출력 레이트에 맞춥니다. 그 레이트는 휴대전화마다 다릅니다. 많은 기종이 48 kHz로 동작하지만 44.1 kHz로 동작하는 기종도 있습니다. 그래서 같은 곡이 어떤 휴대전화에서는 변환되고, 다른 휴대전화에서는 그대로 재생될 수 있습니다.

곡의 샘플레이트휴대전화 출력이 44.1 kHz휴대전화 출력이 48 kHz
44.1 kHz (CD 등)변환 없음48 kHz로 변환
48 kHz44.1 kHz로 변환변환 없음
88.2, 96, 192 kHz44.1 kHz로 변환48 kHz로 변환

확인한 예: Sony Xperia P와 Xperia go는 44.1 kHz 출력, SHARP AQUOS CRYSTAL 305SH, KYOCERA URBANO L03 (KYY23), 라쿠라쿠 스마트폰 F-06F, Samsung Galaxy S8은 48 kHz 출력. 두 레이트를 모두 지원하는 휴대전화도 있지만, 실제로 어느 쪽을 쓰는지는 휴대전화의 구성에 따라 다릅니다.

Android 자체 변환의 품질도 휴대전화의 설정에 따라 다릅니다. 확인한 휴대전화 중 Android 4.4의 KYY23과 305SH는 최고 품질로 설정되어 있었지만, Android 9의 Galaxy S8은 설정이 없어 표준인 중간 품질을 사용했습니다 (부하가 크면 더 낮아집니다). reTONE 자체 엔진이 재생하는 곡은 변환을 피할 수 없을 때 Android에 맡기지 않습니다. reTONE이 직접 한 번만 변환해, 휴대전화의 출력 레이트와 정확히 같은 레이트로 오디오를 넘깁니다.

곡이 이미 휴대전화의 출력 레이트와 같을 때, 다이렉트 출력을 지원하는 Android 10 이상의 휴대전화, 그리고 USB DAC에서는 Android의 변환을 피할 수 있습니다. 일부 DAP 등 펌웨어 수준에서 아예 변환하지 않도록 만들어진 기기도 있습니다.

Android의 출력 뒤에 휴대전화의 오디오 칩이 내부에서 다시 변환하는지는 앱에서 볼 수 없습니다. reTONE이 표시하는 출력 레이트는 Android가 알려 주는 값입니다. 휴대전화의 출력 레이트와 변환 여부는 Now Playing 화면 아래쪽과 Device & audio에서 확인할 수 있습니다.

오디오 경로

휴대전화의 출력 레이트가 48 kHz 등으로 고정되어 있으면 root 없이는 바꿀 수 없으므로, 레이트가 다른 곡 (44.1 kHz의 CD 음원이나 88.2, 96, 192 kHz의 하이레조 음원)은 변환 없이 재생할 수 없습니다. Android 4.x와, Android 5 이상에서 믹서를 거치는 경로에서는 reTONE이 엔진으로 재생하는 곡을 고품질로 리샘플링한 다음 Android에 넘기므로, Android의 변환은 동작하지 않습니다 (변환 품질은 아래의 "리샘플링 필터"를 참고하십시오). USB DAC에서는 DAC가 지원하고 휴대전화가 전송할 수 있는 레이트라면 변환하지 않습니다. 다이렉트 출력을 쓰는 경우 Android는 변환하지 않습니다 (그 뒤에 일어나는 일은 아래의 “다이렉트 출력이 건너뛰는 것”을 참고하십시오).

Android 4.xFLAC, WAV, DSD, AIFF
곡 파일 reTONE 엔진Android 대신 리샘플링 (필요할 때만) Android16비트로 받음, 변환 없음 스피커 / 이어폰
Android 5 이상믹서를 거치는 경로. DSD, AIFF, 그리고 변환이 필요한 FLAC/WAV/ALAC
곡 파일 reTONE 엔진Android 대신 리샘플링 Androidfloat로 받음, 레이트 변환 없음 (16비트 출력 휴대전화에서는 여기서 16비트로 줄어듦) 스피커 / 이어폰
Android 10 이상다이렉트 출력을 지원하는 휴대전화
곡 파일 reTONE16비트 무손실 오디오를 24비트로 다시 담음 Android다이렉트 출력 스피커 / 이어폰그다음은 휴대전화에 따라 다름
USB DACOTG로 연결 (모든 곡)
곡 파일 reTONEDAC가 지원하는 레이트는 그대로, 그 밖에는 리샘플링Android를 거치지 않음 USB DAC

reTONE이 처리Android가 처리

곡의 샘플레이트가 휴대전화의 출력과 같으면 변환이 필요 없으므로, Android의 표준 재생에서도 변환은 일어나지 않습니다. MP3나 AAC처럼 reTONE 엔진을 거치지 않는 형식은 Android의 표준 재생을 사용하며, 레이트가 휴대전화의 출력과 다르면 Android가 리샘플링합니다 (USB DAC로 재생할 때는 이런 형식도 reTONE이 보냅니다). DSD와 AIFF는 Android 10 이상에서도 reTONE 엔진이 재생합니다.

자세히

reTONE이 어디까지 다루는지는 곡의 포맷, Android 버전, 출력에 따라 달라집니다. PCM 곡의 샘플레이트 변환은 reTONE이 다루는 경로에서 많아야 한 번만 일어납니다 (내부적으로는 한 번의 변환에 여러 필터 단계를 쓸 수 있습니다). DSD는 DSD에서 PCM으로 바꾼 뒤 많아야 한 번입니다. Bluetooth에서는 이 뒤에 휴대전화와 Bluetooth 코덱이 오디오를 더 처리합니다. 재생은 Android의 MediaPlayer와 AudioTrack 위에 만들어져 있으며, 그 앞에서 reTONE의 엔진 (C로 작성)이 디코딩과 변환을 맡습니다.

Android 4.x: 많은 Android 4.x 휴대전화는 음악 출력 스레드를 48 kHz 같은 고정 레이트로 열고, 44.1 kHz나 96 kHz처럼 레이트가 다른 곡은 재생 전에 Android의 믹서 안에서 리샘플링됩니다. 앱이 이 변환을 막을 방법은 없습니다. 4.x의 표준 디코더는 24비트 FLAC을 16비트로 줄이거나 192 kHz FLAC을 열지 못하기도 합니다. 그래서 4.x에서는 reTONE 엔진이 모든 FLAC과 WAV, 그리고 DSF, DFF, AIFF를 읽어 휴대전화의 출력 레이트 (AudioTrack.getNativeOutputSampleRate의 값)로 한 번 변환하고, 16비트로 넘깁니다. Android의 믹서는 같은 레이트의 16비트 오디오를 그대로 받으므로 Android 쪽에서는 샘플레이트 변환이 일어나지 않습니다. 16비트로 줄일 때, 16비트로 정확히 표현할 수 있는 값 (변환 없이 그대로 통과하는 CD 음원 등)은 그대로 넘기고, 그 밖에는 TPDF 디더를 적용합니다. 출력이 44.1 kHz나 48 kHz일 때는 오차 피드백 노이즈 셰이핑 (Lipshitz, Vanderkooy, Wannamaker의 5탭 E 가중 필터)으로 양자화 노이즈를 잘 들리지 않는 주파수로 옮깁니다. 클리핑이 일어나면 발진을 막기 위해 피드백하는 오차를 ±4 LSB로 제한합니다. 계수는 44.1 kHz용으로 설계했고 48 kHz에서도 사용합니다. 노이즈의 총량은 늘어나지만, 귀가 덜 민감한 고역으로 옮겨집니다. 다만 Android의 음량을 최대보다 낮게 설정하면 Android의 믹서가 음량을 적용한 뒤 다시 16비트로 반올림하므로 노이즈 셰이핑의 효과가 줄어듭니다. 음량을 하드웨어에서 조절하는 휴대전화에는 해당하지 않습니다. 어느 경우든 샘플레이트 변환은 일어나지 않습니다. MP3, AAC 같은 포맷은 4.x에서도 Android의 표준 경로로 재생합니다.

Android 5 이상 (믹서를 거치는 경로): Android 10 이상에서는 다이렉트 출력을 쓰지 않는 경로도 여기에 해당합니다. 이 세대의 Android 믹서는 float를 받으므로, reTONE 엔진은 디더 없이 float 오디오를 AudioTrack에 넘깁니다. 16비트 출력 휴대전화에서는 그 뒤 Android가 16비트로 반올림합니다 (이 단계에서 Android는 디더를 적용하지 않습니다). 샘플레이트가 휴대전화의 출력 레이트와 다른 FLAC, WAV, ALAC 곡을 그대로 넘기면 Android의 믹서가 리샘플링하고, 16비트를 넘는 곡은 16비트로 잘립니다. AOSP의 기본 리샘플러는 품질 설정 (af.resampler.quality)이 지정되지 않으면 중간 동적 품질 (DYN_MED)을 사용하고, 동시에 쓰이는 리샘플러의 예상 부하가 한도를 넘으면 더 낮은 품질로 떨어집니다. 확인한 휴대전화에서는 이 설정이 지정되어 있지 않았습니다. reTONE 엔진은 이런 조건에 해당하는 곡만 리샘플링하며, "Conversion by reTONE" 설정으로 끌 수 있습니다. 휴대전화의 출력 레이트와 같은 16비트 곡 (44.1 kHz 휴대전화의 CD 음원 등)은 변환이 필요 없으므로 Android의 표준 경로로 재생합니다.

다이렉트 출력 (Android 10 이상. 사용 가능 여부는 휴대전화에 따라 다름): 믹서를 거치지 않고 곡의 레이트 그대로 오디오를 보내는 "다이렉트 출력"과, 압축 오디오를 칩에서 디코딩하는 "오프로드"를 쓸 수 있는지는 휴대전화와 출력에 따라 다릅니다. Android 10 이상에서는 앱이 AudioTrack.isDirectPlaybackSupported로, 주어진 포맷·레이트·비트 심도를 지금의 출력에 다이렉트로 출력할 수 있는지 휴대전화에 물을 수 있습니다. reTONE은 휴대전화가 가능하다고 답하고 휴대전화의 오디오 정책이 실제로 PCM을 다이렉트 출력으로 보낼 때만 이 경로를 쓰고, 그렇지 않으면 Android의 표준 경로로 재생합니다. 답은 출력마다 다르므로, 이어폰이나 USB를 꽂거나 뺄 때마다 다시 묻습니다. 오디오 정책이 PCM을 다이렉트 출력으로 보내는 휴대전화에서 다이렉트로 출력할 수 없었던 주된 포맷은 44.1, 48, 88.2 kHz의 16비트 PCM이었습니다 (CD 음원이 이 그룹에 속합니다). 24비트와 float는 곡의 레이트 그대로 다이렉트로 출력할 수 있었고, MP3와 AAC (60초 이상의 곡)는 오프로드로 갔습니다. 그래서 reTONE은 16비트 무손실 오디오 (FLAC, ALAC, WAV)를 PCM으로 디코딩하고 (휴대전화에 디코더가 없는 ALAC은 reTONE 자체 디코더로), 하위 8비트를 0으로 채운 24비트 WAV로서 MediaDataSource를 통해 MediaPlayer에 넘깁니다. 상위 16비트는 바뀌지 않습니다. 전환하기 전에 첫 블록을 실제로 디코딩해 진짜 16비트 PCM이 나오는지 확인하고, 확인하지 못하면 표준 경로로 돌아갑니다. 24비트와 고레이트의 무손실 오디오, 그리고 MP3와 AAC는 원래 다이렉트 출력이나 오프로드로 가므로 그대로 넘깁니다. 휴대전화가 실제로 어느 출력을 썼는지 앱이 읽을 방법은 없으므로, 플레이어 화면의 "DIRECT"는 예상입니다. reTONE은 예전에는 휴대전화의 답만 근거로 삼았지만, 순정 Android는 가능하다고 답하면서도 PCM을 믹서로 보내는 경우가 있어, 실제로는 다이렉트가 아닌데 DIRECT가 표시되는 휴대전화가 있었습니다. 0.92.48부터 reTONE은 휴대전화의 오디오 정책도 함께 확인합니다. 0.90.1부터 "DIRECT"는 무손실 곡에만 표시하며, Bluetooth에서는 표시하지 않습니다. 오프로드에서는 칩 안에서 샘플레이트가 바뀌는지도 확인할 수 없습니다. 이 경로에서는 Android 쪽의 음향 효과가 적용되지 않으며 (일부 휴대전화에서는 칩 안에서 효과가 동작합니다), DAC의 하드웨어 설정 (필터 등)은 그대로 적용됩니다. 설정에서 켜고 끌 수 있습니다.

USB DAC로의 다이렉트 출력: USB 호스트 (OTG)를 지원하는 휴대전화에 USB DAC를 연결하면, reTONE은 Android의 오디오 경로를 거치지 않고 데이터를 DAC로 바로 보냅니다. 확인한 휴대전화에서는 Android의 표준 경로가 USB DAC용으로 오디오를 16비트/48 kHz로 변환했습니다 (32비트/192 kHz용 출력도 열려 있었지만 음악에는 쓰이지 않았습니다). reTONE의 다이렉트 출력은 다음과 같이 동작합니다.

  • 휴대전화의 USB 호스트 API를 사용해 reTONE이 DAC를 찾고, 사용자의 허가를 받아 USB 디스크립터를 읽습니다 (USB Audio Class 2.0: 클록 ID, 재생 인터페이스의 대체 설정, 출력 엔드포인트와 피드백 엔드포인트. Class 1.0: 대체 설정별 샘플레이트와 패킷 크기).
  • DAC를 Android의 드라이버로부터 넘겨받고 (claimInterface), PCM·2채널·32비트의 대체 설정을 우선합니다 (없으면 24비트나 16비트).
  • 클록 소스의 GET RANGE로 지원하는 샘플레이트를 읽습니다. 곡의 레이트가 범위 안에 있으면 SET CUR로 설정하고 GET CUR로 확인합니다. 지원하지 않는 레이트의 곡과, 휴대전화의 USB가 전송을 거부하는 레이트의 곡 (0.92.68부터)만 reTONE이 DAC가 받아들이는 레이트로 한 번 리샘플링합니다. DAC가 지원하는 레이트의 곡에는 샘플레이트 변환도 디더도 없습니다. 24비트까지의 곡은 원래 데이터를 32비트 워드의 상위 비트에 그대로 담아 보냅니다 (DAC의 음량을 사용할 때나 DAC 본체에서 음량을 조절할 때). 32비트 정수 곡도 정수 그대로 유지하는 경로를 거칩니다 (0.92.65부터). DAC의 비트 심도로 정확히 표현할 수 없는 값만 반올림하며, DAC가 24비트 이하이면 TPDF 디더를 적용합니다.
  • 전송은 C 쪽에서 usbdevfs의 아이소크로너스 전송으로 처리합니다. 0.125 ms마다 오디오를 받는 High Speed DAC (대부분)에서는 1 ms 분량 (8 마이크로프레임)을 한 번의 전송으로 묶고, 이것을 64개 앞서 대기열에 쌓아 둡니다. 간격이 더 긴 DAC에서는 전송 하나에 32 패킷을 담고 대기열을 줄여, 약 64 ms를 앞서 유지합니다. 비동기 DAC는 피드백 엔드포인트로 마이크로프레임당 프레임 수를 알려 주며, reTONE은 그에 맞춰 보내는 양을 조절합니다. 그 값의 형식은 DAC마다 다르므로 reTONE이 도착하는 값으로 판별합니다. reTONE이 음량을 적용할 때는 보내기 직전에 적용하므로 변경이 바로 반영됩니다 (급격한 단차를 피하려고 변경마다 약 5 ms에 걸쳐 변화시킵니다).
  • 이 동안 MP3, AAC 같은 포맷도 휴대전화의 디코더 (MediaCodec)로 PCM으로 디코딩해 보내므로, reTONE이 모든 곡을 재생합니다. DAC를 뽑으면 재생이 일시정지됩니다. 다른 앱이 재생을 시작하면 reTONE은 일시정지하고 DAC를 Android에 돌려주며, reTONE에서 다시 재생하면 DAC를 되찾습니다. 강제 종료 등으로 DAC가 Android에 돌아가지 못한 경우에는, 업데이트 직후와 "USB DAC direct output"을 끈 상태에서 reTONE을 열 때 reTONE이 돌려줍니다.

Android 4.1 세대의 많은 휴대전화는 USB DAC를 오디오 출력으로 쓸 수 없지만, reTONE의 다이렉트 출력은 USB 호스트 기능만 사용하므로 그래도 오디오를 보낼 수 있습니다. 2012년의 테스트용 휴대전화 (Android 4.1)와 배터리 내장 DAC에서 24비트/192 kHz가 변환 없이 재생되었습니다. USB Audio Class 2.0 DAC는 직접 테스트했습니다. Class 1.0 DAC도 지원하지만, 지금까지의 실제 환경에서의 테스트는 사용자 보고뿐입니다. 오래된 휴대전화는 USB로 공급할 수 있는 전류가 작아서, 버스 파워 DAC는 인식되지 않을 수 있습니다. Wi-Fi 전파의 간섭이 USB 케이블을 통해 DAC에 들어가 간헐적인 노이즈가 난 경우도 있었습니다. 재생에 연결은 필요 없으므로, USB DAC로 들을 때는 에어플레인 모드로 바꾸시기를 권장합니다.

출력별 차이

“Dedicated music player”와 “Music app”은 같은 오디오 경로를 사용합니다. 다른 점은 HOME이 reTONE을 여는지, Silent DAP mode의 기본값, reTONE의 잠금 화면뿐입니다. 다이렉트 출력 (Android 10 이상)과 USB DAC 다이렉트 출력은 어느 모드에서도 동작합니다.

출력Android 믹서샘플레이트플레이어의 DIRECTVolume
내장 스피커와 헤드폰 단자예 (다이렉트 출력을 사용할 때는 제외)휴대전화의 출력 레이트에 맞춤 (위의 그림과 같음)Android 10 이상에서 다이렉트 출력을 사용할 것으로 보이는 무손실 곡Android 음량 + reTONE의 미세 음량 단계
USB DAC (다이렉트 출력 켜짐, 기본값)아니요DAC가 지원하면 그대로무손실 곡을 레이트 변환 없이 보낼 때DAC 본체에서, 또는 음량 키로 (DAC나 reTONE이 조절)
USB DAC (다이렉트 출력 꺼짐)예휴대전화의 USB 설정에 따라 다름 (16비트 / 48 kHz로 변환하는 기종도 있음)표시하지 않음Android 음량
Bluetooth예휴대전화가 Bluetooth 코덱으로 다시 인코딩표시하지 않음Android 음량 (일부 휴대전화에서는 기기와 연동)

DSD는 PCM으로 변환합니다. 단, 네이티브 DSD를 지원하는 DAC에 다이렉트 출력으로 보낼 때는 예외입니다. reTONE이 DAC를 사용하는 동안 알림음 같은 다른 앱의 소리는 내장 스피커로 재생됩니다. 다른 앱이 재생을 시작하면 reTONE은 DAC를 Android에 돌려줍니다. 많은 Android 4.x 휴대전화는 단독으로는 USB DAC를 오디오 출력으로 쓸 수 없으므로, DAC는 다이렉트 출력을 통해서만 동작합니다. 플레이어 화면의 맨 아래 줄을 탭하면 신호 경로 화면이 열립니다. 각 단계 (파일, 디코딩, 샘플레이트, 음량, 출력)에서 오디오가 그대로 통과하는지 바뀌는지를, reTONE 자체의 처리와 Android가 알려 주는 정보를 바탕으로 표시합니다. 휴대전화의 DSP나 DAC 내부의 처리는 표시할 수 없습니다.

다이렉트 출력이 건너뛰는 것

다이렉트 출력을 쓰면 Android 내부의 믹싱과 샘플레이트 변환을 건너뜁니다. 그 뒤에 오디오가 어떻게 되는지는 휴대전화와 출력에 따라 다릅니다.

앱이 넘긴 오디오는 이 순서로 Android 안을 흐릅니다.

1. Android의 오디오 허브 (AudioFlinger)
일반 출력에서는 여기의 믹서가 여러 앱의 소리를 합치고, 휴대전화의 출력 레이트 (보통 48 kHz)로 변환하고, 음량을 적용합니다. 다이렉트 출력이 주로 건너뛰는 것은 이 단계로, 믹싱도 변환도 없습니다. 음량은 휴대전화의 오디오 하드웨어에 음량 조절 기능이 있으면 그쪽에 맡기고, 없으면 이 단계에서 샘플에 적용될 수 있습니다 (최대 음량에서는 값이 바뀌지 않습니다).

2. 제조사의 오디오 구성 요소 → 칩 안의 오디오 프로세서 (DSP)
대부분의 휴대전화에서 오디오는 DAC로 바로 가지 않고, 자체 단계를 가진 칩 안의 DSP를 거칩니다.

  • 스트림별 처리 (형식 변환, 음량)
  • 출력별 처리 (스피커 보호, 제조사의 음향 효과, 리미터)
  • 최종 출력 단계. 출력마다 자체 레이트가 있고, 곡의 레이트가 다르면 DSP가 변환합니다
  • MP3와 AAC의 "오프로드"는 이 DSP가 디코딩합니다

3. DAC (칩에 내장되거나 별도의 DAC 칩)
여기서 오디오가 처음으로 아날로그가 됩니다. DAC 내부의 디지털 필터 (오버샘플링)는 USB DAC에서도 똑같이 거치므로, 데이터가 바뀌었는지를 따질 때는 셈에 넣지 않습니다.

말할 수 있는 것

  • 다이렉트 출력을 쓸 때 확실한 것: Android 내부의 믹싱과 샘플레이트 변환을 건너뜁니다
  • 음악을 염두에 두고 만든 헤드폰 경로처럼, 휴대전화가 DSP의 출력 레이트를 곡에 맞춘다면 DSP는 데이터의 형식만 맞춰 넘기므로, 원래에 가까운 상태로 DAC에 닿을 가능성이 높습니다
  • 출력 레이트가 48 kHz로 고정된 휴대전화에서는 Android의 변환을 건너뛰더라도 DSP가 오디오를 변환합니다
  • 스피커에는 거의 항상 스피커 보호나 보정이 들어갑니다. 스피커에서도 DIRECT를 표시하는 휴대전화가 있지만, 데이터는 바뀌었다고 보아야 합니다
  • 일부 휴대전화에서는 제조사의 음향 효과가 DSP 안에서 동작합니다
  • 앱은 이것을 확인할 수 없습니다. Android 9부터는 일반 앱이 DSP의 설정이나 어느 경로가 쓰였는지를 읽을 방법이 없습니다. reTONE의 DIRECT 표시는 Android의 답과 휴대전화의 오디오 정책에 근거한 예상입니다 (무손실 곡에만 표시하며, Bluetooth에서는 표시하지 않습니다)

USB DAC와의 차이
USB DAC에서는 reTONE이 Android의 오디오 경로를 거치지 않고 USB로 DAC와 직접 통신합니다. reTONE은 DAC에 이르기까지의 데이터를 다루며, DAC 내부에서 일어나는 일은 확인할 수 없습니다. 곡을 원래의 샘플레이트로 보내고 음량을 DAC 쪽에서 조절하면, reTONE은 값을 바꾸지 않습니다.

리샘플링 필터

0-20-40-60-80-100-120-1400102030 Frequency (kHz) dB Flat to 20 kHz Stopbandfrom 24.1 kHz
44.1 kHz → 48 kHz 변환에 쓰는 필터의 응답 (앱과 같은 식으로 계산).float 출력 휴대전화 (목표 120 dB) 16비트 출력 휴대전화 (목표 100 dB)
  • 20 kHz까지 평탄20 kHz까지의 편차는 0.001 dB 미만입니다 (계산값). 들리는 소리를 줄이지 않습니다.
  • 저지대역 감쇠 120 dB / 100 dB 이상float 출력 휴대전화와 16비트 출력 휴대전화의 계산값입니다 (44.1 kHz → 48 kHz에서 약 −122 dB / 약 −102 dB). 30 kHz 입력 신호로 측정한 에일리어싱 (16비트로 반올림하기 전, 0~20 kHz에 나타나는 양)은 원래 신호보다 104.6 dB 이상 낮았습니다.
  • 리샘플링할 때만 −1 dB0 dBFS를 넘는 인터샘플 피크를 위한 여유를 남깁니다 (시판 음원에서 측정한 최댓값은 +0.59 dB). 리샘플링한 곡은 리샘플링하지 않은 곡보다 1 dB 작게 들립니다.
자세히

샘플레이트 변환은 원래 샘플 사이의 파형을 다시 계산하므로, 필터의 품질이 소리에 그대로 드러납니다. reTONE의 필터는 sinc 함수에 카이저 창을 적용해 만든 FIR 필터입니다. 변환 비율에 맞춰 계수를 여러 그룹으로 나누고 필요한 것만 계산하는 폴리페이즈 구조를 사용합니다. 설계는 두 가지 기준에 바탕을 둡니다. 들리는 소리를 줄이지 않을 것, 그리고 변환으로 생기는 에일리어싱을 충분히 억제할 것.

  • 통과대역: 20 kHz까지 평탄 (설계상 ±0.001 dB 이내. 44.1 kHz 이상의 레이트 사이의 변환일 때).
  • 저지대역: "낮은 쪽 레이트 − 20 kHz"에서 시작합니다. 44.1 kHz와 48 kHz 사이에서는 24.1 kHz입니다. 이 범위에 떨어지는 에일리어싱은 20 kHz 위에 나타나므로 가청 대역 (20 kHz까지) 밖에 머뭅니다.
  • 감쇠 (설계 목표): float 출력 휴대전화 (Android 5 이상)는 120 dB, 16비트 출력 휴대전화 (Android 4.x)는 100 dB. 필터 길이와 창은 목표보다 2 dB의 여유를 두고 설계해, 모든 변환에서 계산값이 목표를 넘게 했습니다 (44.1 → 48 kHz의 계산값은 약 122 dB와 약 102 dB). −100 dB의 잔류 에일리어싱은 16비트의 노이즈 플로어 (디더를 포함한 전대역에서 약 −93 dBFS)보다 충분히 낮으므로, 100 dB의 감쇠는 들어서 120 dB와 다르지 않습니다.
  • 탭 수: 감쇠량과 천이대역으로부터 카이저 창의 식으로 정합니다 (120 dB에서 44.1 ↔ 48 kHz는 86탭).
  • 2:1 단계: 96 → 48 kHz처럼 레이트를 정확히 절반으로 낮추는 단계에는 하프밴드 필터를 사용합니다. 계수의 절반이 0이고 나머지는 대칭이므로, 곱셈이 일반 필터의 약 4분의 1로 줄어듭니다. 192 → 48 kHz는 하프밴드 2단을 사용하고, 88.2 → 48 kHz처럼 남는 비율은 폴리페이즈 필터로 처리합니다.

측정에서는 1 kHz, 19 kHz, 19.9 kHz 신호가 0.01 dB 이내의 같은 레벨로 나왔습니다. 30 kHz 입력에서 0~20 kHz에 나타난 에일리어싱은 44.1 kHz와 48 kHz 출력에서 원래 신호보다 104.6 dB 이상, 192 kHz로부터의 변환에서는 116 dB 이상 낮았습니다 (16비트로 반올림하기 전에 측정). 이것은 한 주파수에서의 값입니다. 설계상 저지대역 전체가 위의 감쇠 목표 이상으로 억제됩니다.

변환은 원래 샘플 사이에 새 점을 만들므로, 음압이 높은 곡에서는 0 dBFS를 넘는 점이 생길 수 있습니다. 가지고 있던 시판 음원 몇 가지를 48 kHz로 변환했을 때, 0 dBFS를 넘는 점은 전체의 0.0001~0.001%였고 최댓값은 +0.38~+0.59 dB였습니다. 이런 점은 16비트 출력이나 휴대전화의 믹서에서 클리핑되므로, reTONE은 리샘플링할 때에만 레벨을 1 dB 낮춰 측정한 최댓값 위로 여유를 남깁니다. 리샘플링하지 않는 곡은 그대로이므로, 같은 휴대전화에서는 리샘플링한 곡이 1 dB 작게 들립니다. 다음 곡으로 끊김 없이 넘어갈 때는 리샘플러의 상태를 이어받으므로, 곡의 시작과 끝이 처리 때문에 잘리지 않습니다 (0.92.57부터).

음량은 reTONE 엔진 안에서 적용하지 않습니다. Android의 믹서 (AudioTrack의 음량)에서 적용합니다. 엔진 안에서 적용하면 AudioTrack에 버퍼링된 약 500 ms의 오디오가 다 재생될 때까지 변경이 늦어져, 음량 키의 반응이 둔하게 느껴집니다. 16비트 출력 휴대전화에서는 음량을 낮추면 Android가 다시 16비트로 반올림합니다 (이 단계에서 Android는 디더를 적용하지 않습니다).

계산은 C로 작성했고, ARM NEON 명령으로 좌우 채널을 함께 처리합니다. 필터의 내부 루프는 계수를 벡터로 읽고, 누산기 4개를 써서 지연을 감춥니다. 난수, 반올림, 클리핑, 오차 피드백을 포함한 디더도 모두 NEON 안에서 처리해, 오래된 코어 (Cortex-A9)에서 느린 NEON과 범용 레지스터 사이의 전송을 피합니다. Intel (x86) 빌드는 NEON 없이 일반 C 경로를 사용합니다. 아래의 부하 수치는 테스트한 ARM 휴대전화의 값입니다.

알고 계셨나요?Android의 리샘플링 품질은 휴대전화 제조사가 정합니다

Android에서 샘플레이트를 변환하는 부분에는 간단한 계산부터, 더 많은 연산으로 정확도를 높이는 무거운 것까지 여러 품질 단계가 있습니다. 어느 것을 쓰는지는 휴대전화의 설정으로 정해지며, 그 설정은 휴대전화 제조사가 정합니다.

제조사가 설정하지 않은 Android 5 이상의 휴대전화에서는 중간 단계인 DYN_MED를 사용합니다 (Android 4.4에서는 가장 간단한 단계인 LOW). 또 동시에 쓰이는 리샘플러의 예상 부하가 한도를 넘으면, 한도를 넘은 리샘플러는 한 단계 낮은 품질로 떨어집니다 (실제 CPU 부하는 측정하지 않습니다). 확인한 휴대전화 중 Android 4.4 휴대전화 2대는 값이 4 (VERY_HIGH)로 설정되어 있었고, Android 9 휴대전화 1대는 설정이 없어 DYN_MED를 사용했습니다. 즉 같은 곡이라도 휴대전화에 따라 리샘플링 품질이 다릅니다.

설정값단계변환 방법 (순정 Android)저지대역 감쇠 (설계)
1LOW이웃한 두 샘플 사이의 선형 보간. 가장 가벼운 방법. Android 4.4에서 설정이 없을 때 사용전용 필터 없음
2MED이웃한 여러 샘플에 걸친 3차 보간전용 필터 없음
3HIGHsinc 필터 사용소스에 명시되어 있지 않음
4VERY_HIGHHIGH보다 긴 필터 사용. 계수는 휴대전화의 구성 요소 (libaudio-resampler.so)에서 읽어 들이며, 없으면 HIGH와 같음소스에 명시되어 있지 않음
5DYN_LOW변환 비율에 맞춰 그때그때 필터를 만듦80 dB
6DYN_MED위와 같으며, DYN_LOW보다 긴 필터84 dB
7DYN_HIGH위와 같으며, 가장 긴 필터98 dB
설정 없음—Android 5 이상은 DYN_MED (Android 4.4는 LOW). 동시에 많이 쓰이면 한 단계 낮은 품질로 떨어짐84 dB
reTONE—휴대전화의 설정과 관계없이 독자적으로 설계. 20 kHz까지 평탄 (감쇠 목표는 출력 형식에 따라 다름)100 dB (16비트 출력)
120 dB (float 출력)

설정의 이름은 af.resampler.quality입니다. 표는 Android 13의 순정 Android 소스 코드를 바탕으로 했으며 (Android 4.4 항목은 Android 4.4의 소스 기준), 제조사가 수정했다면 해당하지 않을 수 있습니다. "저지대역 감쇠 (설계)"의 수치는 모두 필터 설계 목표입니다. reTONE은 모든 변환에서 계산값이 목표를 넘도록 설계했습니다.

reTONE이 변환을 맡는 곳에서는 이 설정과 관계없이 reTONE의 리샘플링을 사용합니다.

USB DAC의 음량

음량을 낮출 수 있는 곳은 세 군데입니다. 어느 곳을 쓰는지는 DAC의 구성과, 처음 연결할 때 무엇을 선택하는지에 따라 정해집니다.

reTONE 안디지털DAC의 디지털 음량USB로 제어DAC 본체노브나 버튼
USB로 음량을 제어할 수 있는 DAC최대로 보냄음량 키로 움직임—
"reTONE adjusts"를 선택했을 때음량 키로 움직임최대—
그렇지 않은 DAC음량 키로 움직임——
"On the DAC"를 선택했을 때최대로 보냄최대DAC에서 조절
자세히

음량을 낮출 수 있는 곳은 세 군데입니다: ① reTONE 안에서 데이터에 적용 (디지털), ② USB로 제어하는 DAC 내부의 디지털 음량, ③ DAC 본체의 노브나 버튼. 어느 쪽이 쓰이는지는 DAC를 처음 연결할 때 고른 조절 방법과, DAC가 USB로 음량 제어를 지원하는지에 따라 정해집니다.

② USB를 통한 음량: USB Audio Class에는 Feature Unit이라는 음량 구조가 있으며, GET RANGE로 최솟값, 최댓값, 단계의 크기 (1/256 dB 단위)를 읽습니다. reTONE은 자신의 음량 (Android의 단계와 미세 음량을 합친 하나의 게인)을 dB로 바꿉니다. 그것이 이 범위 안에 들어가면 reTONE은 그 값을 DAC에 보내고 자신의 출력은 최대로 유지합니다. 음량이 범위보다 낮아질 때만, 모자라는 만큼을 ①로 PCM에 적용합니다. 0은 음소거입니다.

① reTONE 안: Feature Unit 음량이 없는 DAC와 "reTONE adjusts"로 설정한 DAC에서는 reTONE이 보내기 전에 데이터에 음량을 적용하며, 변경마다 약 5 ms에 걸쳐 변화시킵니다. 보내기 직전에 적용하므로 음량 키가 바로 반응합니다.

③ DAC 본체: DAC 본체에 음량 조절 기능이 있는지는 USB로 읽을 수 없습니다. 그래서 DAC를 처음 연결하면 reTONE이 DAC의 음량을 어떻게 조절할지 한 번 묻습니다. 선택지는 "On the DAC itself", "Volume keys (DAC adjusts)", "Volume keys (reTONE adjusts)"의 세 가지입니다. 일부 DAC는 음량 명령을 받아들였다고 응답하면서 실제로는 음량을 바꾸지 않습니다. 그런 DAC에서는 "reTONE adjusts"를 선택하면 DAC의 음량을 최대로 고정하고 ①로 낮춥니다. "On the DAC"를 선택하면 ②와 ① 모두 최대로 고정되고, 음량 키를 눌러도 아무것도 바뀌지 않습니다 (메시지로 알려 줍니다). 아날로그 음량 조절이 있는 DAC에서는 디지털 감쇠를 피하면 DAC의 성능을 최대한 끌어낼 수 있습니다. 선택은 DAC 모델 (USB 벤더 ID와 제품 ID)마다 기억되며, "DAC volume" 설정으로 바꿀 수 있습니다.

"On the DAC"를 선택했을 때나 DAC의 음량을 사용할 때 (DAC의 음량 범위 안에서)는, DAC가 지원하는 레이트의 곡을 데이터를 바꾸지 않고 보냅니다. 음량을 DAC의 범위보다 낮게 설정할 때만 reTONE이 부족한 만큼을 적용합니다. 이 경우, 곡이 무손실 (네이티브 DSD 포함)이고 비트 심도가 DAC의 것 안에 들어가면 신호 경로 화면에 BIT-PERFECT가 표시됩니다 (32비트 정수 곡은 정수 경로를 거칠 때만). DAC 내부에서 일어나는 일은 확인할 수 없습니다.

네이티브 DSD

DSF/DFF 곡
DAC가 네이티브 DSD를 지원
그리고 음량을 USB로 제어할 수 있음
그리고 음량이 "reTONE adjusts"로 설정되어 있지 않음
그리고 "Sending DSD"가 "Send as DSD"로 설정됨
예Send as DSD예: DSD64 → USB AUDIO • DSD64 DIRECT
아니요Convert to PCMDSD64는 88.2 kHz PCM

reTONE은 DSD 자체의 음량을 바꿀 수 없으므로, DAC가 음량 제어를 허용해야 합니다. DSD 곡이 끊기면 "Sending DSD" 설정에서 "Convert to PCM"을 선택하십시오. DoP는 지원하지 않습니다.

자세히

DSF와 DFF 곡은 DAC가 네이티브 DSD를 지원하고 음량을 USB로 제어할 수 있을 때만 (그리고 DAC가 "reTONE adjusts"로 설정되어 있지 않을 때) PCM으로 변환하지 않고 DSD 그대로 보냅니다. reTONE은 DSD 자체의 음량을 바꿀 수 없으므로 DAC 쪽의 음량 제어가 필요합니다. 플레이어 화면에는 "DSD64 → USB AUDIO • DSD64 DIRECT."처럼 표시됩니다.

다음과 같이 보냅니다.

  • 네이티브 DSD는 USB 디스크립터에 raw 데이터용 대체 설정 (TYPE I RAW DATA)이 있는 DAC에서 동작합니다.
  • DSD 비트는 채널마다 4바이트씩 32비트 워드에 담으며, 가장 오래된 비트가 맨 위에 옵니다. DSF는 비트를 LSB부터 저장하므로, 담기 전에 각 바이트 안의 비트 순서를 뒤집습니다. 워드는 빅 엔디언으로 보냅니다 (Linux의 DSD_U32_BE와 같은 가정). 이 재배열은 C로 처리하며, 전송용 링 버퍼는 약 500 ms 분량을 담습니다.
  • DAC의 클록은 "DSD 레이트 ÷ 32"로 설정합니다 (DSD64는 88.2 kHz, DSD128은 176.4 kHz).
  • 무음, 일시정지, 곡의 끝은 DSD의 무음 패턴 0x69로 채웁니다.

이 바이트 순서와 비트 순서는 테스트한 DAC에서 올바르게 재생되는 것으로 확인했습니다. 다른 DAC에서는 아직 확인하지 않았으며, DoP (DSD over PCM)는 지원하지 않습니다. DST 압축 DFF도 읽을 수 없습니다.

Sending DSD (설정): "Sending DSD"는 네이티브 DSD를 쓸 수 있는 DAC가 연결되어 있는 동안에만 설정의 "Sound" 아래에 나타납니다. 기본값은 "Send as DSD" (DAC가 DSD를 직접 재생)이며, "Convert to PCM" (reTONE이 PCM으로 변환)으로 바꿀 수 있습니다. DSD 곡이 끊기거나 PCM 재생을 선호한다면 PCM으로 변환하도록 선택하십시오. 선택은 DAC 모델마다 기억되며, 바꾸면 현재 곡을 같은 위치에서 다시 엽니다. 변조가 50% 기준 레벨을 넘는 DSD 음원에서 잠깐 끊기는 DAC가 있었습니다. 전송은 정상이었으므로 DAC의 설계 때문인 것으로 보입니다. 이런 경우에도 PCM으로 변환하면 끊김을 막을 수 있습니다.

DSD → PCM 변환: 네이티브 DSD를 쓰지 않을 때 (조건에 맞지 않는 DAC, "Convert to PCM"을 선택했을 때, 그리고 Bluetooth, 이어폰, 스피커로 출력할 때) reTONE은 DSD를 두 단계로 PCM으로 변환합니다.

  • 1단계: DSD 비트스트림을 32배, 64배 등으로 데시메이션해 약 88.2 kHz 이상의 PCM으로 만듭니다 (DSD64는 32배로 88.2 kHz, DSD128은 64배로 88.2 kHz). 필터는 카이저 창 FIR 필터입니다. 통과대역은 20 kHz와 출력 레이트의 4분의 1 중 큰 쪽까지, 저지대역은 "출력 레이트 − 통과대역"에서 시작하며, 감쇠는 16비트 출력에서 100 dB, float와 USB에서 110 dB입니다. 탭 수는 카이저 창의 식으로 정합니다. 계산에는 16비트 테이블 조회를 쓰며, 테이블은 구성마다 한 번 만들어 재사용합니다. 측정에서 20 kHz의 응답은 0.000 dB, 20 kHz 아래의 에일리어싱은 −101 dB (100 dB 설계) / −110~−117 dB (110 dB 설계)였습니다.
  • 2단계: 필요하면 필터 항목에서 설명한 것과 같은 리샘플러로 휴대전화의 출력 레이트 (44.1 kHz나 48 kHz의 내장 출력 등)로 한 번 변환합니다.
  • 레벨: SACD의 0 dB (50% 변조)가 −6 dBFS가 되도록 변환합니다 (일반적인 관례. 0.69.0부터. 이전 버전은 −12 dBFS를 사용해 6 dB 작게 재생되었습니다).

USB DAC로 PCM을 보낼 때, DAC가 지원하면 reTONE은 2단계의 변환 없이 "DSD 레이트 ÷ 32" (DSD64는 88.2 kHz, DSD128은 176.4 kHz, DSD256은 352.8 kHz)의 PCM을 그대로 보냅니다. DSD를 PCM으로 변환하므로 이 경우에는 DIRECT를 표시하지 않습니다.

부하

2012년 테스트 폰 (Android 4.1, 2코어)에서 코어 하나에 대한 reTONE의 CPU 사용률.

플레이어 화면 다시 그리기 (실제 재생 중)약 2%
CD 음원을 그대로 출력 (최대 클록)약 2%
24비트/192 kHz를 44.1 kHz로 변환 (최대 클록)약 10%
0%50%100%

"플레이어 화면 다시 그리기"는 실제 재생 중에 측정했으며 디코딩은 포함하지 않습니다. 나머지 둘은 reTONE 엔진과 같은 계산을 최대 클록으로 돌려 실시간 대비 비율로 환산한 값입니다. 실제 재생 중에는 휴대전화가 클록을 낮추므로, 휴대전화에 표시되는 수치는 2~3배 높아 보입니다.

자세히

reTONE은 "멈춰 있을 때는 아무것도 하지 않기"와 "화면이 꺼진 채 재생할 때는 아무것도 그리지 않기"를 목표로 합니다. 주기적인 작업은 재생 중에만 동작합니다. 화면이 켜져 있으면 1초마다, 꺼져 있으면 5초마다이며, 플레이어 화면의 탐색 막대는 250 ms마다 자기 자신만 다시 그립니다. 시계와 배터리는 폴링 없이 시스템의 알림으로 갱신합니다.

2012년 테스트 폰 (Android 4.1, 2코어 Cortex-A9)에서 코어 하나에 대한 reTONE의 CPU 사용률.

  • 정지 중: 0%.
  • 화면이 꺼진 채 재생: 그리기가 멈춥니다. Android의 표준 재생으로 재생하는 곡은 거의 0%이며, reTONE 엔진이 재생하는 곡 (Android 4.x의 FLAC, WAV 등)은 아래의 디코딩과 변환 부하가 더해집니다.
  • 플레이어 화면을 표시한 채 재생: 약 2% (실제 재생 중에 측정. 대부분 탐색 막대 다시 그리기이며 디코딩은 포함하지 않음).
  • reTONE 엔진이 CD 음원 (16비트/44.1 kHz)을 44.1 kHz 그대로 출력: 약 2%. 48 kHz로 변환해 출력: 약 4%.
  • 24비트/96 kHz를 48 kHz로 변환: 약 5%. 44.1 kHz로: 약 7%.
  • 24비트/192 kHz를 44.1 kHz로 변환: 약 10% (계산만) ~ 약 15% (최대 클록으로 환산한 전체 재생 부하의 대략적인 추정).
  • 24비트/192 kHz를 변환 없이 USB DAC로 보내기: 약 20% (실제 재생 중, 화면 켜짐, 전송 스레드 포함으로 측정).

"CD 음원"부터 "24비트/192 kHz"까지의 엔진 수치는 같은 계산을 최대 클록에서 전속력으로 돌려 실시간 대비 비율로 환산한 것입니다. 실제 재생 중에는 휴대전화가 클록을 200 MHz~1 GHz로 낮추므로, 휴대전화에 표시되는 수치는 2~3배 높아 보입니다 (24비트/192 kHz에서 20~29%). 코드를 어떻게 쓰는지도 큰 차이를 만듭니다. 지금의 C와 NEON 구현은 예전에 Java로 쓴 시제품에 비해 부하가 약 3분의 1에서 5분의 1이었습니다.

DSD에서 PCM으로의 변환은, 그 2012년 휴대전화와 배터리로 동작하는 DAC로 DSD64를 88.2 kHz PCM으로 변환해 USB로 보냈을 때 변환에 약 11.8%, USB 전송에 약 5.8% (약 1 GHz에서)가 들었습니다. Android 4.4 휴대전화의 내장 출력 (48 kHz)으로 DSD64를 재생했을 때 디코딩 스레드는 23.8%를 썼지만, 휴대전화가 클록을 최저인 300 MHz로 유지했으므로 클록 비율로 단순 환산하면 최대 클록에서 약 3%입니다.

테스트한 휴대전화에서는 화면이 켜져 있는 동안의 부하가 CPU 속도보다 화면 해상도에 더 크게 좌우되었습니다 (Android 4.x는 작은 갱신에도 화면 전체를 다시 그리는 것으로 보입니다). 1080 × 1920 휴대전화는 플레이어 화면에서 약 4%, Android 11을 쓰는 1440 × 3120 휴대전화는 약 8.5% (8코어 중 하나에 대해. 휴대전화 전체로는 약 1%)를 썼습니다. 오래된 휴대전화는 화면이 작고 고해상도 휴대전화는 처리 능력이 높으므로, 지금은 모든 휴대전화에서 다시 그리는 빈도가 같습니다.

테스트한 기기

휴대전화Android확인한 내용
WalkmanSony NW-Z1000 시리즈4.0.4실행, 화면
PRADA phone by LGLG L-02D4.0.4실행, 라이브러리, 24비트/96 kHz FLAC 재생
MEDIAS XNEC N-07D4.0.4실행
MEDIAS ESNEC N-05D4.0.4실행
Xperia PSony LT22i4.1.2주요 기능, 실사용
Xperia goSony ST27i4.1.2주요 기능 (320×480 화면), DSD 재생, USB DAC (배터리로 동작하는 DAC)
AQUOS PHONE ZETASHARP SH-02E4.1.2주요 기능, 실사용
Xperia VLSony SOL214.1.2실행, 라이브러리, 재생(ALAC, 디엠퍼시스 보정, 세밀한 음량 조절)
Acoustic Research AR-M204.3실행, 24비트/96 kHz FLAC 재생
AQUOS CRYSTALSHARP 305SH4.4.2주요 기능, 실사용
URBANO L03KYOCERA KYY234.4.2주요 기능, 실사용
라쿠라쿠 스마트폰FUJITSU F-06F4.4.2실행, 라이브러리, 24비트/96 kHz FLAC 재생 (reTONE을 홈 화면으로 설정할 수 없음)
KYOCERA KCP01K4.4.4실행
Xperia Z4 TabletSony SOT315.0.2주요 기능, 실사용
VAIO Phone AVAIO VPA0516.0.1실행, 재생
Nexus 6Motorola Nexus 67.1.1실행
Xperia XA1 PlusSony G32268.0실행, 라이브러리, 24비트/192kHz FLAC 재생, Sound settings(소니의 사운드 설정이 열림)
Galaxy S7 edgeSamsung SC-02H8.0실행, 라이브러리, 재생
Galaxy S8Samsung SC-02J9주요 기능, 실사용
Xperia XZ1Sony G83419주요 기능, 실사용
Android One X5LG X5-LG11주요 기능, 실사용
Galaxy A41Samsung SC-41A12실행, 라이브러리, 재생
Pixel 3 XLGoogle Pixel 3 XL12실행, 라이브러리, 재생, 알림의 조작, 리모컨
Xperia 5 IVSony A204SO14Google Play에서 설치, 재생, 다이렉트 출력 표시
Xiaomi 12S UltraXiaomi 2203121C15주요 기능, 실사용
Galaxy Z Fold5 현장 테스트Samsung Galaxy Z Fold516실행, 폴더블 레이아웃
Pixel 10a 현장 테스트Google Pixel 10a17실행
Pixel 11 Pro Fold 현장 테스트Google Pixel 11 Pro Fold17실행, 폴더블 레이아웃

현장 테스트 자원봉사자분들이 자신의 휴대전화에서 reTONE을 테스트한 결과입니다.

USB DAC 다이렉트 출력: 시험한 조합

휴대전화USB DAC결과
Galaxy S8Android 9Hidizs S9 Pro버스 파워동작함. PCM (DAC가 44.1~768 kHz를 지원한다고 보고. 44.1~192 kHz 곡으로 테스트), 네이티브 DSD, DAC 음량
Galaxy S8Android 9OPPO HA-2배터리 구동동작함
AQUOS PHONE ZETA SH-02EAndroid 4.1OPPO HA-2배터리 구동동작함. 24비트/96 kHz를 리샘플링 없이 재생
AQUOS PHONE ZETA SH-02EAndroid 4.1Hidizs S9 Pro버스 파워동작함. 속도 어긋남이나 끊김 없음
Android One X5Android 11Hidizs S9 Pro버스 파워동작함
Xperia PAndroid 4.1OPPO HA-2배터리 구동동작함. 24비트/192 kHz와 96 kHz를 리샘플링 없이 재생
Xperia PAndroid 4.1Hidizs S9 Pro버스 파워인식되지 않음. 휴대전화가 충분한 전력을 공급하지 못함
URBANO L03Android 4.4OPPO HA-2배터리 구동동작하지 않음. Android는 USB 호스트 지원을 보고하지만, 휴대전화가 OTG에서 호스트로 동작하지 않음
AQUOS CRYSTAL 305SHAndroid 4.4—동작하지 않음. USB 호스트 지원 없음
Xperia goAndroid 4.1OPPO HA-2배터리 구동동작함
Xperia goAndroid 4.1Hidizs S9 Pro버스 파워인식되지 않음. 휴대전화가 충분한 전력을 공급하지 못함
Galaxy A41Android 12Hidizs S9 Pro버스 파워동작함. 24비트/192 kHz와 44.1 kHz 사이의 전환을 포함해 끊김 없음
Xperia XA1 PlusAndroid 8.0Hidizs S9 Pro버스 파워동작함

USB DAC와 휴대전화: 결과가 다른 이유

USB DAC 다이렉트 출력이 어떻게 동작하는지는 휴대전화와 DAC에 따라 다릅니다. 휴대전화에서 USB 호스트 역할을 하는 부분 (호스트 컨트롤러)은 시대와 제조사마다 다르며, 그 차이는 오디오가 끊김 없이 일정한 속도로 흘러야 하는 아이소크로너스 전송에서 가장 두드러집니다. DAC도 다릅니다. 얼마나 자주 오디오를 받는지, 원하는 레이트를 어떻게 알리는지, 전원을 어디서 얻는지. reTONE은 휴대전화 기종에 따라 분기하지 않습니다. 연결했을 때 실제로 일어나는 일을 측정해 맞춥니다. 아래 표에서 musb, EHCI, xHCI는 실제 휴대전화로 테스트했으며, 나머지는 공개된 문서를 바탕으로 했습니다.

컨트롤러 계열흔한 문제reTONE이 하는 일
musb2010~2013년 무렵의 일부 휴대전화 (TI, ST-Ericsson, 오래된 MediaTek)전송 사이의 틈 때문에 DAC가 받는 데이터가 조금 모자람 (지직거림, 끊김)실제로 돌아오는 간격을 측정해, 모자라는 만큼 데이터를 더 담음
EHCI오래된 Qualcomm, Tegra, 일부 Exynos완료 통지가 몰려서 돌아오고, 뒤처지면 일부 데이터를 건너뜀장기 평균으로 판단
DWC2오래된 Rockchip, 일부 Kirin·Amlogic 태블릿4바이트에 정렬되지 않은 데이터가 노이즈를 일으킬 수 있음32비트 (4바이트) 형식을 우선
xHCIUSB-C 휴대전화의 거의 전부 (2015년 무렵부터)완료 통지가 몰려서 돌아오고, 지연되면 데이터를 건너뜀장기 평균으로 판단하고, 충분한 데이터를 앞서 대기열에 쌓아 둠
MediaTek xHCI최근의 MediaTek 휴대전화대역폭 할당이 엄격해 높은 샘플레이트를 거부할 수 있음거부된 레이트는 reTONE이 DAC가 받아들이는 한 단계 낮은 레이트로 변환합니다 (0.92.68부터. 실제 휴대전화에서 거부된 사례는 아직 보지 못했습니다)
  • 서비스 간격: 대부분의 DAC는 0.125 ms마다 오디오를 받고, 일부는 0.25 ms나 1 ms마다 받습니다. reTONE은 그에 맞춰 각 패킷의 크기를 정합니다.
  • 레이트 피드백: 대부분의 DAC는 휴대전화에 보내는 속도를 알려 줍니다 (비동기 모드). 이 보고의 형식은 기기마다 다릅니다. reTONE은 이런 형식의 대부분을 자동으로 판별해 맞춥니다 (0.88.0 이후). 피드백이 없이 휴대전화의 레이트를 따르는 DAC도 있습니다 (어댑티브 모드). 녹음 스트림으로 레이트를 알리는 일부 비동기 DAC (암묵적 피드백)는 아직 지원하지 않습니다.
  • 전원: 자체 배터리나 전원을 가진 DAC도 있습니다. 버스 파워 DAC는 휴대전화의 전력만으로 동작하므로, 충분한 전력을 공급하지 못하는 오래된 휴대전화에서는 인식되지 않을 수 있습니다. 배터리로 동작하는 DAC라도 휴대전화에서 충전되어 휴대전화의 배터리를 더 빨리 닳게 할 수 있습니다.
  • DSD: 네이티브 DSD를 받는 DAC는 대부분 같은 배치 (32비트, 빅 엔디언)를 쓰지만, 예외도 있습니다.

제조사의 사운드 설정

하단 메뉴의 "Sound"는 휴대전화에 제조사의 사운드 설정 화면이 있으면 그것을, 없으면 Android의 사운드 설정을 엽니다. 어느 화면을 열지는 "Sound settings" 설정에서 고를 수 있습니다.

휴대전화열리는 화면
SHARP AQUOS CRYSTAL 305SHHarman Clari-Fi/LiveStage
KYOCERA URBANO L03 (KYY23)Dolby
Sony Xperia P음향 효과 (이퀄라이저, ClearBass, VPT, xLOUD 등)
LG Android One X5음질과 효과 (Hi-Fi Quad DAC, 디지털 필터, DTS:X 등)
Samsung Galaxy S8SoundAlive
Sony Xperia XA1 PlusSony의 사운드 설정

제조사의 설정이 reTONE의 재생에 적용되는지는 휴대전화에 따라 다릅니다.

하지 않는 것

  • 이퀄라이저, 크로스페이드, 파형 표시는 없습니다. reTONE은 가벼움을 우선하며 소리에 효과를 적용하지 않습니다. ReplayGain (태그에 저장된 값으로 음량 차이를 맞추는 기능)은 사용할 수 있습니다. 기본값은 꺼짐이며, 파일을 고쳐 쓰지 않고 재생 음량만 낮춥니다.
  • reTONE은 스트림을 직접 재생하지 않습니다. 역할은 스트리밍 앱을 여는 데까지이며, 재생과 그 음질은 해당 앱과 휴대전화에 따라 다릅니다.
  • 기본 상태에서 reTONE은 네트워크를 전혀 사용하지 않습니다. 설정에서 Network features를 켰을 때만 연결하며, 그때도 사용자가 요청했을 때나 사용자가 선택한 확인을 위해서만 연결합니다. 공유가 켜져 있는 동안에는 사용자가 허용한 휴대전화의 연결도 받습니다. 사용자에 관한 데이터는 수집하지 않습니다.
  • Android Auto나 Wear OS에서의 조작은 지원하지 않습니다. (알림, Android의 잠금 화면, Bluetooth 기기에서의 재생 조작은 0.87.0부터 지원합니다.)
  • reTONE 엔진은 DST 압축 DFF, APE, WMA Lossless를 재생할 수 없으며, 지원할 계획도 없습니다. FLAC 같은 형식으로 변환해 주십시오.
  • Android 3.x 이하에서는 동작하지 않습니다.
  • USB 호스트 (OTG)를 지원하지 않는 휴대전화에서는 USB DAC 다이렉트 출력을 사용할 수 없습니다. "USB DAC direct output" 설정이 흐리게 표시되고, "This device does not support USB devices." 메시지가 나타납니다.
  • USB DAC 다이렉트 출력으로 테스트한 휴대전화와 DAC의 조합은 한정되어 있습니다. 다른 휴대전화나 DAC에서 동작하는지는 확인하지 않았습니다. Android에는 USB 호스트 지원을 보고하면서도 OTG에서 호스트로 동작하지 못하는 휴대전화도 있습니다. 테스트한 조합은 "USB DAC 다이렉트 출력: 시험한 조합"에 실려 있습니다.
  • DoP는 지원하지 않습니다. 네이티브 DSD에는 네이티브 DSD를 지원하고 USB로 음량을 제어할 수 있는 DAC가 필요합니다. 그 밖의 DAC에서는 DSD를 PCM으로 변환한 뒤 보냅니다.
  • USB DAC 다이렉트 출력을 사용하는 동안 다른 앱의 소리는 USB DAC로 재생되지 않습니다. 휴대전화의 스피커에서 재생됩니다.
  • 내장 스피커나 이어폰 단자에서는 휴대전화가 실제로 오디오를 어떻게 출력하는지 앱이 확인할 방법이 없으므로, 비트 퍼펙트 출력을 보증할 수 없습니다. USB DAC에서는 조건이 갖춰졌을 때만 BIT-PERFECT가 표시됩니다.
  • reTONE은 휴대전화 내장 DAC로 가는 오디오 경로를 바꾸지 않습니다 (샘플레이트 변환을 우회하거나 오프로드 재생을 강제하는 등). root나 휴대전화 제조사의 서명이 필요하기 때문입니다.
  • 화면이 꺼진 상태에서 음량 키를 길게 눌러 연속으로 바꾸거나 음량 키로 곡을 넘기는 기능은 지원하지 않습니다. Android가 키를 앱에 전달하지 않기 때문입니다.
  • 태그 편집과 파일 삭제·이동은 지원하지 않습니다.
  • Android 10 이상에서는 USB 플래시 드라이브에 있는 FLAC, MP3 등의 곡이 라이브러리에 나타나지 않습니다. Android가 목록에 올리지 않기 때문입니다.
  • 녹음 스트림으로 레이트를 알리는 일부 비동기 USB DAC (암묵적 피드백)는 지원하지 않습니다. 수십 초에서 수 분마다 소리가 끊길 수 있습니다.
  • Android 4.0에서는 MP3, AAC처럼 Android가 재생하는 포맷의 곡 사이에 짧은 틈이 생깁니다 (reTONE의 엔진이 재생하는 포맷은 4.0에서도 끊김이 없습니다).