Android中播放DSD音乐

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_ENDIAN
217
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_LE
235 #elif __BYTE_ORDER == __BIG_ENDIAN
236
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_BE
254 #else
255 #error "Unknown endian"
256 #endif
257 } snd_pcm_format_t;

暂时还不知具体是怎么工作的,是透传DSD数据到硬件?还是alsa-lib中先转换为标准的PCM? 但在Android的alsa-lib中,确实是没有SND_PCM_FORMAT_DSD的定义,应该是被精简掉了。因此只能考虑采用DSD->PCM转换成24bit 176K后,再按照标准的PCM方式来播放。

时间: 2024-10-19 00:54:08

Android中播放DSD音乐的相关文章

如何在Android中播放网络传输过来的AAC音频?

============问题描述============ 如何在Android中播放网络传输过来的AAC音频?每个包都有ADTS头的. ============解决方案1============ 如果是应用的话,直接设置MediaPlayer setDataSource设置为网络音频的uri,然后prepareAsync(), prepare完成后调用start不就可以了吗? framework层的话还是要用aacdecoder进行解码播放,要么用软件解码,要么用硬件解码.

Android中播放Gif图片的方法

Android中播放Gif图片的方法. 主要原理是取出Gif中的每一帧图片,分别设置到ImageView上边展示出来 使用到Code.Google上边的一个开源类库GifDecoder,下载不了的可以从我后边给出的Demo中搬运. 准备一个类继承自ImageView重写其构造方法同时传入一个输入流. [java] view plaincopyprint? <span style="font-size:18px;">public class GifDecoderView ex

Android中播放本地SD卡中歌曲需要的添加的权限

使用MediaPlayer播放本地Mp3文件时,需要注意的访问路径的问题以及访问权限的问题. 1.访问路径:/storage/emulated/0 此路径即为手机的根路径,可以通过下载ES文件浏览器软件查看当前播放的Mp3具体的路径,通过Environment.getExternalStorageDirectory().getPath()获取/storage/emulated/0这个SdCard路径这在组织 void android.media.MediaPlayer.setDataSource

在Android中播放视频的例子

1 xml文件 命名:videoplayer 主Activity命名:VideoActivity 将视频文件放在手机  sdcard/ceshi.3gp  注意视频名字和格式 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" androidrientatio

【Android】播放音频的几种方式介绍

接下来笔者介绍一下Android中播放音频的几种方式,android.media包下面包含了Android开发中媒体类,当然笔者不会依次去介绍,下面介绍几个音频播放中常用的类: 1.使用MediaPlayer播放音频 MediaPlayer的功能很强大,下面附上一张该类封装音频的生命周期图: MediaPlayer支持AAC.AMR.FLAC.MP3.MIDI.OGG.PCM等格式,MediaPlayer可以通过设置元数据和播放源来音频. 1.1播放Raw文件夹下面音频的元数据 //直接创建,不

android音乐播放器开发 SweetMusicPlayer 播放本地音乐

上一篇写了加载歌曲列表,http://blog.csdn.net/huweigoodboy/article/details/39856411,现在来总结下播放本地音乐. 一,MediaPlayer 首先来看看MediaPlayer的生命周期: Idle 状态:当使用new()方法创建一个MediaPlayer对象或者调用了其reset()方法时,该MediaPlayer对象处于idle状态.这两种方法的一个重要差别就是:如果在这个状态下调用了getDuration()等方法(相当于调用时机不正确

Android多媒体框架对音乐播放器的支持

下面介绍一下Andriod多媒体框架对开发者提供的支持有哪些. 1. MediaScannerReceiver 这个广播接收者在接收到ACTION_BOOT_COMPLETED.ACTION_MEDIA_MOUNTED或 ACTION_MEDIA_SCANNER_SCAN_FILE 广播时对SD卡中的图片.音乐和视频文件进行了扫描,因为扫描不能影响用户使用,这里启动了一个服务MediaScannerService,扫描的文件类型如下: /* Audio */ addFileType("MP3&q

android 利用 service 实现音乐播放

今天的播放器利用了service,播放音乐在service端,进度条在activity端,因此主要的工作就是activity和service的交互,本文将利用IBinder进行交互,主要是activity可以调用service的函数,可以参考我的这篇博客. 本文关键点:利用利用IBinder实现activity 控制service 实现功能: 1 控制播放进度: activity调用service的函数,对MediaPlayer进行控制.包括启动时的播放和滑动seekbar时,对MediaPla

Android中的Audio播放:控制Audio输出通道切换

Audio 输出通道有很多,Speaker.headset.bluetooth A2DP等.通话或播放音乐等使用Audio输出过程中,可能发生Audio输出通道的切换.比如,插入有线耳机播放音乐时,声音是从耳机发出的:而此时拔出耳机,Audio输出通道会发生切换.如果音乐播放器不做处理,Audio输出是被切换到扬声器的,声音直接从Speaker发出.我们在编写程序时,要捕获并按照需求来处理这样的事,本文就是讲解如何处理的. Android中可以通过android.media.AudioManag