標籤:android style blog http color for sp 資料 div
Github上有個簡單的Alsa DSD測試程式,可以播放DSD,地址位於:https://github.com/zonque/alsa-dsd-player 細看其代碼,發現有ALSA_FORMAT_SND_PCM_FORMAT_DSD_U8的定義,詳情如下:
#if 1/* 8-bit DSD */#define ALSA_FORMAT SND_PCM_FORMAT_DSD_U8#define SAMPLE_SIZE (sizeof(uint8_t) * 2)#define SAMPLE_RATE_DIV 1#else/* 16-bit DSD */#define ALSA_FORMAT SND_PCM_FORMAT_DSD_U16#define SAMPLE_SIZE (sizeof(uint16_t) * 2)#define SAMPLE_RATE_DIV 2#endif
那麼在Android中能運行這個測試程式嗎?ALSA_FORMAT_SND_PCM_FORMAT_DSD_U8似乎是亮點,之前沒有看到過。嘗試在Android的源碼中尋找它的定義,沒找到。但是在標準的alsa-lib中找到了:
typedef enum _snd_pcm_format {125 SND_PCM_FORMAT_UNKNOWN = -1,127 SND_PCM_FORMAT_S8 = 0,129 SND_PCM_FORMAT_U8,131 SND_PCM_FORMAT_S16_LE,133 SND_PCM_FORMAT_S16_BE,135 SND_PCM_FORMAT_U16_LE,137 SND_PCM_FORMAT_U16_BE,139 SND_PCM_FORMAT_S24_LE,141 SND_PCM_FORMAT_S24_BE,143 SND_PCM_FORMAT_U24_LE,145 SND_PCM_FORMAT_U24_BE,147 SND_PCM_FORMAT_S32_LE,149 SND_PCM_FORMAT_S32_BE,151 SND_PCM_FORMAT_U32_LE,153 SND_PCM_FORMAT_U32_BE,155 SND_PCM_FORMAT_FLOAT_LE,157 SND_PCM_FORMAT_FLOAT_BE,159 SND_PCM_FORMAT_FLOAT64_LE,161 SND_PCM_FORMAT_FLOAT64_BE,163 SND_PCM_FORMAT_IEC958_SUBFRAME_LE,165 SND_PCM_FORMAT_IEC958_SUBFRAME_BE,167 SND_PCM_FORMAT_MU_LAW,169 SND_PCM_FORMAT_A_LAW,171 SND_PCM_FORMAT_IMA_ADPCM,173 SND_PCM_FORMAT_MPEG,175 SND_PCM_FORMAT_GSM,177 SND_PCM_FORMAT_SPECIAL = 31,179 SND_PCM_FORMAT_S24_3LE = 32,181 SND_PCM_FORMAT_S24_3BE,183 SND_PCM_FORMAT_U24_3LE,185 SND_PCM_FORMAT_U24_3BE,187 SND_PCM_FORMAT_S20_3LE,189 SND_PCM_FORMAT_S20_3BE,191 SND_PCM_FORMAT_U20_3LE,193 SND_PCM_FORMAT_U20_3BE,195 SND_PCM_FORMAT_S18_3LE,197 SND_PCM_FORMAT_S18_3BE,199 SND_PCM_FORMAT_U18_3LE,201 SND_PCM_FORMAT_U18_3BE,202 /* G.723 (ADPCM) 24 kbit/s, 8 samples in 3 bytes */203 SND_PCM_FORMAT_G723_24,204 /* G.723 (ADPCM) 24 kbit/s, 1 sample in 1 byte */205 SND_PCM_FORMAT_G723_24_1B,206 /* G.723 (ADPCM) 40 kbit/s, 8 samples in 3 bytes */207 SND_PCM_FORMAT_G723_40,208 /* G.723 (ADPCM) 40 kbit/s, 1 sample in 1 byte */209 SND_PCM_FORMAT_G723_40_1B,210 /* Direct Stream Digital (DSD) in 1-byte samples (x8) */211 SND_PCM_FORMAT_DSD_U8,212 /* Direct Stream Digital (DSD) in 2-byte samples (x16) */213 SND_PCM_FORMAT_DSD_U16_LE,214 SND_PCM_FORMAT_LAST = SND_PCM_FORMAT_DSD_U16_LE,215 216 #if __BYTE_ORDER == __LITTLE_ENDIAN217 218 SND_PCM_FORMAT_S16 = SND_PCM_FORMAT_S16_LE,220 SND_PCM_FORMAT_U16 = SND_PCM_FORMAT_U16_LE,222 SND_PCM_FORMAT_S24 = SND_PCM_FORMAT_S24_LE,224 SND_PCM_FORMAT_U24 = SND_PCM_FORMAT_U24_LE,226 SND_PCM_FORMAT_S32 = SND_PCM_FORMAT_S32_LE,228 SND_PCM_FORMAT_U32 = SND_PCM_FORMAT_U32_LE,230 SND_PCM_FORMAT_FLOAT = SND_PCM_FORMAT_FLOAT_LE,232 SND_PCM_FORMAT_FLOAT64 = SND_PCM_FORMAT_FLOAT64_LE,234 SND_PCM_FORMAT_IEC958_SUBFRAME = SND_PCM_FORMAT_IEC958_SUBFRAME_LE235 #elif __BYTE_ORDER == __BIG_ENDIAN236 237 SND_PCM_FORMAT_S16 = SND_PCM_FORMAT_S16_BE,239 SND_PCM_FORMAT_U16 = SND_PCM_FORMAT_U16_BE,241 SND_PCM_FORMAT_S24 = SND_PCM_FORMAT_S24_BE,243 SND_PCM_FORMAT_U24 = SND_PCM_FORMAT_U24_BE,245 SND_PCM_FORMAT_S32 = SND_PCM_FORMAT_S32_BE,247 SND_PCM_FORMAT_U32 = SND_PCM_FORMAT_U32_BE,249 SND_PCM_FORMAT_FLOAT = SND_PCM_FORMAT_FLOAT_BE,251 SND_PCM_FORMAT_FLOAT64 = SND_PCM_FORMAT_FLOAT64_BE,253 SND_PCM_FORMAT_IEC958_SUBFRAME = SND_PCM_FORMAT_IEC958_SUBFRAME_BE254 #else255 #error "Unknown endian"256 #endif257 } snd_pcm_format_t;
暫時還不知具體是怎麼工作的,是透傳DSD資料到硬體?還是alsa-lib中先轉換為標準的PCM? 但在Android的alsa-lib中,確實是沒有SND_PCM_FORMAT_DSD的定義,應該是被精簡掉了。因此只能考慮採用DSD->PCM轉換成24bit 176K後,再按照標準的PCM方式來播放。
Android中播放DSD音樂