难以将原始的PCM输出代码从Java移植到Android AudioTrack API

我试图将从Java SE播放chiptunes(NSF,SPC等)音乐文件的应用程序移植到Android。 Android API似乎缺less这个应用程序用于输出原始PCMaudiojavax多媒体类。 我在API中find的最接近的模拟是AudioTrack,所以我一直在摔跤。

但是,当我尝试通过正在运行的端口来运行我的一个示例音乐文件时,我所得到的只是静态的。 我的怀疑是这是我设置的AudioTrack,这是错误的。 我尝试了各种不同的构造函数,但最终都输出了静态的。

原始代码中的DataLine设置如下所示:

AudioFormat audioFormat = new AudioFormat( AudioFormat.Encoding.PCM_SIGNED, 44100, 16, 2, 4, 44100, true ); DataLine.Info lineInfo = new DataLine.Info( SourceDataLine.class, audioFormat ); DataLine line = (SourceDataLine)AudioSystem.getLine( lineInfo ); 

我现在使用的构造函数是:

 AudioTrack = new AudioTrack( AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT, AudioTrack.getMinBufferSize( 44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT ), AudioTrack.MODE_STREAM ); 

我已经用常量和variablesreplace了常量和variables,所以它们尽可能简洁明了,但是我的基本问题是,当我从一种格式转到另一种格式时,是否存在明显的问题。

Solutions Collecting From Web of "难以将原始的PCM输出代码从Java移植到Android AudioTrack API"

所以今天我有一点时间来看这个,我想我已经把它弄明白了。 上面第一个代码示例中的AudioFormat声明将big endian参数设置为“true”,但Android AudioTrack期望PCM数据采用小端格式。

所以我写了一个快速的小循环来testing我的直觉:

  for( int i = 0; i + LEN_PCM_SAMPLE_BYTES < LEN_PCM_BUFFER; i += LEN_PCM_SAMPLE_BYTES ) { // Really rude endian conversion. byte bytTemp = a_bytBuffer[i]; a_bytBuffer[i] = a_bytBuffer[i + 1]; a_bytBuffer[i + 1] = bytTemp; } 

基本上,这个循环翻转缓冲区中每个(16位)采样的字节。 这样做效果很好,除了它有点波动,因为效率非常低。 我尝试使用ByteBuffer,但似乎并没有翻转个别示例中的字节。

我会更好地向前看,但这里的基本问题已经解决了。 希望别人认为这有用!