reTONE
下載免費 · Android 4.0 以上

reTONE App 目前提供英文與日文版本,未來也預計支援其他語言。

技術筆記

規格、轉換與輸出的運作方式、測試過的手機等細節。 本頁接續功能頁面。

主要規格

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 混音器的路徑上,取樣率與輸出不同、或位元深度超過 16 bit 的 FLAC、WAV 與 ALAC(可用「Conversion by reTONE」設定關閉)
取樣率轉換Kaiser 窗 FIR 濾波器(多相)。20 kHz 以下在 ±0.001 dB 以內(設計值;適用於 44.1 kHz 以上取樣率之間的轉換)
引擎交給 Android 的格式Android 5 以上為 32-bit float,4.x 為 16-bit(僅對 16 bit 無法精確表示的值加入抖動)。手機輸出端的位元深度取決於手機
USB DACUSB Audio Class 2。也支援 Class 1(實際測試有限)。取樣率在 DAC 支援範圍內、且手機能傳送的曲目,會不經重新取樣直接送出。優先使用 32-bit 容器(沒有時用 24-bit 或 16-bit)。特定條件下可原生 DSD
簽署所有發布的版本都以同一把金鑰簽署

支援的格式

手機上的 Android 能播放的格式,會以手機的解碼器與音效處理播放。DSD、AIFF,以及 Android 無法讀取的高解析 FLAC 與 WAV,則由 reTONE 的引擎播放。

由 Android 播放FLAC、AAC、MP3、Ogg Vorbis、WAV、Opus 等
由 reTONE 引擎播放DSD(DSF、DFF)、AIFF、32-bit 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 等未壓縮曲目,無論用哪個 App 播放,只要解碼器寫得正確,都會完全還原成原始資料。可能改變聲音的,是解碼之後的處理(下列三個步驟,再加上手機的音效)。

取樣率轉換

許多 Android 手機會把輸出固定在 48 kHz 等取樣率。CD 音訊或高解析音訊等取樣率不同的曲目,每次播放都會被重新取樣。這項轉換的品質因手機而異。

位元深度截斷

在較舊的 Android 版本上,24-bit 曲目會被截斷為 16 bit。

音量計算與混音器

音量計算以及與其他 App 聲音的混音,也都在輸出前一刻進行。

reTONE 處理的正是這個部分。需要轉換時由 reTONE 自己轉換,能避免時就不轉換。使用 USB DAC 時,音訊不經過 Android 的音訊處理就送到 DAC。符合條件的 USB DAC(請見下方「USB DAC 的音量」),在播放畫面開啟的訊號路徑畫面中會顯示 BIT-PERFECT。使用內建喇叭或耳機孔時,沒有辦法確認手機在 Android 之後如何處理音訊,因此我們無法保證輸出是位元完美(bit-perfect)。

取樣率轉換因手機而異

Android 在播放前,會把所有音訊統一成手機的輸出取樣率。這個取樣率因手機而異:多數為 48 kHz,但也有 44.1 kHz 的。因此同一首曲目,在某支手機上會被轉換,在另一支手機上則維持原樣。

曲目的取樣率手機輸出 44.1 kHz手機輸出 48 kHz
44.1 kHz(CD 等)不轉換轉換為 48 kHz
48 kHz轉換為 44.1 kHz不轉換
88.2、96、192 kHz轉換為 44.1 kHz轉換為 48 kHz

我們確認過的例子:Sony Xperia P 與 Xperia go 輸出 44.1 kHz;SHARP AQUOS CRYSTAL 305SH、KYOCERA URBANO L03(KYY23)、Raku-Raku Smartphone F-06F 與 Samsung Galaxy S8 輸出 48 kHz。有些手機兩種取樣率都支援,但實際使用哪一種,取決於手機的設計。

Android 自身轉換的品質也取決於手機的設定。在我們確認過的手機中,Android 4.4 的 KYY23 與 305SH 設定為最高品質,而 Android 9 的 Galaxy S8 沒有設定,使用標準的中等品質(負載高時會再降低)。對於由 reTONE 自家引擎播放的曲目,當轉換無法避免時,reTONE 不交給 Android:它會自己只轉換一次,並以恰好等於手機輸出取樣率的音訊交出。

以下情況可以避免 Android 的轉換:曲目本來就與手機的輸出取樣率相同時、支援直接輸出的 Android 10 以上手機,以及使用 USB DAC 時。另外,包括部分 DAP 在內,有些裝置在韌體層級就設計成完全不轉換。

在 Android 輸出之後,手機的音訊晶片內部是否會再次轉換,App 無從得知。reTONE 顯示的輸出取樣率是 Android 回報的值。你可以在播放畫面的最下方以及「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 重新取樣(僅在需要時) Android接收 16-bit,不轉換 喇叭 / 耳機
Android 5 以上經過混音器的路徑。DSD、AIFF,以及需要轉換的 FLAC/WAV/ALAC
曲目檔案 reTONE 引擎代替 Android 重新取樣 Android接收 float,不做取樣率轉換(16-bit 輸出的手機會在此降為 16 bit) 喇叭 / 耳機
Android 10 以上支援直接輸出的手機
曲目檔案 reTONE把 16-bit 無損音訊重新封裝為 24-bit Android直接輸出 喇叭 / 耳機之後的處理取決於手機
USB DAC透過 OTG 連接(所有曲目)
曲目檔案 reTONEDAC 支援的取樣率原樣送出,其他則重新取樣略過 Android USB DAC

由 reTONE 處理由 Android 處理

取樣率與手機輸出相同的曲目不需要轉換,因此即使用 Android 的標準播放也不會轉換。MP3、AAC 等不經過 reTONE 引擎的格式,使用 Android 的標準播放;若取樣率與手機輸出不同,Android 會將其重新取樣(透過 USB DAC 播放時,這些格式也由 reTONE 送出)。即使在 Android 10 以上,DSD 與 AIFF 也由 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 的混音器內被重新取樣。App 無法阻止這項轉換。4.x 的標準解碼器還可能把 24-bit FLAC 降為 16 bit,或無法開啟 192 kHz 的 FLAC。因此在 4.x 上,reTONE 的引擎會讀取所有 FLAC 與 WAV,以及 DSF、DFF 和 AIFF,只轉換一次成手機的輸出取樣率(AudioTrack.getNativeOutputSampleRate 的值),並以 16-bit 交給 Android。Android 的混音器會原樣接收相同取樣率的 16-bit 音訊,所以 Android 端不會發生取樣率轉換。降為 16 bit 時,16 bit 能精確表示的值(例如未經轉換而直通的 CD 音質)會原封不動交出;其他情況下,reTONE 會套用 TPDF 抖動,而當輸出為 44.1 kHz 或 48 kHz 時,會使用誤差回饋的雜訊整形(Lipshitz、Vanderkooy 與 Wannamaker 的 5 階 E 加權濾波器),把量化雜訊移到較不易聽見的頻率。發生削波時,回饋的誤差會限制在 ±4 LSB,以避免振盪。係數是為 44.1 kHz 設計的,在 48 kHz 也沿用。雜訊的總量會增加,但被移到耳朵較不敏感的高頻。不過,如果你把 Android 的音量設得低於最大,Android 的混音器會在套用音量後再次捨入成 16 bit,雜訊整形的效果因此減弱。以硬體調整音量的手機則不受此影響。無論如何都不會發生取樣率轉換。MP3、AAC 等格式即使在 4.x 上,也走 Android 的標準路徑播放。

Android 5 以上(經過混音器的路徑):在 Android 10 以上,不使用直接輸出的路徑也屬於這一類。這個世代的 Android 混音器能接收 float,所以 reTONE 的引擎會不加抖動,直接把 float 音訊交給 AudioTrack。在 16-bit 輸出的手機上,Android 接著會把它捨入成 16 bit(Android 在這個階段不會加入抖動)。取樣率與手機輸出取樣率不同的 FLAC、WAV 與 ALAC 曲目,若直接交出去,會被 Android 的混音器重新取樣,而超過 16 bit 的曲目會被截斷成 16 bit。AOSP 的預設重新取樣器在未設定品質選項(af.resampler.quality)時,使用中等動態品質(DYN_MED);當同時使用中的重新取樣器的預估負載超過上限時,還會降到更低的品質。在我們檢查的手機上,這個選項並未設定。reTONE 的引擎只重新取樣符合這些條件的曲目,你可以用「Conversion by reTONE」設定關閉它。取樣率與手機輸出取樣率相同的 16-bit 曲目(例如 44.1 kHz 手機上的 CD 音質)不需要轉換,因此走 Android 的標準路徑播放。

直接輸出(Android 10 以上;是否可用取決於手機):「直接輸出」是不經混音器、以曲目的取樣率送出音訊,「卸載(offload)」則是在晶片上解碼壓縮音訊,兩者是否可用取決於手機與輸出。在 Android 10 以上,App 可以用 AudioTrack.isDirectPlaybackSupported 詢問手機,某個格式、取樣率與位元深度能否直接輸出到目前的輸出。只有在手機回答可以、且手機的音訊策略確實把 PCM 導向直接輸出時,reTONE 才使用這條路徑,否則就走 Android 的標準路徑播放。答案會因輸出而異,所以每次插拔耳機或 USB 時,reTONE 都會重新詢問。在音訊策略把 PCM 導向直接輸出的手機上,無法直接輸出的主要是 44.1、48 與 88.2 kHz 的 16-bit PCM(CD 音質就屬於這一組)。24-bit 與 float 可以用曲目的取樣率直接輸出,MP3 與 AAC(60 秒以上的曲目)則走卸載。因此,reTONE 會把 16-bit 無損音訊(FLAC、ALAC、WAV)解碼成 PCM(手機沒有 ALAC 解碼器時,由 reTONE 自己的解碼器處理 ALAC),再透過 MediaDataSource 以低 8 位元補 0 的 24-bit WAV 交給 MediaPlayer。高 16 位元完全不變。切換之前,它會實際解碼第一個區塊,確認真的輸出了 16-bit PCM,無法確認時就退回標準路徑。24-bit 與高取樣率的無損音訊,以及 MP3 和 AAC,本來就會走直接輸出或卸載,所以原樣交出。App 無法讀取手機實際使用了哪一個輸出,因此播放畫面上的「DIRECT」是一種預期。reTONE 過去只依賴手機的回答,但原生 Android 即使回答可以,仍可能把 PCM 送進混音器,也有些手機在音訊其實不是直接輸出時顯示了 DIRECT。自 0.92.48 起,reTONE 也會檢查手機的音訊策略。自 0.90.1 起,「DIRECT」只在無損曲目上顯示,透過 Bluetooth 時絕不顯示。使用卸載時,我們同樣無法確認取樣率是否在晶片內改變。在這條路徑上,Android 端的音效不會套用(有些手機的音效在晶片內運作),而 DAC 的硬體設定(例如濾波器)仍然有效。可以在設定中開啟或關閉。

直接輸出到 USB DAC:把 USB DAC 連接到支援 USB 主機功能(OTG)的手機時,reTONE 會不經過 Android 的音訊路徑,直接把資料送到 DAC。在我們確認過的手機上,Android 的標準路徑會把送往 USB DAC 的音訊轉換為 16-bit/48 kHz(雖然也開啟了 32-bit/192 kHz 的輸出,但沒有用於音樂)。reTONE 的直接輸出運作方式如下。

  • reTONE 使用手機的 USB 主機 API 找到 DAC、取得你的許可,並讀取 USB 描述符(USB Audio Class 2.0:時脈 ID、播放介面的替代設定、輸出端點與回饋端點;Class 1.0:每個替代設定的取樣率與封包大小)。
  • 它從 Android 的驅動程式接管 DAC(claimInterface),並優先選擇 PCM、2 聲道、32-bit 的替代設定(不支援時為 24-bit 或 16-bit)。
  • 它以時脈來源的 GET RANGE 讀取支援的取樣率。如果曲目的取樣率在範圍內,就用 SET CUR 設定,並用 GET CUR 確認。只有取樣率不受支援、或手機的 USB 拒絕傳送的取樣率(自 0.92.68 起)的曲目,才會由 reTONE 重新取樣一次,轉成 DAC 接受的取樣率。取樣率在 DAC 支援範圍內的曲目,不做取樣率轉換,也不加抖動。最高 24 bit 的曲目,是把原始資料原封不動放在 32-bit 字的高位元後送出(使用 DAC 的音量,或在 DAC 本身調整音量時)。32-bit 整數曲目也走保持整數的路徑(自 0.92.65 起)。只有 DAC 的位元深度無法精確表示的值才會被捨入;DAC 為 24 bit 以下時,會加入 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 會暫停播放。當其他 App 開始播放時,reTONE 會暫停,並把 DAC 交還給 Android;你再次在 reTONE 中播放時,它會重新取回。如果 DAC 沒有被交還給 Android(例如強制停止之後),reTONE 會在更新後立刻交還,也會在你於「USB DAC direct output」關閉的狀態下開啟 reTONE 時交還。

許多 Android 4.1 世代的手機無法把 USB DAC 當作音訊輸出,但 reTONE 的直接輸出只使用 USB 主機功能,所以仍然可以送出音訊。在我們 2012 年的測試手機(Android 4.1)和自備電池的 DAC 上,24-bit/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 bit / 48 kHz)不顯示Android 音量
Bluetooth是手機會重新編碼成 Bluetooth 編解碼器的格式不顯示Android 音量(部分手機會與裝置連動)

DSD 會被轉換成 PCM,但以直接輸出送往支援原生 DSD 的 DAC 時除外。reTONE 使用 DAC 期間,通知等其他 App 的聲音會從內建喇叭播放。當其他 App 開始播放時,reTONE 會把 DAC 交還給 Android。許多 Android 4.x 手機本身無法把 USB DAC 當作音訊輸出,所以 DAC 只能透過直接輸出運作。輕觸播放畫面最下面一行,會開啟訊號路徑畫面。它會針對每個階段(檔案、解碼、取樣率、音量、輸出),依據 reTONE 自己的處理與 Android 回報的資訊,顯示音訊是原樣通過還是被改變。手機 DSP 或 DAC 內部的處理無法顯示。

直接輸出略過了什麼

使用直接輸出時,它略過的是 Android 內部的混音與取樣率轉換。在那之後音訊會經過什麼處理,取決於手機與輸出。

App 交出的音訊,會依下列順序流經 Android。

1. Android 的音訊中樞(AudioFlinger)
在一般的輸出中,這裡的混音器會合併多個 App 的聲音、轉換成手機的輸出取樣率(通常是 48 kHz),並套用音量。直接輸出主要就是略過這個階段:不混音,也不轉換。如果手機的音訊硬體有音量控制,音量就交給硬體處理;如果沒有,則可能在這個階段套用到樣本上(音量最大時,數值不會改變)。

2. 廠商的音訊元件 → 晶片內的音訊處理器(DSP)
在大多數手機上,音訊不會直接送到 DAC,而是先經過晶片內的 DSP,而 DSP 也有自己的處理階段。

  • 針對每條串流的處理(格式轉換、音量)
  • 針對每個輸出的處理(喇叭保護、廠商的音效、限幅器)
  • 最後的輸出階段。每個輸出都有自己的取樣率,如果曲目的取樣率不同,DSP 就會轉換
  • MP3 和 AAC 的「卸載」(offload)由這個 DSP 解碼

3. DAC(內建於晶片,或獨立的 DAC 晶片)
音訊在這裡才第一次變成類比訊號。DAC 內部的數位濾波器(超取樣)在使用 USB DAC 時同樣會經過,因此在討論資料是否被改變時不列入計算。

可以說的事

  • 使用直接輸出時可以確定的是:它略過了 Android 內部的混音與取樣率轉換
  • 如果手機會讓 DSP 的輸出取樣率配合曲目(例如以音樂為考量設計的耳機路徑),DSP 只會整理資料格式再傳下去,因此資料很可能以接近原本的狀態抵達 DAC
  • 在輸出取樣率固定為 48 kHz 的手機上,即使略過了 Android 的轉換,DSP 仍會轉換音訊
  • 喇叭幾乎一定會經過喇叭保護或校正。有些手機在喇叭輸出時也會顯示 DIRECT,但應該假設資料已經被改變
  • 在部分手機上,廠商的音效是在 DSP 內執行的
  • App 無法確認這些事。從 Android 9 起,一般 App 沒有辦法讀取 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 轉換所用濾波器的響應(以與 App 相同的公式計算)。float 輸出的手機(目標 120 dB) 16-bit 輸出的手機(目標 100 dB)
  • 平坦至 20 kHz20 kHz 以下的偏差小於 0.001 dB(計算值)。不會削減任何聽得到的聲音。
  • 阻帶衰減至少 120 dB / 100 dB分別為 float 輸出的手機與 16-bit 輸出的手機的計算值(44.1 kHz → 48 kHz 時約 −122 dB / 約 −102 dB)。以 30 kHz 的輸入訊號實測的混疊(出現在 0–20 kHz 的量,捨入成 16 bit 之前)比原訊號低至少 104.6 dB。
  • 只在重新取樣時 −1 dB為超過 0 dBFS 的樣本間峰值保留餘裕(我們在市售錄音中測到的最高值是 +0.59 dB)。重新取樣的曲目會比沒有重新取樣的曲目小 1 dB。
詳細說明

取樣率轉換會重新計算原始樣本之間的波形,因此濾波器的品質會直接反映在聲音上。reTONE 的濾波器是對 sinc 函數套用 Kaiser 窗所做成的 FIR 濾波器。它採用多相(polyphase)結構,依轉換比例把係數分組,只計算需要的部分。設計建立在兩個準則上:不削減聽得到的聲音,以及充分抑制轉換造成的混疊。

  • 通帶:平坦至 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-bit 輸出的手機(Android 4.x)為 100 dB。濾波器長度與窗函數都以比目標多 2 dB 的餘裕來設計,讓每一種轉換的計算值都超過目標(44.1 → 48 kHz 的計算值約為 122 dB 與約 102 dB)。−100 dB 的殘留混疊遠低於 16 bit 的雜訊底(含抖動在內的全頻帶約 −93 dBFS),因此 100 dB 的衰減在聽感上與 120 dB 沒有差別。
  • 抽頭數:依衰減量與過渡帶,以 Kaiser 窗的公式決定(44.1 ↔ 48 kHz、120 dB 時為 86 個抽頭)。
  • 2:1 階段:像 96 → 48 kHz 這樣剛好減半取樣率的階段,使用半帶(half-band)濾波器,其中一半的係數為零、其餘對稱,乘法次數約為一般濾波器的四分之一。192 → 48 kHz 使用兩個半帶階段,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 bit 之前測量)。這些是單一頻率的數值。依設計,整個阻帶都會被抑制到至少上述的衰減目標。

由於轉換會在原始取樣點之間產生新的點,音量大的曲目可能出現超過 0 dBFS 的點。我們把幾首手上的市售錄音轉成 48 kHz 時,超過 0 dBFS 的點只占總數的 0.0001–0.001%,最大值為 +0.38 到 +0.59 dB。這些點在 16-bit 輸出或手機的混音器中會被削波,所以只有在重新取樣時,reTONE 才會把音量降低 1 dB,在測得的最大值之上留出餘裕。沒有重新取樣的曲目不會被改動,所以在同一支手機上,重新取樣的曲目會小 1 dB。無縫切換到下一首時,重新取樣器的狀態會延續,所以曲目的開頭與結尾不會被處理修剪(自 0.92.57 起)。

音量不在 reTONE 的引擎內套用,而是在 Android 的混音器(AudioTrack 的音量)中套用。如果在引擎內套用,音量的變化要等 AudioTrack 中緩衝的約 500 ms 音訊播完才會生效,音量鍵會感覺反應遲鈍。在 16-bit 輸出的手機上,調低音量會讓 Android 再次捨入成 16 bit(Android 在這個階段不會加入抖動)。

運算以 C 語言寫成,並使用 ARM NEON 指令同時處理左右聲道。濾波器的內層迴圈以向量讀取係數,並用四個累加器來隱藏延遲。包含亂數、捨入、削波與誤差回饋在內的抖動處理,也全部在 NEON 內完成,避免在 NEON 與通用暫存器之間搬移資料(在較舊的核心 Cortex-A9 上這很慢)。Intel(x86)版本使用不含 NEON 的純 C 路徑。下方的負載數字來自我們測試過的 ARM 手機。

你知道嗎?Android 的重新取樣品質由手機廠商決定

Android 中負責轉換取樣率的部分提供好幾種品質等級,從簡單的計算,到用更多運算換取更高精度的較重做法都有。使用哪一種,由手機上的一項設定決定,而這項設定是由手機廠商決定的。

在 Android 5 以上、廠商沒有設定的手機上,會使用中等等級 DYN_MED(Android 4.4 則是最簡單的 LOW)。此外,當同時使用中的重新取樣器的預估負載超過上限時,超出上限的重新取樣器會降到下一個較低的等級(並不會測量實際的 CPU 負載)。在我們檢查過的手機中,兩支 Android 4.4 手機的值設為 4(VERY_HIGH),一支 Android 9 手機沒有設定,因此使用 DYN_MED。也就是說,同一首曲目會因手機不同而得到不同的重新取樣品質。

設定值等級轉換方式(原生 Android)阻帶衰減(設計值)
1LOW在相鄰兩個樣本之間做線性內插;最輕的方式。Android 4.4 未設定時使用沒有專用的濾波器
2MED以相鄰的數個樣本做三次內插沒有專用的濾波器
3HIGH使用 sinc 濾波器原始碼中未載明
4VERY_HIGH使用比 HIGH 更長的濾波器。係數從手機的元件(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-bit 輸出)
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 內部,套用在資料上(數位);② DAC 內部的數位音量,透過 USB 控制;③ 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-bit 整數曲目僅限走整數路徑時)。DAC 內部發生的事無法確認。

原生 DSD

DSF/DFF 曲目
DAC 支援原生 DSD
且其音量可透過 USB 控制
且音量未設為「reTONE adjusts」
且「Sending DSD」設為「Send as DSD」
是以 DSD 送出例:DSD64 → USB AUDIO • DSD64 DIRECT
否轉換成 PCMDSD64 為 88.2 kHz PCM

reTONE 無法改變 DSD 本身的音量,因此 DAC 必須能控制音量。如果 DSD 曲目會斷斷續續,請在「Sending DSD」設定中選擇「Convert to PCM」。不支援 DoP。

詳細說明

只有在 DAC 支援原生 DSD、且其音量可透過 USB 控制(並且該 DAC 未設為「reTONE adjusts」)時,DSF 與 DFF 曲目才會以 DSD 送出,不轉換成 PCM。reTONE 無法更改 DSD 本身的音量,因此需要在 DAC 端控制音量。播放畫面會顯示類似「DSD64 → USB AUDIO • DSD64 DIRECT」的內容。

送出方式如下。

  • 原生 DSD 適用於 USB 描述元中含有原始資料(TYPE I RAW DATA)替代設定的 DAC。
  • DSD 的位元會以每聲道 32-bit 字、每次 4 個位元組封裝,最舊的位元放在最高位。DSF 以 LSB 在前的方式儲存位元,所以封裝之前會先反轉每個位元組內的位元順序。字以大端序(big-endian)送出(與 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 也無法讀取。

DSD 的傳送方式(設定):只有在連接可使用原生 DSD 的 DAC 時,設定的「Sound」下才會出現「Sending DSD」。預設為「Send as DSD」(由 DAC 直接播放 DSD),也可以切換為「Convert to PCM」(由 reTONE 轉換為 PCM)。如果 DSD 曲目會斷音,或你偏好以 PCM 播放,請選擇轉換為 PCM。這項選擇會依 DAC 型號分別記住,切換時會從相同位置重新開啟目前的曲目。我們發現有一款 DAC 在播放調變超過 50% 參考位準的 DSD 錄音時,會短暫斷音。傳輸本身正常,因此推測是 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)。濾波器為 Kaiser 窗 FIR 濾波器。通帶延伸至 20 kHz 與輸出速率四分之一兩者中較大的一方,阻帶從「輸出速率 − 通帶」開始,衰減量在 16 位元輸出時為 100 dB,float 與 USB 時為 110 dB。抽頭數依 Kaiser 窗的公式決定。計算使用 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)。

傳送 PCM 給 USB DAC 時,如果 DAC 支援,reTONE 會直接送出「DSD 速率 ÷ 32」的 PCM(DSD64 為 88.2 kHz,DSD128 為 176.4 kHz,DSD256 為 352.8 kHz),不經第 2 階段的轉換。由於 DSD 已轉換為 PCM,這種情況下不會顯示 DIRECT。

負載

reTONE 在我們 2012 年的測試手機(Android 4.1、2 核心)上,相對於單一核心的 CPU 使用率。

重繪播放畫面(實際播放中)約 2%
直接輸出 CD 音訊(最高時脈)約 2%
將 24-bit/192 kHz 轉換為 44.1 kHz(最高時脈)約 10%
0%50%100%

「重繪播放畫面」是在實際播放中測得,不含解碼。另外兩項是以最高時脈執行與 reTONE 引擎相同的計算,再換算成相對於實際時間的百分比。實際播放時手機會降低時脈,因此手機上顯示的數字看起來會高 2 到 3 倍。

詳細說明

reTONE 的目標是「停止時什麼都不做」以及「螢幕關閉播放時什麼都不畫」。定期處理只在播放時執行:螢幕開啟時每秒一次,關閉時每 5 秒一次;播放畫面上的進度條每 250 ms 只重繪自己。時鐘和電池則依系統的通知更新,不做輪詢。

reTONE 在我們 2012 年的測試手機(Android 4.1、2 核心 Cortex-A9)上,相對於單一核心的 CPU 使用率。

  • 停止時:0%。
  • 螢幕關閉播放時:停止繪圖。以 Android 標準播放的曲目幾乎是 0%;由 reTONE 引擎播放的曲目(Android 4.x 上的 FLAC、WAV 等)則會加上下列解碼與轉換的負載。
  • 顯示播放畫面播放時:約 2%(實際播放中測得;主要是進度條的重繪,不含解碼)。
  • reTONE 引擎將 CD 音訊(16-bit/44.1 kHz)直接以 44.1 kHz 輸出:約 2%。轉換為 48 kHz 輸出:約 4%。
  • 將 24-bit/96 kHz 轉換為 48 kHz:約 5%。轉換為 44.1 kHz:約 7%。
  • 將 24-bit/192 kHz 轉換為 44.1 kHz:約 10%(僅計算)至約 15%(整體播放負載的粗略估計,換算為最高時脈)。
  • 不經轉換將 24-bit/192 kHz 送往 USB DAC:約 20%(實際播放中測得,螢幕開啟,含傳輸執行緒)。

從「CD 音訊」到「24-bit/192 kHz」的引擎數字,是以最高時脈全速執行相同的計算,再換算成相對於實際時間的百分比。實際播放時,手機會把時脈降到 200 MHz 至 1 GHz 之間,因此手機上顯示的數字看起來會高 2 到 3 倍(24-bit/192 kHz 為 20–29%)。程式的寫法也有很大的影響:目前以 C 與 NEON 實作的版本,負載只有早期以 Java 寫成的試作版的約三分之一到五分之一。

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-bit/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-bit/96 kHz FLAC 播放
AQUOS CRYSTALSHARP 305SH4.4.2主要功能、實際操作
URBANO L03KYOCERA KYY234.4.2主要功能、實際操作
Raku-Raku SmartphoneFUJITSU F-06F4.4.2啟動、音樂庫、24-bit/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 bit/192 kHz FLAC 播放、Sound settings(開啟 Sony 的音效設定)
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 A204SO14從 Google 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-bit/96 kHz 不經重新取樣播放
AQUOS PHONE ZETA SH-02EAndroid 4.1Hidizs S9 Pro匯流排供電可用。沒有速度偏移或斷音
Android One X5Android 11Hidizs S9 Pro匯流排供電可用
Xperia PAndroid 4.1OPPO HA-2電池供電可用。24-bit/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-bit/192 kHz 與 44.1 kHz 之間切換在內,皆無斷音
Xperia XA1 PlusAndroid 8.0Hidizs S9 Pro匯流排供電可用

USB DAC 與手機:為什麼結果各不相同

USB DAC 直接輸出的表現,取決於手機與 DAC。手機中擔任 USB 主機的部分(主機控制器)因年代與廠商而異,這些差異在等時傳輸上最為明顯——音訊必須以穩定的速率不間斷地流動。DAC 也各有不同:接收音訊的頻率、回報所需速率的方式,以及電力的來源。reTONE 不依手機型號分別處理,而是在插上時實際量測發生的情況,並加以調整。下表中,musb、EHCI 與 xHCI 已在實機上測試;其他則根據公開的文件。

控制器類型常見問題reTONE 的做法
musb約 2010–2013 年的部分手機(TI、ST-Ericsson、較舊的 MediaTek)傳輸之間的空隙讓 DAC 的資料略為不足(劈啪聲、斷音)量測實際的回傳間隔,多裝一些資料來補足不足的部分
EHCI較舊的 Qualcomm、Tegra、部分 Exynos完成通知成批回傳;如果跟不上,部分資料會被跳過以長期的平均值判斷
DWC2較舊的 Rockchip、部分 Kirin 與 Amlogic 平板未對齊 4 位元組的資料可能造成雜音優先使用 32 位元(4 位元組)的格式
xHCI幾乎所有 USB-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 位元、big-endian),但也有例外。

廠商的音效設定

如果手機有廠商的音效設定畫面,底部選單的「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 本身不播放串流。它的角色只到開啟串流 App 為止,播放和音質取決於該 App 與手機。
  • reTONE 預設完全不使用網路。只有在設定中開啟「Network features」後才會連線,而且只在你要求時或執行你選擇的檢查時連線。分享開啟期間,也會接受你允許的手機連線。reTONE 不收集任何關於你的資料。
  • 不支援從 Android Auto 或 Wear OS 操作。(自 0.87.0 起,支援從通知、Android 的鎖定畫面與 Bluetooth 裝置進行播放操作。)
  • 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 直接輸出期間,其他 App 的聲音不會從 USB DAC 播放,而是從手機的喇叭播放。
  • 使用內建喇叭或耳機孔時,我們無法保證位元完美(bit-perfect)的輸出,因為 App 無法確認手機實際上如何輸出音訊。使用 USB DAC 時,只有在符合條件時才會顯示 BIT-PERFECT。
  • reTONE 不會變更通往手機內建 DAC 的音訊路徑(例如繞過取樣率轉換或強制卸載播放),因為這需要 root 或手機廠商的簽章。
  • 螢幕關閉時,不支援長按音量鍵連續調整,也不支援用音量鍵切換曲目,因為 Android 不會把按鍵傳給 App。
  • 不支援編輯標籤,也不支援刪除或移動檔案。
  • 在 Android 10 以上,USB 隨身碟中的 FLAC、MP3 等曲目不會出現在音樂庫中,因為 Android 不會列出它們。
  • 有些透過錄音串流傳達速率的非同步 USB DAC(隱式回饋)不受支援。音訊可能每隔數十秒到數分鐘就中斷一次。
  • 在 Android 4.0 上,以 Android 播放的格式(例如 MP3 與 AAC)播放時,曲目之間會有短暫的空白(由 reTONE 引擎播放的格式即使在 4.0 上也能無縫播放)。